Я хочу, чтобы интерфейс какого-то модуля содержал определенное количество функций и классов (и ничего больше). Я мог бы реализовать все это в одном файле и легко получить нужный мне интерфейс. Но поскольку кода много, я бы предпочел разбить все это на несколько файлов, скажем
mypackage/
__init__.py
a.py
b.py
c.py
d.py
Чтобы все равно получить нужный интерфейс, я определяю файл __init__.py
для пакета, который импортирует все открытые символы из a
, b
, c
и d
:
from a import func_a1, func_a2, ClassA1, ClassA2
from b import func_b1, func_b2, ClassB1, ClassB2
from c import func_c1, func_c2, ClassC1, ClassC2
from d import func_d1, func_d2, ClassD1, ClassD2
Если я импортирую пакет, используя
import mypackage
пространство имен пакета также содержит символы a
, b
, c
и d
. Эти имена являются деталями реализации, а не частью моего интерфейса. Я не хочу, чтобы они появлялись как «публичные» символы. Какой лучший способ избавиться от них?
Варианты, которые я рассмотрел:
Используйте один модуль вместо пакета. Интерфейс будет хорошо выглядеть, но реализация станет менее понятной, чем сейчас.
Добавить строку
del a, b, c, d
до конца __init__.py
. Работает нормально, но похоже на взлом. (Например, вы больше не можете import __init__
, что работает без этой строки.)
Переименуйте a
, b
, c
и d
в _a
, _b
, _c
и _d
. Теперь они включены в пространство имен mypackage
как "частные" символы, с которыми я в порядке, но немного странно, что все мои имена файлов начинаются с подчеркивания (на самом деле, есть конечно больше четырех подмодулей).
Есть предложения получше? Или мысли о том, какой вариант предпочесть?
Или я просто к аналу и мне все равно?