Python 是否有任何方法可以在创建后编辑气流操作符?

Python 是否有任何方法可以在创建后编辑气流操作符?,python,airflow,google-cloud-composer,Python,Airflow,Google Cloud Composer,我有一个python脚本,它基于一个JSON文件动态创建task操作符和DAG,该文件映射了所需的每个选项。 该脚本还专门用于创建所需的任何操作符。 有时我想根据映射激活一些条件选项。。。例如,在bigqueryOperator中,有时我需要一个时间分区和一个目标表,但我不想在每个映射的任务上都设置 我试图阅读有关BaseOperator的文档,但我看不到任何类似java的set方法 返回运算符的函数,例如bigQuery def BQOperatorAppedTask: 尝试: 返回BigQu

我有一个python脚本,它基于一个JSON文件动态创建task操作符和DAG,该文件映射了所需的每个选项。 该脚本还专门用于创建所需的任何操作符。 有时我想根据映射激活一些条件选项。。。例如,在bigqueryOperator中,有时我需要一个时间分区和一个目标表,但我不想在每个映射的任务上都设置

我试图阅读有关BaseOperator的文档,但我看不到任何类似java的set方法

返回运算符的函数,例如bigQuery

def BQOperatorAppedTask: 尝试: 返回BigQueryOperator task\u id=mappedTask.get'task\u id', sql=mappedTask.get'sql', destination_dataset_table=project+'.+dataset+'.+mappedTask.get'target', write\u disposition=mappedTask.get'write\u disposition', allow\u large\u results=mappedTask。获取“allow\u large\u results”, 时间分区=mappedTask。获取“时间分区”, 使用旧版sql=mappedTask。获取“使用旧版sql”, dag=dag, 例外情况除外,如e: 错误='为任务创建BigQueryOperator时出错:'+mappedTask.get'task\u id' logger.error错误 提出例外错误 json文件中的mappedTask没有分区

        {
            "task_id": "TEST_TASK_ID",
            "sql": "some fancy query",
            "type": "bqOperator",
            "dependencies": [],
            "write_disposition": "WRITE_APPEND",
            "allow_large_results": true,
            "createDisposition": "CREATE_IF_NEEDED",
            "use_legacy_sql": false
        },
        {
            "task_id": "TEST_TASK_ID_PARTITION",
            "sql": "some fancy query",
            "type": "bqOperator",
            "dependencies": [],
            "write_disposition": "WRITE_APPEND",
            "allow_large_results": true,
            "createDisposition": "CREATE_IF_NEEDED",
            "use_legacy_sql": false,
                        "targetTable": "TARGET_TABLE",
            "time_partitioning": {
                "field": "DATE_TO_PART",
                "type": "DAY"
            }
        },
带有分区的json文件内的mappedTask

        {
            "task_id": "TEST_TASK_ID",
            "sql": "some fancy query",
            "type": "bqOperator",
            "dependencies": [],
            "write_disposition": "WRITE_APPEND",
            "allow_large_results": true,
            "createDisposition": "CREATE_IF_NEEDED",
            "use_legacy_sql": false
        },
        {
            "task_id": "TEST_TASK_ID_PARTITION",
            "sql": "some fancy query",
            "type": "bqOperator",
            "dependencies": [],
            "write_disposition": "WRITE_APPEND",
            "allow_large_results": true,
            "createDisposition": "CREATE_IF_NEEDED",
            "use_legacy_sql": false,
                        "targetTable": "TARGET_TABLE",
            "time_partitioning": {
                "field": "DATE_TO_PART",
                "type": "DAY"
            }
        },

python中没有私有方法或字段,因此可以直接设置和获取字段,如

op.use_legacy_sql=True 鉴于此,我强烈反对这样做,因为这是一个真正的代码气味。相反,您可以修改工厂类,将一些默认值应用于json数据。 或者更好的是,对json本身应用默认值。然后保存并使用更新的json。这将使事情更加可预测

如下更改bqOperator以处理这种情况,当它在json中找不到该字段时,它基本上会传递None:

def bqOperator(mappedTask):
    try:
        return BigQueryOperator(
        task_id=mappedTask.get('task_id'),
        sql=mappedTask.get('sql'),  
        destination_dataset_table="{}.{}.{}".format(project, dataset, mappedTask.get('target')) if mappedTask.get('target', None)  else None,
        write_disposition=mappedTask.get('write_disposition'),
        allow_large_results=mappedTask.get('allow_large_results'),
        time_partitioning=mappedTask.get('time_partitioning', None),
        use_legacy_sql=mappedTask.get('use_legacy_sql'),
        dag=dag,
        )
    except Exception as e:
        error = 'Error creating BigQueryOperator for task : ' + mappedTask.get('task_id')
        logger.error(error)
        raise Exception(error) 

谢谢你的回答,它给了我考虑语法,但我想我会遵循KAXIL答案,因为我不想让映射JSON太难编辑。最终的目标是为非开发人员提供一个简单的工具,以便在此composer流中创建新任务。谢谢你。谢谢你的回答,它给了我一些直到现在才知道的Python语法,可能解决了这个问题,我会试试这个!