Hướng dẫn python __all__ - python __all__

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

from module import *               # imports foo and Bar
9được thiết lập trong các
 package/
   |-__init__.py # makes directory a Python package
   |-module_1.py
   |-module_2.py
0tập tin khác nhau .
from module import *               # imports foo and Bar
9được thiết lập trong các
 package/
   |-__init__.py # makes directory a Python package
   |-module_1.py
   |-module_2.py
0tập tin khác nhau .

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

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

 package/
   |-__init__.py # makes directory a Python package
   |-module_1.py
   |-module_2.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.

Tiền tố _so với __all__:

 package/
   |-__init__.py # makes directory a Python package
   |-module_1.py
   |-module_2.py
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 đặt
from module import *               # imports foo and Bar
9biến.

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

from module import *               # imports foo and Bar
9được thiết lập trong các
 package/
   |-__init__.py # makes directory a Python package
   |-module_1.py
   |-module_2.py
0tập tin khác nhau .

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

from module import *               # imports foo and Bar
9được thiết lập trong các
 package/
   |-__init__.py # makes directory a Python package
   |-module_1.py
   |-module_2.py
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
0, ví dụ như trong mô-đun_2:

from module import *               # imports foo and Bar
0

Cá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
1

Nó 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

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.
__all__ = ['foo',]
2, họ có thể sử dụng nó:

from module import *               # imports foo and Bar
2

Nó cũng sẽ có ảnh hưởng đến chương trình:pydoc ] sẽ không thông báo cho họ.

from module import *               # imports foo and Bar
9trong một mô-đun, ví dụ
 package/
   |-__init__.py # makes directory a Python package
   |-module_1.py
   |-module_2.py
4:
__all__ = ['foo',]
2sẵn sàng cho giờ chính:

from module import *               # imports foo and Bar
3

Tiề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
4

Mộ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

from module import *               # imports foo and Bar
9được thiết lập trong các
 package/
   |-__init__.py # makes directory a Python package
   |-module_1.py
   |-module_2.py
0tập tin khác nhau .
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
    from module import *               # imports foo and Bar
    9được thiết lập trong các
     package/
       |-__init__.py # makes directory a Python package
       |-module_1.py
       |-module_2.py
    0tập tin khác nhau .
  • 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

from module import *               # imports foo and Bar
9được thiết lập trong các
 package/
   |-__init__.py # makes directory a Python package
   |-module_1.py
   |-module_2.py
0tập tin khác nhau .
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
9

Vì 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
5

và sau đó, nơi bạn sẽ xác định một

from module import *               # imports foo and Bar
9, bạn làm điều này:
from module import *               # imports foo and Bar
9, bạn làm điều này:

from module import *               # imports foo and Bar
6

Và đ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
7

Và việc cung cấp API

 package/
   |-__init__.py # makes directory a Python package
   |-module_1.py
   |-module_2.py
2cũng sẽ hoạt động:
 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
8

135 hữu ích 2 bình luận chia sẻ 2 bình luận chia sẻ

Bài Viết Liên Quan

Chủ Đề