Nếu chính Guido thông báo rằng quy ước miền ngược phải được tuân theo, nó sẽ không được chấp nhận, trừ khi có những thay đổi đáng kể trong việc thực hiện import
trong python.
Xem xét: python tìm kiếm đường dẫn nhập tại thời gian chạy với thuật toán không nhanh; java tìm kiếm một đường dẫn với thuật toán đầy đủ ở cả thời gian biên dịch và thời gian chạy. Đi trước, cố gắng sắp xếp thư mục của bạn như thế này:
folder_on_path/
com/
__init__.py
domain1/
module.py
__init__.py
other_folder_on_path/
com/
__init__.py
domain2/
module.py
__init__.py
Sau đó thử:
from com.domain1 import module
from com.domain2 import module
Chính xác là một trong những tuyên bố sẽ thành công. Tại sao? Bởi vì folder_on_path
hoặc other_folder_on_path
cao hơn trên đường dẫn tìm kiếm. Khi python thấy from com.
, nó lấy gói com
đầu tiên có thể. Nếu điều đó xảy ra có chứa domain1
, thì import
đầu tiên sẽ thành công; nếu không, nó sẽ ném một số ImportError
và bỏ cuộc. Tại sao? Bởi vì import
phải xảy ra trong thời gian chạy, có khả năng ở bất kỳ điểm nào trong luồng mã (mặc dù thường xuyên nhất ở đầu). Không ai muốn một cây đi bộ đầy đủ tại thời điểm đó để xác minh rằng không có trận đấu có thể. Nó giả định rằng nếu nó tìm thấy một gói có tên là com
, nó là góicom
.
Hơn nữa, trăn không phân biệt giữa những điều khoản sau đây:
from com import domain1
from com.domain1 import module
from com.domain1.module import variable
Khái niệm về xác minh rằng com
là cáccom
sẽ là khác nhau trong từng trường hợp. Trong java, bạn thực sự chỉ phải đối phó với trường hợp thứ hai, và điều đó có thể được thực hiện bằng cách đi qua hệ thống tệp (tôi đoán một lợi thế của việc đặt tên các lớp và các tệp giống nhau). Trong python, nếu bạn cố gắng thực hiện nhập không có gì ngoài hỗ trợ hệ thống tệp, trường hợp đầu tiên có thể (gần như) trong suốt (init .py sẽ không chạy), trường hợp thứ hai có thể được thực hiện, nhưng bạn sẽ mất hoạt động ban đầu của module.py, nhưng trường hợp thứ ba hoàn toàn không thể đạt được. Mã phải thực thi cho variable
để có sẵn. Và đây là một điểm chính: import
thực hiện nhiều hơn việc giải quyết các không gian tên, nó thực thi mã.
Bây giờ, bạn thể nhận được ngay với điều này nếu mỗi gói python bao giờ phân phối đòi hỏi một quá trình cài đặt mà tìm kiếm các thư mục com
, và sau đó là domain
, và vân vân và vân vân, nhưng điều này làm cho bao bì đáng kể khó khăn hơn, phá hủy khả năng kéo-và-thả, và làm cho bao bì và tất cả-ra phiền toái.
từ mô-đun nhập com.domain1 như d1m # v.v. –
Điểm tốt về nhiều gói 'com' trong các thư mục đường dẫn khác nhau - Tôi chỉ xem xét các vấn đề chia sẻ một gói cha, nhưng các gói riêng biệt cùng tên thậm chí còn tồi tệ hơn. –
Tìm kiếm Java các lớp trong thời gian chạy, không chỉ ở thời gian biên dịch, sử dụng cấu trúc thư mục. Nó được liên kết động. – Marian