You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Airflow:基于装饰器语法配置TaskGroup与外部任务的依赖

Airflow TaskGroup依赖配置报错:AttributeError: 'NoneType' object has no attribute 'update_relative'

错误原因

你代码中被@task_group装饰的tg1函数没有返回任何值,调用tg1()时得到的是None。当执行start >> tg1() >> end时,Airflow无法对None对象执行依赖关系更新操作,因此抛出该错误。

解决方案

以下两种方式可基于TaskFlow API装饰器语法实现TaskGroup与外部任务的依赖配置:

方式1:将TaskGroup实例赋值给变量后配置依赖

把tg1()的调用结果存储为变量,通过变量建立外部依赖:

from datetime import datetime

from airflow.decorators import dag, task_group
from airflow.operators.dummy import DummyOperator


@dag(
    start_date=datetime(2021, 4, 20, 15, 0),
    concurrency=5,
    max_active_runs=1,
    catchup=False,
    schedule_interval="0 17 * * *"
)
def sv_load():
    start = DummyOperator(task_id="start")
    end = DummyOperator(task_id="end")

    @task_group(group_id="tg_test")
    def tg1():
        t1 = DummyOperator(task_id="task1")
        t2 = DummyOperator(task_id="task2")
        t1 >> t2

    # 保存TaskGroup实例到变量
    tg_instance = tg1()
    start >> tg_instance >> end

dag = sv_load()

方式2:让TaskGroup函数返回组内任务或自身

在tg1函数中返回组内的任务(通常是组内最后一个任务),这样调用tg1()会返回可用于依赖配置的有效对象:

from datetime import datetime

from airflow.decorators import dag, task_group
from airflow.operators.dummy import DummyOperator


@dag(
    start_date=datetime(2021, 4, 20, 15, 0),
    concurrency=5,
    max_active_runs=1,
    catchup=False,
    schedule_interval="0 17 * * *"
)
def sv_load():
    start = DummyOperator(task_id="start")
    end = DummyOperator(task_id="end")

    @task_group(group_id="tg_test")
    def tg1():
        t1 = DummyOperator(task_id="task1")
        t2 = DummyOperator(task_id="task2")
        t1 >> t2
        # 返回组内最后一个任务,用于外部依赖串联
        return t2

    start >> tg1() >> end

dag = sv_load()

内容的提问来源于stack exchange,提问作者punky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:15:09