Из 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