是变量.get('x',反序列化\u json=True)与Jinja'{变量json.x}'?

2024-04-20 14:10:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Variable存储如下:

x | {"a": 1, "b": 2}

我想在我的DAG脚本中以dict的形式检索这个完整的JSON。以下工作:

from airflow.models import Variable
op = CustomOperator(
  templated_field = Variable.get('x', deserialize_json = True)
)
# called in CustomOperator:
templated_field.keys()
# dict_keys(['a', 'b'])

documentation表示以下应该是等价的:

The second call [using Variable.get(deserialize_json=True)] assumes json content and will be deserialized...

...or if you need to deserialize a json object from the variable [using a Jinja template]:

{{ var.json.<variable_name> }}

但是,当我使用此方法然后尝试提取密钥时,会出现错误:

op = CustomOperator(
  templated_field = '{{ var.json.x }}'
)
# called in CustomOperator
templated_field.keys()

AttributeError: 'str' object has no attribute 'keys'

错误表明json实际上没有反序列化:

# same error
"{'a': 1, 'b': 2}".keys()

我在网上找到的唯一使用var.json方法的例子不是从JSON中提取dict,而是使用JSON路径来提取标量

# https://www.applydatascience.com/airflow/airflow-variables/
{{ var.json.example_variables_config.var3 }}
# https://gist.github.com/kaxil/61f41dd87a69230d1a637dc3a1d2fa2c
{{ var.json.dag1_config.var1 }}

Hossein很有帮助地指出这个字段应该模板化;下面是来自CustomOperator的一行:

class CustomOperator(SuperCustomOperator):
    template_fields = SuperCustomOperator.template_fields + ('template_field',)

我错过什么了吗?Jinja var.json方法是只适合提取标量,还是也可以将JSON提取为dict?你知道吗


Tags: 方法fromjsonfieldvartemplatekeysvariable