Я пытаюсь использовать шаблон jinja для анализа некоторого json, найденного в xcom, в словаре. Примечание ниже, что Operator
и templated_field
- это psuedo-code.
def xcom_from_json(xcom):
xcom_loaded = json.loads(xcom)
logging.info(pformat(f'xcom loaded: {xcom_loaded}', indent=3))
return xcom_loaded
PythonOperator(python_callable=some_callable,
op_args=[f'{{{{ (ti.xcom_pull("{task_id}") | xcom_from_json)["data"]["stats"] }}}}'])
Вышеуказанные работы, почти. В some_callable
методе я получаю разобранный jinja, но он выступает как строгий dict вместо необработанного dict. Это не имеет смысла, потому что вы можете видеть, что структура перемещается как dict в шаблоне jinja. Содержит ли jinja все, что выходит из шаблона? Если да, есть ли способ не делать этого?
Обрабатываемый шаблон jinja всегда будет возвращать строку. Вместо этого вы можете выбрать значение XCom из метода python.
def some_callable(task_id, **context):
stats = json.loads(context['ti'].xcom_pull(task_id)['data']['stats'])
PythonOperator(
...
python_callable=some_callable,
op_args=[f'{task_id}'],
provide_context=True)
Обратите внимание, что вы должны предоставить контекст, который дает методу python тот же доступ к значениям, которые имеет шаблон jinja.