Итак, это набор вопросов о том, как использовать __init__.py в пакетах / подпакетах.Я искал и на удивление не нашел достойного ответа на это.
Если у меня есть следующая структура (которая, очевидно, является упрощенным примером):
my_package/
__init__.py
module1.py
my_sub_package/
__init__.py
module2.py
содержимое module1.py равно
my_string = 'Hello'
содержимоеmodule2.py is
my_int = 42
Первый вопрос: импорт нескольких модулей из пакета по умолчанию
Что должно быть в файлах __init__.py?
Я могу их оставитьempty, в этом случае import my_package
ничего не делает на самом деле (очевидно, он импортирует пакет, но пакет фактически ничего не содержит).Очевидно, это нормально, и что должно происходить в большинстве случаев.
В этом случае мне бы хотелось, чтобы import my_package
позволил мне использовать my_package.module1.my_string
и my_package.my_sub_package.module2.my_int
.
Я могу добавить __all__ = [ 'module1' ]
к my_package / __ init__.py и __all__ = [ 'module2' ]
к my_package / my_sub_package / __ init__.py, но это влияет только на импорт с использованием подстановочного знака, насколько я понимаю (поэтому только from my_package import *
и from my_package.my_sub_package import *
).
Я могу добиться этого, поместив
import my_package.module1
import my_package.my_sub_package
в my_package / __ init__.py и
import my_package.my_sub_package.module2
в my_package / my_sub_package / __ init__.py, но этоплохая идея?Он создает (казалось бы) бесконечную серию my_package.my_package.my_package .... когда я делаю это в интерпретаторе Python (3.5.5).
Отдельный, но очень связанный вопрос: использование модулей для хранения файлов разумного размера
Если бы я вместо этого хотел иметь возможность сделать следующее
import my_package
print(my_package.my_string)
print(str(my_package.my_sub_package.my_int))
т.е. я хотелиспользовать module1 и module2 исключительно для разделения кода на более мелкие и более читаемые файлы, если у меня действительно было много модулей в каждом пакете (что, очевидно, неприменимо в этом тривиальном примере, но может легко)
делает from my_package.module1 import *
в my_package / __ init__.py и from my_package.my_sub_package.module2 import *
в my_package / my_sub_package / __ init__.py разумный способ сделать это?Мне не нравится использование подстановочного импорта, но кажется, что было бы неоправданно многословным импортировать все, что определено в (реальном) модуле, перечисляя их все.
Третий (также очень связанный) вопрос: избегать написания имен пакетов в нескольких местах
Есть ли способ, которым я могу достичь вышеупомянутого, не добавляя имена пакетов в исходный кодв них?Я спрашиваю, потому что я хотел бы избежать необходимости менять его в нескольких местах, если я переименую пакет (опять же, простой в этом тривиальном примере, в действительности может быть реализован с помощью IDE или сценария, но было бы неплохо знать, как этого избежать).