Import submodule trong python
Python
40
White

kiennt viết ngày 19/06/2015

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
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

kiennt

30 bài viết.
267 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
91 18
Mọi chuyện bắt đầu từ nắm 2013 trong quá trình xây dựng chức năng login với Facebook, tôi đã tìm ra một cách để tấn công vào các hệ thống login với...
kiennt viết 2 năm trước
91 18
White
50 4
Trong tuần vừa rồi, mình có đọc chương 7 cuốn sách (Link). Bài viết này nhằm mục đích giúp mình tổng hợp lại những kiến thức đã học được về chương ...
kiennt viết 2 tháng trước
50 4
White
29 5
1. Đặt vấn đề Một trong các vấn đề của một hệ thống backend là bài toán điều phối request tới các nguồn dữ liệu. Xét bài toán với một hệ thống bl...
kiennt viết gần 2 năm trước
29 5
Bài viết liên quan
White
1 0
Mở đầu Như đã nói ở bài trước, mình đang nghiên cứu về Spark nên cần log lại một số thứ để dành sau này dùng đến :smile: Đối tượng hướng đến vẫn ...
Phạm Quốc Thắng viết hơn 2 năm trước
1 0
White
5 3
Observer pattern (python example) 1. Observer là gì : Theo như (Link) Observer Pattern là : A software design pattern in which an object, calle...
Khôi Trọng Nguyễn viết gần 2 năm trước
5 3
White
0 0
Web Framework Flask định nghĩa route bằng annotations kiểu như @route('/users/add', methods='GET']) def user_add(): pass Lợi thế của cách là...
studybot viết gần 3 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
30 bài viết.
267 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!