2016-01-23 27 views
5

Giả sử tôi có:Python 3 không cần __init__.py trong tình huống này?

src/ 
    __init__.py 
    a.py 
b.py 

Giả sử __init__.py là một tập tin rỗng, và a.py chỉ là một dòng:

TESTVALUE = 5 

Giả sử b.py là:

from src import a 

print(a.TESTVALUE) 

Bây giờ trong cả hai Python 2.7 và Python 3.x, chạy b.py cho kết quả (5).

Tuy nhiên, nếu tôi xóa các tập tin __init__.py, b.py vẫn hoạt động trong Python 3.x, nhưng trong Python 2.7, tôi nhận được thông báo lỗi:

Traceback (most recent call last): 
    File "b.py", line 5, in <module> 
    from src import a 
ImportError: No module named src 

Tại sao Python 2.7 thể hiện hành vi khác nhau trong tình huống này?

Trả lời

8

Python 3 hỗ trợ namespace packages hoạt động mà không cần tệp __init__.py. Hơn nữa, các gói này có thể được phân phối trên một số thư mục. Điều này có nghĩa là tất cả các thư mục trên sys.path của bạn có chứa các tệp *.py sẽ được nhận dạng là các gói.

Điều này phá vỡ tính tương thích ngược trong Python 3 về mặt nhập khẩu. Một vấn đề điển hình là một thư mục trong thư mục làm việc hiện tại của bạn có tên giống như một thư viện như numpy và có chứa các tệp Python. Trong khi Python 2 bỏ qua thư mục này, Python 3 sẽ tìm nó trước và cố gắng nhập thư viện từ đó. Điều này đã cắn tôi nhiều lần.

Các vấn đề liên quan