Я хочу, чтобы интерфейс некоторого модуля содержал определенное количество функций и классов (и ничего больше). Я мог бы реализовать все из них в одном файле и легко получить интерфейс, который я хочу. Но так как есть много кода, я бы предпочел разбить все на несколько файлов, скажем
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
как символы "private", с которыми я в порядке, но мне кажется странным, что все мои имена файлов начинаются с подчеркивания (на самом деле, конечно, более четырех подмодулей).
Любые лучшие предложения? Или мысли о том, какой вариант предпочтительнее?
Или я просто анал и не должен заботиться обо всем этом?