К содержимому

Документация

Преобразование выгрузки на Python

Язык сбора и язык преобразования независимы. PHP или JavaScript может собирать записи, а Python готовить их к CSV/JSON/XML, файлу, HTTP endpoint, Webhook или поддерживаемому приёмнику. Преобразование выполняется после сопоставления полей выгрузки и не меняет исходные записи сайта.

Вход и выход

def run(ctx):
    items = ctx.params().get('items', [])
    for item in items:
        result = dict(item)
        quantity = result.get('quantity')
        result['in_stock'] = quantity is not None and float(quantity) > 0
        ctx.emit(result)

Платформа передаёт список записей в ctx.params()['items']; безопасный вариант для пустого входа: .get('items', []). Каждую выходную запись нужно отправить через ctx.emit(dict). Возврат списка из run() не является выходом выгрузки. Точка входа всегда run(ctx), как у других языков преобразований.

Не передавайте __key как собственное поле результата. В этом режиме идентичность записи контролирует механизм выгрузок, а не произвольный ключ нового каталога. Передавайте только требуемые поля уже сопоставленной структуры.

Режимы

«Записи» подходит для вычисления, очистки и переименования полей. Количество и порядок должны сохраняться. Пропустить запись или вернуть две вместо одной нельзя: платформа проверяет результат.

Режим «Набор» применяется к файлам, HTTP endpoint и Webhook; подключённая доставка в БД не позволяет сохранить этот режим. «Набор» подходит для фильтрации, сортировки, группировки и сводок. Размер полного входа ограничен: до 10 000 записей и 16 МБ, один вызов до 30 секунд. Код не может самостоятельно повысить эти ограничения. Для больших выборок измените задачу или предварительно сузьте данные.

def run(ctx):
    totals = {}
    for item in ctx.param('items', []):
        category = str(item.get('category') or 'other')
        quantity = float(item.get('quantity') or 0)
        totals[category] = totals.get(category, 0) + quantity
    for category in sorted(totals):
        ctx.emit({'category': category, 'quantity': totals[category]})

Этот пример предназначен только для режима «Набор». Итоговые поля должны соответствовать ожидаемой схеме получателя.

Страницы endpoint и полный файл

При обращении к HTTP endpoint преобразуется текущая страница. Итог этой страницы не является итогом всего каталога. При подготовке файла и Webhook используется допустимая полная выборка. Если нужна общая сводка, создайте её в отдельном сценарии или используйте режим и способ доставки с полной выборкой в пределах ограничений.

Сортировка внутри текущей страницы не делает все страницы глобально отсортированными. Курсор и ограничения доступа проверяются системой выгрузок; Python-преобразование их не обходит. Расписание и события доставки остаются общими для всех языков.

Разрешённые действия

Преобразование является вычислением без внешних сервисов. HTTP, браузер, почта, документы, S3, секреты и AI-вызовы недоступны. Можно использовать обычные вычисления, разрешённую стандартную библиотеку, param/params, emit, журнал и другие допустимые локальные методы. Попытка запретного обращения завершает преобразование ошибкой, вместо частичной успешной выгрузки.

Для диагностики сначала откройте предпросмотр на небольшой выборке и проверьте ноль записей, пропущенное поле, нулевое количество, неверный тип и весь порядок. Не перехватывайте ошибки молча. Исправьте код, повторите предпросмотр, затем проверьте конкретный канал доставки. Правила выдачи токенов описаны в HTTP-выгрузке.

Размер сериализованного сообщения

Логический предел набора 16 MiB не отменяет предел сериализованного сообщения 12 MiB с параметрами и служебными данными. В него должны помещаться и вход, и отправляемый выход. Допустимая выборка может быть меньше; при ошибке сократите число записей или большие поля. Ошибка ограничения не означает успешную обрезанную выгрузку.