2011-10-16 17 views
36

Trong một số __init__.py file của module Tôi thấy dòng như:`__import __ ('pkg_resources') là gì. Declare_namespace (__ name __)` làm gì?

__import__('pkg_resources').declare_namespace(__name__) 

nó làm gì và tại sao người sử dụng nó? Giả sử nó liên quan đến nhập khẩu động và tạo không gian tên lúc chạy.

+1

Bạn có thể tìm thấy câu hỏi này và câu trả lời hữu ích: http://stackoverflow.com/questions/5064951/packaging-common-python-namespaces –

Trả lời

34

Nó nắm đến hai điều:

  1. __import__ là một hàm Python sẽ nhập khẩu một gói sử dụng một chuỗi như tên của gói. Nó trả về một đối tượng mới đại diện cho gói đã nhập. Vì vậy, foo = __import__('bar') sẽ nhập một gói có tên là bar và lưu trữ một tham chiếu đến các đối tượng của nó trong một biến đối tượng cục bộ foo.

  2. Từ utils thiết lập pkg_resources' tài liệu, declare_namespace() "Tuyên bố [s] rằng tên tên gói rải rác là" gói không gian tên "có chứa các gói và mô-đun có thể được trải rộng trên nhiều bản phân phối."

Vì vậy __import__('pkg_resources').declare_namespace(__name__) sẽ nhập gói 'pkg_resources' thành một tạm thời và gọi declare_namespace chức năng lưu trữ trong đó tạm thời (các __import__ chức năng có khả năng sử dụng chứ không phải là tuyên bố import để không có biểu tượng thêm còn sót lại tên pkg_resources). Nếu mã này nằm trong số my_namespace/__init__.py thì __name__my_namespace và mô-đun này sẽ được bao gồm trong gói không gian tên my_namespace.

Xem tài liệu setup tools để biết thêm chi tiết

Xem this question để thảo luận về cơ chế cũ để đạt được tác dụng tương tự.

Xem PEP 420 cho cơ chế được chuẩn hóa cung cấp chức năng tương tự bắt đầu bằng Python 3.3.

+0

__import__ là một hàm Python, không phải là một tuyên bố. –

+0

@PierreThibault Đã sửa lỗi. Cảm ơn! – Nathan

+0

Cái gì? Không! Đó không phải là những gì 'declare_namespace' làm gì cả. Nó không chỉ đổ các nội dung của mô-đun 'pkg_resources' vào vùng tên đã chọn; 'pkg_resources' chỉ là mô-đun mà' declare_namespace' xuất phát từ đó. Một gói 'foo' sẽ sử dụng' pkg_resources.declare_namespace (__ name __) 'để cho phép thực thi nó được chia thành nhiều thư mục' foo'. Việc kéo nội dung của 'pkg_resources' vào không gian tên của bạn sẽ hoàn toàn phản tác dụng. – user2357112

4

Đây là cách khai báo các gói "không gian tên" trong Python.

đây là những gì và vấn đề là gì:

Hãy tưởng tượng bạn phân phối một sản phẩm phần mềm trong đó có rất nhiều chức năng, và không phải tất cả mọi người muốn tất cả của nó, vì vậy bạn chia nó thành từng miếng và tàu plugin như tùy chọn .

Bạn muốn mọi người có thể làm

import your_project.plugins.plugin1 
import your_project.plugins.plugin2 
... 

nào là tốt nếu cấu trúc thư mục của bạn là chính xác như trên, cụ thể là

your_project/ 
    __init__.py 
    plugins/ 
     __init__.py 
     plugin1.py 
     plugin2.py 

Nhưng nếu bạn tàu hai plugins như trăn riêng gói để chúng được đặt trong hai thư mục khác nhau? Sau đó, bạn có thể muốn đặt __import__('pkg_resources').declare_namespace(__name__) trong mỗi gói __init__.py để Python biết các gói đó là một phần của gói "không gian tên" lớn hơn, trong trường hợp của chúng tôi là your_project.plugins.

Vui lòng tham khảo documentation để biết thêm thông tin.

0

Nathan, mô tả này có vẻ không đúng: "Vì vậy, __import__('pkg_resources').declare_namespace(__name__) sẽ nhập tất cả các biểu tượng từ gói pkg_resources và sau đó thêm chúng vào không gian tên có tên được lưu trữ trong __name__."

declare_namespace không thêm biểu tượng từ gói pkg_resources vào không gian tên có tên được lưu trữ trong __name__.

declare_namespace thực hiện như sau: "Khai báo gói" packageName "là gói không gian tên". Tham khảo: http://galaxy.readthedocs.io/en/master/lib/pkg_resources.html#pkg_resources.declare_namespace

+0

Vâng, tôi và @ user2357112 đều đúng. Tôi đã cập nhật phản hồi của mình để phản ánh. – Nathan

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