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