Việc nhập tương đối trong Python không còn được khuyến khích nhiều nữa, nhưng việc sử dụng Absolute_import được đề xuất trong trường hợp đó.
Vui lòng xem cuộc thảo luận này trích dẫn Guido:
"Đây không phải chủ yếu là lịch sử sao? Cho đến khi cú pháp nhập tương đối mới được triển khai, đã có nhiều vấn đề khác nhau với nhập tương đối. Giải pháp ngắn hạn là khuyến nghị không sử dụng chúng. Giải pháp dài hạn là triển khai một cú pháp rõ ràng. Bây giờ Đã đến lúc rút lại lời đề nghị chống đối. Tất nhiên, không quá đà - tôi vẫn thấy chúng là một hương vị có được; nhưng chúng có vị trí của mình. "
OP liên kết chính xác PEP 328 cho biết:
Một số trường hợp sử dụng đã được trình bày, trong đó quan trọng nhất là có thể sắp xếp lại cấu trúc của các gói lớn mà không cần phải chỉnh sửa các gói con. Ngoài ra, một mô-đun bên trong một gói không thể dễ dàng tự nhập nếu không nhập tương đối.
Cũng xem câu hỏi gần như trùng lặp Khi nào hoặc tại sao sử dụng nhập tương đối trong Python
Tất nhiên nó vẫn là một vấn đề của hương vị. Mặc dù việc di chuyển mã dễ dàng hơn với các lần nhập tương đối, nhưng điều đó cũng có thể làm hỏng mọi thứ một cách bất ngờ; và đổi tên hàng nhập khẩu không khó lắm.
Để buộc hành vi mới từ PEP 328, hãy sử dụng:
from __future__ import absolute_import
Trong trường hợp này, việc nhập tương đối ngầm định sẽ không thể thực hiện được nữa (ví dụ: import localfile
sẽ không hoạt động nữa from . import localfile
). Đối với hành vi bằng chứng rõ ràng và trong tương lai, bạn nên sử dụng Absolute_import.
Một lưu ý quan trọng là do PEP 338 và PEP 366 , quá trình nhập tương đối yêu cầu tệp python phải được nhập dưới dạng mô-đun - bạn không thể thực thi tệp.py có phép nhập tương đối hoặc bạn sẽ nhận được ValueError: Attempted relative import in non-package
.
Hạn chế này cần được tính đến khi đánh giá cách tiếp cận tốt nhất. Guido chống lại việc chạy các tập lệnh từ một mô-đun trong mọi trường hợp:
Tôi là -1 về điều này và về bất kỳ khúc mắc được đề xuất nào khác của máy __main__. Trường hợp sử dụng duy nhất dường như đang chạy các tập lệnh tình cờ nằm bên trong thư mục của mô-đun, mà tôi luôn coi là phản vật chất. Để khiến tôi thay đổi quyết định, bạn phải thuyết phục tôi rằng không phải vậy.
Các cuộc thảo luận sâu sắc về vấn đề này có thể được tìm thấy trên SO; lại. Python 3 khá toàn diện:
from _ import ...
, vì vậy các ví dụ của bạn sẽ làfrom .. import A
vàfrom . import B