У меня есть структура приложения, которая выглядит следующим образом:
foo/
bar/
spam.py
baz/
eggs.py
Я хочу иметь возможность импортировать один пакет (foo), а также иметь все модули (спам и яйца) из всех подпакетов (панельи baz) доступно в вызывающем пространстве имен.
Пример:
#!/usr/bin/python
import foo
foo.bar.spam.blah()
foo.baz.eggs.blah()
В настоящее время я разработал следующий шаблон __init__.py, который я поместил во все мои каталоги пакетов:
#!/usr/bin/python
from os.path import dirname, basename, isfile, isdir
import glob
__all__ = []
paths = glob.glob(dirname(__file__) + "/*")
for p in paths:
name = basename(p)
if isfile(p) and p.endswith('.py') and not p.endswith('__init__.py'):
__all__.append(name[:-3])
__import__(name[:-3], globals(), locals(), [], -1)
elif isdir(p):
if isfile(p + '/__init__.py'):
__all__.append(name)
__import__(name, globals(), locals(), [], -1)
Кажется, это работает, но я вроде не знаю, что он делает.Я не понимаю ни пространства имен Pythons, ни системы импорта.Этот код безопасен?Я вроде как бросил это вместе, используя кучу поисков в Google.Какие потенциальные точки отказа здесь задействованы?
Я намеревался , чтобы этот код инструктировал пакет импортировать все модули и подпакеты в корне пакета ... Я просто догадался, что еслипакет автоматически импортирует свои модули непосредственно из пространства имен пакета, тогда модули будут доступны с использованием package . module из вызывающего пространства имен.Я думаю, это потому, что модули добавляются в пространство имен пакета, которое затем добавляется в пространство имен вызывающего?Исходя из этого, я решил, что если я добавлю это во все мои пакеты и подпакеты, это должно в конечном итоге обеспечить доступ ко всему, сохраняя иерархическую структуру, которую я настроил?Не уверен, что код выполняет точно и исключительно то, к чему я стремился, или он открывает другие двери, которые я не хотел открывать.
Может кто-нибудь сказать мне:
A.)Является ли этот код безопасным и / или структурно надежным?
B.) Каков стандартный способ решения этой проблемы в Python?