Dagster 1.7.10中含ins与context的Asset定义报错排查
Dagster 1.7.10 同时用
ins和AssetExecutionContext触发保留关键字错误的解决办法 问题场景
在Dagster 1.7.10版本中,定义同时包含其他资产输入(通过ins参数指定)和AssetExecutionContext的资产时,会触发以下错误:
dagster._core.errors.DagsterInvalidDefinitionError: "context" is not a valid name in Dagster. It conflicts with a Dagster or python reserved keyword.
复现代码:
from dagster import asset, AssetIn, AssetExecutionContext, Definitions @asset def parent_asset(context: AssetExecutionContext) -> None: return 'hi there!' @asset(ins={'parent_asset': AssetIn('parent_asset')}) def my_asset( parent_asset: str, context: AssetExecutionContext, ) -> None: print(parent_asset + ' whatever') Definitions(assets=[parent_asset, my_asset])
注意:单独使用context或单独使用ins时代码均可正常运行,仅两者同时使用时触发错误。
错误原因
问题出在Dagster的参数识别逻辑:当显式通过ins指定资产输入时,Dagster会默认将函数的所有参数视为待关联的输入资产,此时context会被误判为输入名称。但context是Dagster内部预留的关键字(用于传递执行上下文),因此直接触发命名冲突错误。
解决方案
方案1:移除ins,利用自动资产关联
如果上游资产名称与函数参数名一致,无需显式指定ins,Dagster会自动根据参数名关联上游资产,同时正确识别context为系统上下文:
from dagster import asset, AssetExecutionContext, Definitions @asset def parent_asset(context: AssetExecutionContext) -> None: return 'hi there!' @asset def my_asset( parent_asset: str, context: AssetExecutionContext, ) -> None: print(parent_asset + ' whatever') Definitions(assets=[parent_asset, my_asset])
方案2:保留ins,调整context参数位置
如果必须使用ins(比如上游资产名与参数名不一致),将context参数放在所有输入参数的最前面,Dagster会优先识别它为系统上下文,而非待关联的输入资产:
from dagster import asset, AssetIn, AssetExecutionContext, Definitions @asset def parent_asset(context: AssetExecutionContext) -> None: return 'hi there!' @asset(ins={'parent': AssetIn('parent_asset')}) def my_asset( context: AssetExecutionContext, parent: str, ) -> None: print(parent + ' whatever') Definitions(assets=[parent_asset, my_asset])
内容的提问来源于stack exchange,提问作者valcapp
相关产品推荐
相关产品推荐

