Как рекурсивно импортировать подпакеты в Python? - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть структура приложения, которая выглядит следующим образом:

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?

...