2012-09-20 53 views
5

Tôi sử dụng __init__.py để chạy séc khi tôi làm from myprojects.something import blabla.cách sử dụng __init__.py

Hôm nay tôi bắt đầu sử dụng pyzmq và tôi muốn xem điều gì đang diễn ra đằng sau hậu trường. Vì vậy, tôi duyệt mã trong github và tôi tìm thấy (đối với tôi) một số cách sử dụng kỳ lạ của __init__.py ở đó mà tôi không thể giải thích bản thân mình.

Ví dụ: zmq/core/__init__.py. Điểm bổ sung trong số zmq.core.__all__ giá trị zmq.core.constants, zmq.core.error, zmq.core.message, etc. của __all__ là gì?

Trong zmq/__init__.py tôi nhìn thấy ở phần cuối

__all__ = ['get_includes'] + core.__all__ 

nơi get_includes là một chức năng cơ bản mà trả về một danh sách với các thư mục của các mô-đun và thư mục utils trong thư mục cha.

Điểm của điều đó là gì? Điều gì đã __init.py__ đạt được bằng cách làm điều đó?

Trả lời

11

__all__ là khi ai đó làm from module import * như được ghi lại here.

Giải pháp duy nhất là để tác giả đóng gói cung cấp chỉ mục rõ ràng của gói. Câu lệnh nhập sử dụng quy ước sau đây: nếu mã __init__.py của gói xác định danh sách có tên __all__, nó được coi là danh sách tên mô-đun cần được nhập khi bắt đầu nhập gói *. Tùy thuộc vào tác giả gói để giữ danh sách này được cập nhật khi phiên bản mới của gói được phát hành. Tác giả của gói cũng có thể quyết định không hỗ trợ , nếu họ không thấy sử dụng để nhập * từ gói của họ. Đối với Ví dụ, các tập tin sounds/effects/__init__.py có thể chứa các mã sau:

__all__ = ["echo", "surround", "reverse"] 

Điều này có nghĩa rằng from sound.effects import * sẽ nhập ba tên submodules của gói âm thanh.

Một sử dụng cho __all__ là một công cụ cho các nhà xây dựng gói để cho phép họ để cấu trúc gói của họ trong một cách mà làm việc cho họ trong khi làm cho nó thuận tiện cho người dùng. Cụ thể trong trường hợp của pyzmq, nó cho phép bạn viết mã như:

import zmq 
print zmq.zmq_version() 

Thay vì phải sử dụng tên mô-đun chấm đầy đủ:

print zmq.core.version.zmq_version() 

Các gói phần mềm thiết kế của pyzmq đang sử dụng __all__ để thúc đẩy các phần tử không gian tên từ các mô-đun lồng nhau lên đến cấp cao nhất của không gian tên của chúng để người dùng không bị làm phiền bởi cấu trúc của gói của họ.

+0

Tôi đã đọc phần tài liệu này trước khi hỏi tại đây. Nhưng điều này vẫn không trả lời câu hỏi của tôi. Có lẽ tôi nên hỏi theo cách khác: Tôi cho rằng lý do sử dụng 'từ bla import ble' là bạn đã kiểm soát không gian tên của mình, có nghĩa là bạn quyết định ký hiệu nào bạn thêm vào namesapce của mình. – Pablo

+0

Ngược lại với C khi sử dụng '# include' có thể gây ra va chạm với các hàm đã được định nghĩa, các biến, vv, bạn chỉ nên nhập các ký hiệu mà bạn thực sự cần. Tôi mặc dù tôi đọc một nơi nào đó trong tài liệu python sử dụng 'từ bla import *' không phải là một thói quen tốt. Nếu vậy, thì tại sao bận tâm định nghĩa '__ all__'? Và cách '__all__ = ['get_includes'] + core .__ all__' được đánh giá khi thực hiện' import * '? – Pablo

+1

từ nhập khẩu bla * không phải là một thói quen tốt để có được, nhưng có một số mô-đun mà nói chung là an toàn. Tôi thường làm từ nhập khẩu toán học *. Các tài liệu của các mô-đun này thường chỉ ra rằng chúng được thiết kế để được sử dụng theo cách đó và chúng hỗ trợ các niceties như __all__ để làm cho nó dễ dàng hơn một chút. Nhưng từ x import * là stil một cái gì đó để được sử dụng một cách thận trọng và chỉ với các gói mà bạn biết nó sẽ không gây ra một vấn đề. – TimothyAWiseman

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