Khi project lớn, cần import code từ file/package khác. Python hỗ trợ 2 kiểu import.
Cơ chế tìm kiếm import
- Cache
sys.modules. - Built-in modules.
- Thư mục trong
sys.path(thư mục script hiện tại đầu tiên). - Bind tên vào local scope.
- Không tìm thấy →
ModuleNotFoundError.
Thứ tự import (PEP 8)
- Standard library (
os, sys, json...) - Third-party (
numpy, requests, pandas...) - Local application (
from myapp import ...)
Absolute Import (Khuyên dùng)
Đường dẫn đầy đủ từ root package.
# Cấu trúc: # myproject/ # packageA/ # moduleA1.py # moduleA2.py (chứa hàm myfunc) # Trong file bất kỳ: from packageA.moduleA2 import myfunc # Hoặc import packageA.moduleA2 packageA.moduleA2.myfunc()
- Rõ ràng, dễ đọc, không ambigu.
- Có thể dài nếu package nested sâu.
Relative Import (Chỉ trong package)
Đường dẫn tương đối từ file hiện tại. Dấu chấm: . = package hiện tại, .. = parent package.
# Cấu trúc: # myproject/ # packageA/ # moduleA1.py # packageB/ # moduleB1.py (muốn import moduleA1) # Trong moduleB1.py: from ..packageA import moduleA1 # .. = lên myproject, rồi vào packageA
- Ngắn gọn, di chuyển project dễ dàng (refactor).
- Rủi ro: ambiguous nếu cấu trúc thay đổi, không chạy được file trực tiếp (
python moduleB1.pylỗi).
Khi nào dùng cái nào?
| Tình huống | Khuyên dùng |
|---|---|
| Code chính, script, entry point | Absolute import |
| Trong package, module sibling/parent | Relative import (1-2 level) |
| Package sâu, nhiều cấp | Absolute import cho rõ ràng |
| Circular import risk | Relative import có thể giúp |
Kết luận
Mặc định dùng absolute import. Dùng relative import trong package nội bộ, giới hạn 1-2 cấp. Luôn tuân thủ PEP 8.