Типизация переменных¶
Типизация постепенная: необъявленная переменная не проверяется, секции типов необязательны.
{
"types": {
"UserId": "int",
"User": {
"id": "UserId",
"name": "string",
"email?": "string",
"settings": { "theme": "string" }
},
"Point": { "fields": { "x": "int", "y": "int" }, "strict": true },
"Tree": { "value": "int", "children": "list<Tree>" }
},
"variables": { "user": "User", "attempts": "int", "tags": "list<string>" }
}
Язык типов: примитивы string, int, float, number (int|float), bool,
any, null; контейнеры list<T> и map<T> (ключи строковые); объединения
T|U; сокращение T? = T|null; имена из секции types. Структуры
поддерживают опциональные поля (суффикс ? у имени), вложенные анонимные
структуры, рекурсию и строгий режим (strict запрещает лишние поля).
Проверки двухслойные:
- статически, при валидации графа: объявленный тип переменной сверяется с
хинтами из спецификации стадии,
exposeтребует совместимости источника и назначения; несовместимость — ошибкаPipeline.validate()до запуска; - динамически, при исполнении: каждая запись в объявленную переменную
(
entry,outputs,expose,except.result_var, артефакты субпайплайна) и входной контекст сессии проверяются по полной структуре значения; ошибка —TypeCheckErrorс узлом и путём до несовпадения.
Субпайплайн наследует именованные типы родителя и может объявить свои; типы переменных у него собственные.
Обе секции правятся в редакторе, «File» → «Pipeline settings…»:
