Как рекурсивно импортировать все классы в модуле? - PullRequest
0 голосов
/ 04 февраля 2020

Можно ли использовать __all__ рекурсивно? Это импортирует модули в __all__ ...

from mypkg import *

, но не рекурсивно.

Попытка поместить все в __all__ (внутри __init__.py) также не представляется полезной:

from pathlib import Path

# List all python (.py) files in the current folder and put them as __all__
fs = [f for f in Path('mypkg/').rglob('*.py') if not f.name.endswith('__init__.py')]
__all__ = [str(f).replace('/','.')[:-3][5:] for f in fs]

Поскольку ...

from mypkg import *

Результат AttributeError: module 'mypkg' has no attribute 'module1.file1' для первой папки в пакете.

1 Ответ

0 голосов
/ 05 февраля 2020

Решено добавлением этого к __init__.py. Может быть не лучшим подходом для большинства ситуаций, но он достаточно хорош для моего варианта использования.

from pathlib import Path

# Include all classes when 'from mypkg import *' is called. 
fs = [f for f in Path('mypkg').rglob('*.py') if not f.name.startswith('_')]

for f in [str(f).replace('/', '.')[:-3] for f in fs]:
    statement = f'from {f} import *'
    exec(statement)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...