2013-01-18 26 views
7

Câu hỏi này theo dõi The way to make namespace packages in PythonHow do I create a namespace package in Python?.Gói không gian tên có phần cốt lõi?

Note PEP 420, và distribute docs, mà nhà nước:

Bạn KHÔNG phải bao gồm bất kỳ mã và dữ liệu khác trong một gói namespace của __init__.py. Mặc dù nó có thể hoạt động trong quá trình phát triển hoặc khi các dự án được cài đặt dưới dạng tệp .egg, nó sẽ không hoạt động khi các dự án được cài đặt bằng các công cụ đóng gói "hệ thống" - trong trường hợp này, các tệp __init__.py sẽ không được cài đặt.


này tất cả dường như để làm cho nó không thể có một "thư viện chính" gói với phân phối độc lập mở rộng gói con. Những gì tôi muốn là để có thể:

  1. định nghĩa một gói thư viện lõi, được sử dụng như thế này:

    import mylibrary 
    
    mylibrary.some_function() 
    
  2. cho phép mở rộng thư viện, đóng gói và phân phối riêng biệt, được sử dụng như thế này :

    import mylibrary.myextension 
    
    mylibrary.myextension.some_other_function() 
    

tôi sẽ đã dự kiến ​​để có thể làm điều này với gói không gian tên, nhưng có vẻ như không đúng như vậy, dựa trên các câu hỏi và liên kết ở trên. Điều này có thể được thực hiện ở tất cả?

+0

Tôi vẫn không thể tin rằng đây vẫn là trường hợp với Python hiện đại. Nó chắc chắn làm cho việc xác định các bộ phận cốt lõi để thuận tiện trong gói không gian tên của bạn khá "cứng":/ –

Trả lời

3

Thực sự không thể có mã ở cấp cao nhất __init__.py cho gói không gian tên PEP 420.

Nếu tôi là bạn, tôi muốn một trong hai:

  1. tạo 2 gói, người ta gọi là mylibrary (một gói bình thường) mà chứa mã thư viện thực tế của bạn, và gọi mylibrary_plugins khác mà là một gói namespace.
  2. hoặc, tạo mylibrary.lib, đây là gói bình thường và chứa mã của bạn và mylibrary.plugins, đây là gói không gian tên.

Cá nhân tôi muốn sử dụng tùy chọn 1.

Phần lý do của PEP 420 giải thích tại sao __init__.py không thể chứa bất kỳ mã.

+0

Eric, trong trường hợp 2, 'mylibrary' sẽ phải là một gói không gian tên, đúng không? – jbenet

1

nói đúng, bạn có thể biến dưới mylibrary, bạn sẽ không thể xác định chúng ở đó. Bạn có thể, ví dụ:

# mylibrary/core.py 
import mylibrary 
def some_function(): 
    pass 

mylibrary.some_function = some_function 

và người dùng của bạn có thể sử dụng nó như:

import mylibrary.core 
mylibrary.some_function() 

Đó là để nói, mylibrary.core khỉ bản vá lỗi mylibrary do đó, khác hơn so với nhập khẩu, có vẻ như thể somefunction được định nghĩa trong mylibrary thay vì gói phụ.

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