Импорт списка объектов из файла
У меня есть подмодуль:
.\
..\__init__.py
..\smth.py
Код smth.py такой:
_all_ = ['A']
__all__ = _all_ + ['B']
class A:
''' Видимый в __init__ '''
class B:
''' Видимый только при импорте из этого файла '''
class C:
''' Доступен только по прямому импорту '''
Я не хочу захламлять пространство имён подмодуля, поэтому в __init__ сделал так:
from .smth import _all_ as _smth_all_
from .smth import *
__all__ = _smth_all_
Проблема в том, что from .smth import * импортирует всё, что будет в smth.__all__, то есть smth.A и smth.B, а мне нужен только A.
Писать же что-то типа from .smth import A я не хочу, тк имён много, а при добавлении новых придётся менять И smth.py, И __init__.py.
Есть решение, как импортировать из smth.py только те имена, которые находятся в _all_?
Ответы (1 шт):
Оказалось, у этого вопроса есть два ответа.
1, с молотком вместо микроскопа:
YAGNI. Пусть в файле __init__.py импортируются все и A, и B, но и что, пространство имён импорта будет всё равно формироваться из __init__.__all__, то есть from __init__ import * импортирует только A. Собственно, для этого __all__ и нужен.
2, если всё-таки необходим микроскоп:
# __init__.py
from .smth import _all_ as _smth_all_
smth = __import__('.smth', fromlist=_smth_all_)
globals().update({name: getattr(smth, name) for name in _smth_all_})
__all__ = _smth_all_