Python 渲染的模板将变成字符串

Python 渲染的模板将变成字符串,python,jinja2,airflow,Python,Jinja2,Airflow,我试图使用jinja模板将xcom中的一些json解析到字典中。下面请注意,运算符和模板化_字段是伪代码 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,

我试图使用jinja模板将xcom中的一些json解析到字典中。下面请注意,
运算符
模板化_字段
是伪代码

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。这没有意义,因为您可以在jinja模板中看到结构作为dict被遍历。jinja是否将模板中的所有内容字符串化?如果是,有没有办法不这样做?

呈现的jinja模板总是会返回字符串。您可以改为从python方法中获取XCom值

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模板相同的值访问权限