Способ создания пакетов пространства имен в Python

Из Namespace Packages в distribute я знаю, что могу использовать пакеты пространства имен для разделения большого пакета Python на несколько маленьких. Это действительно потрясающе. В документе также упоминается:

Обратите внимание, кстати, что дерево исходных текстов вашего проекта должно включать в себя файлы __init__.py пакетов пространства имен (и __init__.py любых родительских пакетов), в обычном расположении пакетов Python. These __init__.py должны содержать строку:

__import__('pkg_resources').declare_namespace(__name__)

Этот код гарантирует, что механизм пакетов пространства имен работает и что текущий пакет зарегистрирован как пакет пространства имен.

Мне интересно, есть ли какие-то преимущества в том, чтобы сохранить ту же иерархию каталогов для иерархии пакетов? Или это просто техническое требование функции пакетов пространства имен в distribute/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?

edit:

Как показано в следующем блоке, могу ли я иметь пакет пространства имен без этого вложенного каталога и однострочного __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

14
задан shuttle87 3 August 2019 в 20:04
поделиться