2013-01-18 7 views
7

Этот вопрос следует за The way to make namespace packages in Python и How do I create a namespace package in Python?.Пакеты пространства имен с основной частью?

Примечание PEP 420 и distribute docs, что состояние:

Вы НЕ должны включать в себя какой-либо другой код и данные в пакете имен-х __init__.py. Несмотря на то, что он может работать во время разработки или когда проекты установлены как файлы .egg, это не сработает, когда проекты будут установлены с использованием «системных» инструментов упаковки - в таких случаях файлы __init__.py не будут установлены, а тем более выполнены.


Это все кажется, что сделать это невозможно иметь «основной библиотеки» пакет с распределенными независимо друг от друга расширения суб-пакетов. То, что я хочу, чтобы иметь возможность:

  1. определить пакет основной библиотеки, которые будут использоваться как это:

    import mylibrary 
    
    mylibrary.some_function() 
    
  2. позволяет расширение библиотеки, упаковываются и поставляются отдельно, которые будут использоваться, как это :

    import mylibrary.myextension 
    
    mylibrary.myextension.some_other_function() 
    

Я бы ожидать, чтобы быть в состоянии сделать это с пакетами пространства имен, но это, кажется, не быть в зависимости от вопросов и ссылок выше. Это можно сделать вообще?

+0

Я до сих пор не могу поверить, что это все еще имеет место с современным Python. Это, безусловно, делает определение основных частей для удобства в вашем пакете пространства имен довольно «трудным»:/ –

ответ

3

Это действительно не возможно иметь код на верхнем уровне __init__.py для пакета пространства имен PEP 420.

Если бы я тебя, я бы либо:

  1. создать 2 пакетов, один называется MyLibrary (нормальный пакет), который содержит ваш фактический код библиотеки, а другие называют mylibrary_plugins, который является пакет имен.
  2. или, создайте mylibrary.lib, который является нормальным пакетом и содержит ваш код, и mylibrary.plugins, который является пакетом пространства имен.

Лично я хотел бы использовать вариант 1.

Раздел обоснование PEP 420 объясняет, почему __init__.py не может содержать любой код.

+0

Эрик, в случае 2, 'mylibrary' также должен был быть пакетом пространства имен, правильно? – jbenet

1

строго говоря, вы можете иметь переменные под номером mylibrary, вы просто не сможете их определить. Вы можете, например:

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

mylibrary.some_function = some_function 

и пользователи могут использовать его как:

import mylibrary.core 
mylibrary.some_function() 

То есть, mylibrary.core обезьяны патчи mylibrary так, что, кроме импорта, это выглядит, как будто somefunction определяется в mylibrary, а не в подпакетах.

Смежные вопросы