Из Пакеты пространства имен в распространении, я знаю, что могу использовать пакеты пространства имен для разделения большого пакета Python на несколько более мелких. Это действительно здорово. В документе также упоминается:
Обратите внимание, что, кстати, ваше исходное дерево проектов должно включать пакеты пространства имен __init__.py файлы (и __init__.py любого родительские пакеты) в обычном макете пакета Python. Эти
__init__
.py файлы должны содержать строку:__import__('pkg_resources').declare_namespace(__name__)
Этот код обеспечивает работу оборудования пакета пространства имен и что текущий пакет зарегистрирован как пакет пространства имен.
Мне интересно, есть ли какие-либо преимущества для сохранения одинаковой иерархии каталогов в иерархии пакетов? Или это просто техническое требование для функций пространства имен для распространения /setuptools?
Пример
Я хотел бы предоставить подпакет foo.bar, так что мне нужно создать следующую иерархию папок и подготовить __init__.py, чтобы setup.py работала над пакетом пространства имен:
~foo.bar/
~foo.bar/setup.py
~foo.bar/foo/__init__.py <= one-lined file dedicated to namespace packages
~foo.bar/foo/bar/__init__.py
~foo.bar/foo/bar/foobar.py
Я не знаком с пакетами пространства имен, но мне кажется, что 1) foo/bar и 2) (почти) однострочный __init__.py - обычные задачи. Они дают некоторые намеки на "это пакет пространства имен", но я думаю, что у нас уже есть эта информация в setup.py?
изменить
Как показано в следующем блоке, могу ли я иметь пакет пространства имен без этого вложенного каталога и однострочный __init__.py в моем рабочем каталоге? То есть, можем ли мы попросить setup.py автоматически сгенерировать их, просто поместив одну строку namespace_packages = ['foo']
?
~foo.bar/
~foo.bar/setup.py
~foo.bar/src/__init__.py <= for bar package
~foo.bar/src/foobar.py