Предположим, у вас есть следующий макет для пакета Python
./a
./a/__init__.py
./a/_b.py
внутри __init__.py
у вас есть
from _b import *
и внутри _b.py у вас есть
class B(object): pass
При импорте из интерактивного приглашения
>>> import a
>>> a.B
<class 'a._b.B'>
>>>
Как я могу полностью скрыть существование _b?
Проблема, которую я пытаюсь решить, заключается в следующем: я хочу, чтобы фасадный пакет импортировал «скрытые» модули и классы. Классы, доступные на фасаде (в моем случае a
), остаются стабильными и гарантированными на будущее. Я хочу, однако, свободу перемещать классы "под капотом", отсюда и скрытые модули. Это все хорошо, но если какой-то клиентский код выбирает объект, предоставленный фасадом, эти данные будут ссылаться на вложенность скрытого модуля, а не на фасад. Другими словами, если я перемещу класс B
в модуле _c.py
, клиентские коды не смогут распаковать, потому что выбранные классы ссылаются на a._b.B
, который был перемещен. Если бы они ссылались на a.B
, я мог бы переместить класс B столько, сколько я хочу, под капот, не разрушая маринованные данные.