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