Giải thích __all__ trong Python?
Nội dung chính
- Không gì __all__làm gì?
- Công cụ tài liệu
- __init__.py làm cho một thư mục một gói Python
- Quản lý API:
- __all__ trong __init__.py
- Tiền tố _so với __all__:
- Khi tránh __all__có ý nghĩa
- Một exportngười trang trí
Tôi tiếp tục nhìn thấy các biến
9được thiết lập trong cácfrom module import * # imports foo and Bar
0tập tin khác nhau .package/ |-__init__.py # makes directory a Python package |-module_1.py |-module_2.py
9được thiết lập trong cácfrom module import * # imports foo and Bar
0tập tin khác nhau .package/ |-__init__.py # makes directory a Python package |-module_1.py |-module_2.py
Cái này làm gì
Không gì __all__làm gì?
Công cụ tài liệuNếu có tên
from module import * # imports foo and Bar
9, người dùng sẽ sử dụng nó và họ có thể mong đợi rằng nó sẽ không thay
đổi.__init__.py làm cho một thư mục một gói Python
package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
2
package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
Quản lý API:trong một mô-đun, ví dụ
package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
4:__all__ = ['foo', 'Bar']
__all__ trong __init__.py
package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
2từ mô-đun, chỉ những tên trong tên from module import * # imports foo and Bar
9được nhập:from module import * # imports foo and Bar
Công cụ tài liệu
__init__.py làm cho một thư mục một gói Python
from module import * # imports foo and Bar
9để xác định tên nào sẽ hiển thị khi có sẵn từ một mô-đun.__init__.py làm cho một thư mục một gói Python
Quản lý API:tài liệu :
__all__ trong __init__.py
0tệp được yêu cầu để làm cho Python coi các thư mục là các gói chứa; điều này được thực hiện để ngăn các thư mục có tên chung, chẳng hạn như chuỗi, vô tình ẩn các mô-đun hợp lệ xảy ra sau này trên đường dẫn tìm kiếm mô-đun.package/ |-__init__.py # makes directory a Python package |-module_1.py |-module_2.py
Tiền tố _so với __all__:
0có thể chỉ là một tệp trống, nhưng nó cũng có thể thực thi mã khởi tạo cho gói hoặc đặtpackage/ |-__init__.py # makes directory a Python package |-module_1.py |-module_2.py
9biến.from module import * # imports foo and Bar
Khi tránh __all__có ý nghĩa
package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
0có thể tuyên bố
from module import * # imports foo and Bar
9cho một gói .Quản lý API:
__all__ trong __init__.py
package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
0tệp. Tệp đó là thứ làm cho thư mục trở thành một gói Python thực sự. Ví dụ: giả sử bạn có những điều sau đây: package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
Tiền tố _so với __all__:
package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
0bạn viết:from module_1 import *
from module_2 import *
Khi tránh __all__có ý nghĩa
from module_1 import *
from module_2 import *
5bạn có:__all__ = ['foo',]
Một exportngười trang trí
from module_1 import *
from module_2 import *
6bạn có:__all__ = ['Bar',]
Tôi tiếp tục nhìn thấy các biến
9được thiết lập trong các from module import * # imports foo and Bar
0tập tin khác nhau . package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
import package
package.foo[]
package.Bar[]
Cái này làm gì
from module_1 import *
from module_2 import *
7không gian tên.__all__ trong __init__.py
Tiền tố _so với __all__:Vì vậy, bạn làm như sau:
package/
|-__init__.py
|-module_1/
| |-__init__.py
| |-foo_implementation.py
|-module_2/
|-__init__.py
|-Bar_implementation.py
Khi tránh __all__có ý nghĩa
package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
0bạn khai báo một from module import * # imports foo and Bar
9, ví dụ như trong module_1:from foo_implementation import *
__all__ = ['foo']
Một exportngười trang trí
package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
0:from Bar_implementation import *
__all__ = ['Bar']
Tôi tiếp tục nhìn thấy các biến
9được thiết lập trong các from module import * # imports foo and Bar
0tập tin khác nhau .Nếu bạn muốn thêm tên mới vào API, bạn chỉ cần cập nhật package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
0, ví dụ như trong mô-đun_2:from module import * # imports foo and Bar
0Cái này làm gì
__all__ = ['foo',]
2trong API cấp cao nhất, ở cấp cao nhất
package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
0bạn có thể có:from module import * # imports foo and Bar
1Nó tuyên bố các tên "công khai" về mặt ngữ nghĩa từ một mô-đun. Nếu có tên
9, người dùng sẽ sử dụng nó và họ có thể mong đợi rằng nó sẽ không thay đổi.from module import * # imports foo and Bar
__all__ = ['foo',]
2, họ có thể sử dụng nó:from module import * # imports foo and Bar
2Nó cũng sẽ có ảnh hưởng đến chương trình:pydoc ] sẽ không thông báo cho họ.
9trong một mô-đun, ví dụ from module import * # imports foo and Bar
4: package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
__all__ = ['foo',]
2sẵn sàng cho giờ chính:from module import * # imports foo and Bar
3Tiền tố _so với __all__:
Khi tránh __all__có ý nghĩa
__all__ = ['foo',]
6. Bạn chắc chắn có thể dựa vào cơ chế này. Một số gói trong thư viện chuẩn của Python, trên thực tế, làm
dựa vào điều này, nhưng để làm như vậy, họ bí danh nhập khẩu của họ, ví dụ, trong __all__ = ['foo',]
7:from module import * # imports foo and Bar
4Một exportngười trang trí
__all__ = ['foo',]
6quy ước có thể thanh lịch hơn vì nó loại bỏ sự dư thừa của việc đặt tên một lần nữa. Nhưng nó bổ sung thêm sự dư thừa cho hàng nhập khẩu [nếu bạn có rất nhiều trong số đó] và rất dễ quên làm điều này một cách nhất quán - và điều cuối
cùng bạn muốn là phải hỗ trợ vô hạn một cái gì đó mà bạn dự định chỉ là một chi tiết thực hiện, chỉ là bởi vì bạn đã quên tiền tố một __all__ = ['foo',]
6khi đặt tên hàm.Tôi tiếp tục nhìn thấy các biến
9được thiết lập trong các from module import * # imports foo and Bar
0tập tin khác nhau . package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
from module import * # imports foo and Bar
9sớm trong vòng đời phát triển của mình cho các mô-đun để những người khác có thể sử dụng mã của tôi biết họ nên sử dụng cái gì và không sử dụng.Cái này làm gì
from module import * # imports foo and Bar
9.Khi tránh __all__có ý nghĩa
Một exportngười trang trí
__all__ = ['foo',]
6quy ước tiền tố thay cho from module import * # imports foo and Bar
9khi:- Tôi tiếp tục nhìn thấy các biến
9được thiết lập trong cácfrom module import * # imports foo and Bar
0tập tin khác nhau .package/ |-__init__.py # makes directory a Python package |-module_1.py |-module_2.py
- Cái này làm gì
Một exportngười trang trí
Tôi tiếp tục nhìn thấy các biến
9được thiết lập trong các from module import * # imports foo and Bar
0tập tin khác nhau . package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
from module import * # imports foo and Bar
9là bạn phải viết tên của các hàm và lớp được xuất hai lần - và thông tin được tách biệt khỏi các định nghĩa. Chúng ta có thể sử dụng một trang trí để giải quyết vấn đề này.
Cái này làm gìViệc triển khai này dường như hoạt động tốt trong nhà nhập khẩu truyền thống của CPython. Nếu bạn có một móc hoặc hệ thống nhập khẩu đặc biệt, tôi không đảm bảo, nhưng nếu bạn chấp nhận nó, việc rút lui khá đơn giản - bạn sẽ chỉ cần thêm tên thủ công vào
from module import * # imports foo and Bar
9Vì vậy, trong ví dụ, một thư viện tiện ích, bạn sẽ xác định trình trang trí:
from module import * # imports foo and Bar
5và sau đó, nơi bạn sẽ xác định một
9, bạn làm điều này:from module import * # imports foo and Bar
from module import * # imports foo and Bar
9, bạn làm điều này:from module import * # imports foo and Bar
6Và điều này hoạt động tốt cho dù chạy như chính hoặc nhập bởi chức năng khác.
from module import * # imports foo and Bar
7Và việc cung cấp API
2cũng sẽ hoạt động: package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
package/
|-__init__.py # makes directory a Python package
|-module_1.py
|-module_2.py
2cũng sẽ hoạt động:from module import * # imports foo and Bar
8135 hữu ích 2 bình luận chia sẻ 2 bình luận chia sẻ