my_package/
├── __init__.py # Делает папку пакетом
├── module1.py # Модуль 1
├── module2.py # Модуль 2
└── subpackage/ # Подпакет (необязательно)
├── __init__.py
└── module3.py
Ключевые моменты:
__init__.py может быть пустым или содержать код инициализации пакета, например, импорт часто используемых модулей или переменных.import my_package.module1 или from my_package import module1. Для подпакета: from my_package.subpackage import module3__all__ в __init__.py, чтобы указать, какие модули экспортировать при использовании from my_package import * (обычно не рекомендуется).Организация структуры пакета с несколькими модулями в Python подразумевает создание иерархической структуры каталогов, где каждый каталог представляет пакет или подпакет, а файлы .py внутри них – модули.
Основная структура:
my_package/
__init__.py # Обязательный файл, делающий каталог пакетом
module1.py # Модуль 1
module2.py # Модуль 2
subpackage/
__init__.py
module3.py
module4.py
Пояснения:
my_package/: Это корневой каталог пакета. Имя этого каталога – имя вашего пакета.
__init__.py: Этот файл необходим в каждом каталоге, который должен быть распознан Python как пакет. Он может быть пустым, но его наличие делает каталог пакетом. В нем часто размещают код инициализации пакета, например, импорт других модулей внутри пакета для удобства использования.
module1.py, module2.py: Это файлы, содержащие Python-код. Они представляют собой модули, которые можно импортировать и использовать.
subpackage/: Это подпакет внутри my_package. Подпакеты позволяют организовать модули в более крупные логические блоки.
Примеры использования:
import my_package.module1
from my_package import module2
from my_package.subpackage import module3
my_package.module1.some_function()
module2.another_function()
module3.yet_another_function()
__init__.py для упрощения импорта:
В my_package/__init__.py можно добавить:
from .module1 import *
from .module2 import *
Тогда можно будет импортировать напрямую:
from my_package import some_function, another_function
Рекомендации:
. и ..): Относительные импорты делают ваш код более устойчивым к изменениям структуры пакета. Особенно важно внутри пакета.
Пример более сложной структуры (для больших проектов):
my_project/
src/
my_package/
__init__.py
module1.py
module2/
__init__.py
sub_module1.py
utils/
__init__.py
helper_functions.py
tests/
__init__.py
test_module1.py
test_module2.py
README.md
setup.py
В этом примере:
src/: Содержит исходный код пакета.tests/: Содержит тесты для пакета.setup.py: Используется для сборки и установки пакета.