Ответ 1
Ты сказал:
Я хочу, чтобы члены всех модулей в пакете находились в пакете пространство имен, и я не хочу, чтобы сами модули были в Пространство имен.
Я смог это сделать, адаптировав что-то, что я использовал в Python 2, чтобы автоматически импортировать подключаемые модули для работы в Python 3.
Вкратце, вот как это работает: пакет __init__.py файл импортирует все остальные файлы Python в тот же каталог пакетов, который не начинается с символа "_" (подчеркивание). После этого он добавляет имена в пространство имён импортированных модулей к модулю __init__ (который также является пространством имен пакетов). Примечание. Я должен был явно сделать модуль example_module
import foo
из foo_module
.
Одним из важных аспектов такого поведения является понимание того, что он динамичен и не требует, чтобы имена модулей модулей были жестко закодированы в файле __init__.py. Конечно, это требует большего количества кода для выполнения, но также делает его очень универсальным и может работать практически с любым (одноуровневым) пакетом - поскольку он автоматически импортирует новые модули при их добавлении и прекращает импорт любых удаленных из каталог.
test.py
from package import *
print(example('derp'))
__ __ INIT ру:.
def _import_all_modules():
"""dynamically imports all modules in the package"""
import traceback
import os
global __all__
__all__ = []
globals_, locals_ = globals(), locals()
# dynamically import all the package modules
for filename in os.listdir(__name__):
# process all python files in directory that don't start with underscore
# (which also keeps this module from importing itself)
if filename[0] != '_' and filename.split('.')[-1] in ('py', 'pyw'):
modulename = filename.split('.')[0] # filename without extension
package_module = '.'.join([__name__, modulename])
try:
module = __import__(package_module, globals_, locals_, [modulename])
except:
traceback.print_exc()
raise
for name in module.__dict__:
if not name.startswith('_'):
globals_[name] = module.__dict__[name]
__all__.append(name)
_import_all_modules()
foo_module.py
def foo(bar):
return bar
example_module.py
from package.foo_module import foo # added
def example(arg):
return foo(arg)