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
: Используется для сборки и установки пакета.