architect/standards/6-naming/naming-code-imports.md

type: standard
aspect: naming
title: "Стандарт: Импорты и имена"
version: 1.0.0
date: 2026-02-19
status: active


Стандарт: Импорты и имена

Версия: 1.0.0
Дата: 2026-01-07
Статус: ОБЯЗАТЕЛЬНО


ПРИНЦИП

ЕДИНЫЙ ИСТОЧНИК ИСТИНЫ → НЕТ ПУТАНИЦЫ

Все имена, пути, сокращения определены централизованно в system/config/REGISTRY.yaml


REGISTRY.YAML — Единый реестр

Что там хранится:

Раздел Что определяет Пример
environment Переменные окружения WORKSPACE, PYTHONPATH
directories Пути к директориям library, projects, data
library.connectors API коннекторы ozon, onec, pochta
library.functions Функции price_parser, article_parser
library.internal Внутренние утилиты filemanager
services Сервисы платформы docs, upload, file_share
projects Проекты pirotehnika, lideravto
aliases Псевдонимы 1c → onec

Расположение:

$WORKSPACE/system/config/REGISTRY.yaml

ИСПОЛЬЗОВАНИЕ

В Python коде

# 1. Использовать registry helper
from system.core.registry import get_path, get_service, get_import

workspace = get_path('workspace')      # возвращает $WORKSPACE
docs_url = get_service('docs', 'url')  # http://docs.0kt.ru
ozon_path = get_import('ozon')         # library.connectors.api.ozon

# 2. Короткие импорты (через library/__init__.py)
from library import OzonClient, OneCClient

# 3. Полные импорты (если нужна явность)
from library.connectors.api.ozon import OzonClient
from library.connectors.api.onec import OneCClient

В документации

Используй переменные:
- $WORKSPACE — корень платформы (код)
- $DATASPACE — хранилище данных (S3)

Сервисы:
- Документация: http://docs.0kt.ru
- Загрузка: http://upload.0kt.ru

В скриптах

# Использовать переменные окружения
cd $WORKSPACE/projects/pirotehnika
python3 $WORKSPACE/system/scripts/backup.sh

ПРАВИЛА

1. Всё новое → сначала в REGISTRY.yaml

НЕ ТАК:

# Добавил новый коннектор, импортирую напрямую
from library.connectors.api.newapi import NewApiClient

ТАК:

# 1. Добавить в REGISTRY.yaml
library:
  connectors:
    newapi:
      path: "library.connectors.api.newapi"
      main_class: "NewApiClient"
      description: "New API коннектор"
# 2. Импортировать
from library import NewApiClient  # Автоматически доступен

2. Псевдонимы только в REGISTRY.yaml

НЕ ТАК:

import library.connectors.api.1c as onec  # Локальный алиас

ТАК:

# В REGISTRY.yaml
aliases:
  "1c": "onec"
from library import OneCClient  # Используем правильное имя

3. Абсолютные пути через переменные

НЕ ТАК:

workspace = "/opt/claude-workspace"  # Хардкод

ТАК:

from system.core.registry import workspace
# или
import os
workspace = os.getenv('WORKSPACE')

4. Сервисы только из REGISTRY.yaml

НЕ ТАК:

docs_url = "http://docs.0kt.ru"  # Хардкод

ТАК:

from system.core.registry import get_service
docs_url = get_service('docs', 'url')

ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ

Определение (один раз на сервере)

# ~/.bashrc
export WORKSPACE=/opt/claude-workspace
export DATASPACE=/mnt/beget-s3
export PYTHONPATH="$WORKSPACE"
# /etc/environment
WORKSPACE=/opt/claude-workspace
DATASPACE=/mnt/beget-s3
PYTHONPATH=/opt/claude-workspace

Использование в коде

import os

workspace = os.getenv('WORKSPACE')  # корень платформы
dataspace = os.getenv('DATASPACE')  # хранилище данных

ИМПОРТЫ ИЗ library/

Три способа (все правильные):

# 1. Короткий (удобно)
from library import OzonClient, OneCClient

# 2. Полный (явно)
from library.connectors.api.ozon import OzonClient

# 3. Через registry (программно)
from system.core.registry import get_import
import importlib

path = get_import('ozon')  # library.connectors.api.ozon
module = importlib.import_module(path)
client = module.OzonClient()

Когда что использовать:

Способ Когда использовать
from library import X В большинстве случаев (удобно)
from library.connectors.api.X import Y Когда нужна явность источника
registry + importlib Динамическая загрузка модулей

ИМЕНОВАНИЕ

Python (из REGISTRY.yaml)

# Модули
my_module.py        # snake_case

# Классы
class MyClass:      # PascalCase

# Функции
def my_function():  # snake_case

# Константы
MY_CONSTANT = 10    # UPPER_SNAKE_CASE

Файлы (из REGISTRY.yaml)

README.md           # UPPER_SNAKE_CASE
config.yaml         # lower_snake_case
script.py           # snake_case

База данных (из naming-database.md)

app_products        -- Приложение
sol_orders          -- Решение
prj_tasks           -- Проект
usr_custom_data     -- Пользовательская

ДОБАВЛЕНИЕ НОВОГО КОМПОНЕНТА

Алгоритм:

1. Создать код в library/
2. Добавить в REGISTRY.yaml
3. library/__init__.py автоматически подхватит
4. Использовать: from library import NewComponent

Пример:

# 1. Создать коннектор
mkdir -p library/connectors/api/wildberries
cat > library/connectors/api/wildberries/__init__.py << 'EOF'
class WildberriesClient:
    def __init__(self, api_key):
        self.api_key = api_key
EOF
# 2. Добавить в REGISTRY.yaml
library:
  connectors:
    wildberries:
      path: "library.connectors.api.wildberries"
      main_class: "WildberriesClient"
      description: "Wildberries API"
# 3. Использовать
from library import WildberriesClient  # Автоматически доступен!

ПРОВЕРКА РЕЕСТРА

# Показать все доступные импорты
python3 system/core/registry.py

# Вывод:
# === Platform Registry ===
#
# Переменные окружения:
#   WORKSPACE: $WORKSPACE
#   DATASPACE: $DATASPACE
#
# Импорты:
#   ozon: library.connectors.api.ozon
#   onec: library.connectors.api.onec
#   ...

CHANGELOG

v1.0.0 (2026-01-07)


СВЯЗИ


Принцип: Один раз определили в REGISTRY.yaml → везде используется единообразно.