Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Import submodule trong python
Module là một thành phần quan trọng trong Python. Một library thực chất cũng chính là một module, một application của bạn khi viết bằng Python cũng là một module.
Theo thời gian, khi số file trong module tăng lên, module của bạn sẽ trở nên phức tạp với nhiều submodule, và source code trong các submodule cũng cần import đến nhau, hoặc trong một file source code, bạn cũng muốn import tới nhiều module.
Vậy bạn sẽ tổ chức việc import các module như nào để dễ quản lý và tránh bị nhầm lẫn.
Bài viết này khuyến nghị một style mà tôi cho rằng nên sử dụng khi viết python module.
TL;DR Trong một file, khi import các module, thứ tự của các import nên được tổ chức như sau
import built-in modules
import 3rd party libraries modules
import current library modules
import same level modules
Module ví dụ
Giả sử rằng bạn muốn tạo một module với tênawesome
.
Bạn cũng muốn tạo một thư mục tests
cho module này
Chúng ta sẽ xem xét cách làm việc với module này.
Các tổ chức module
/<thư mục gốc chứa toàn bộ source code của module>
awesome/
tests/
.gitignore
Chú ý: Tôi đặt thư mục tests
ở cùng level với thư mục awesome
. Cấu trúc của thư mục test
là hoàn toàn giống với cấu trúc của thư mục awesome
. Tức là, nếu bên awesome
, có file awesome/models/business/user.py
, file test tương ứng cho file này sẽ được nằm ở tests/models/business/user.py
.
Bây giờ, nếu trong awesome
, tôi có 2 submodules: models
and services
, và mỗi file trong services
sẽ cần import các file từ models
. Đồng thời các file trong models
đếu được kế thừa từ file awesome/models/base_model.py
awesome/
__init__.py
models/
__init__.py
base_model.py
user.py
services/
__init__.py
create_user.py
Cụ thể file awesome/models/base_model.py
như sau
class BaseModel(object):
# some logic in here
File awesome/models/user.py
muốn import BaseModel
sẽ import như sau
# file awesome/models/user.py
from base_model import BaseModel
class User(BaseModel):
pass
Chú ý, vì awesome/models/user.py
là cùng level với awesome/models/base_model.py
nên khi import, ta import bằng đoạn code
from base_model import BaseModel
. Cách import này được gọi là relative import. Để tránh việc python nhầm lẫn relative module của bạn với các builtin module, tôi khuyên các bạn nên đặt tên module của bạn không trùng với các buitin module.
Nếu chúng ta muốn đưa class User từ awesome/models/user.py
ra moduleawesome/models
, trong file awesome/models/__init__.py
ta chỉnh sửa như sau:
# file awesome/models/__init__.py
from base_model import BaseModel
from user import User
Bây giờ, trong file awesome/services/create_user.py
, nếu chúng ta cần import class User từ awesome/models/user.py
, chúng ta sẽ import như sau
# file awesome/services/create_user.py
from awesome.models import User
class CreateUserServices(object):
def execute(self):
user = User.find_user()
# logic go here
Giờ, nếu như file create_user.py
cần import những thư việc khác. Ví dụ như thư viện random để sinh ra một random share key, thư viện celery để run một background process, hoặc cần import class BaseService
từ file awesome/services/base.py
thì việc import vào nên tổ chức như nào
Sau đây là thứ tự mà tôi đề nghị các bạn nên sử dụng
import random # builtin libraries
from celery import task # 3rd party libaries
from awesome.models import User # current library package
from base import BaseService # current same level package
Lại một lần nữa, chú ý trong một file, khi import các module, thứ tự của các import nên được tổ chức như sau
import built-in modules
import 3rd party libraries modules
import current library modules
import same level modules







