Tôi đang sử dụng Python 3.5.1. Tôi đọc tài liệu và các gói phần ở đây: https://docs.python.org/3/tutorial/modules.html#packagesCó phải __init__.py không bắt buộc đối với các gói trong Python 3 không?
Bây giờ, tôi có cơ cấu như sau:
/home/wujek/Playground/a/b/module.py
module.py
:
class Foo:
def __init__(self):
print('initializing Foo')
Bây giờ, trong khi ở /home/wujek/Playground
:
~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>
Tương tự, bây giờ ở nhà, thư mục chính của Playground
:
~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>
Thực ra, tôi có thể làm tất cả các loại công cụ:
~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b
Tại sao công việc này? Tôi có cần phải có các tệp __init__.py
(các tệp trống sẽ hoạt động) trong cả hai a
và b
cho module.py
để có thể nhập khi đường dẫn Python trỏ đến thư mục Playground
?
này dường như đã thay đổi từ Python 2.7:
~ $ PYTHONPATH=Playground python
>>> import a
ImportError: No module named a
>>> import a.b
ImportError: No module named a.b
>>> import a.b.module
ImportError: No module named a.b.module
Với __init__.py
trong cả ~/Playground/a
và ~/Playground/a/b
nó hoạt động tốt.
Tôi sẽ đọc các tài liệu, nhưng đó là một chút dài. Có thể tóm tắt nhanh chóng không?Bạn có thể chỉ cho tôi biết: nó vẫn hỗ trợ __init__.py, hoặc hoàn toàn bỏ qua chúng? Nếu nó hỗ trợ họ, sự khác biệt trong chức năng là gì và tại sao tính nhị nguyên này? – wujek
Có, nó vẫn hoạt động. Vì vậy, tất cả các gói Python 2 của bạn với các tập tin '__init __. Py' sẽ làm việc về mặt nhập khẩu (khác biệt khác giữa Python 2 và 3 không được xem xét ở đây). –
Vì vậy, hướng dẫn có lẽ nên được cập nhật. Là một lỗi tài liệu mở ra cho nó? –