Argo参数比较失效求助:相同字符串为何比较结果为false?
Argo工作流字符串比较异常原因解析
问题场景
在Argo工作流的YAML配置中,定义了如下参数:
spec: arguments: parameters: - name: param value: '{{workflow.name}}'
随后在脚本容器中运行Python代码:
print ('here I have {{workflow.name}} and {{workflow.parameters.param}}') print ('sanity: {{= 5 == 5}} and {{= "rew" == "rew"}} ') print ('but {{=workflow.name == workflow.parameters.param}} ') print ('python cmp: ', '{{workflow.name}}' == '{{workflow.parameters.param}}')
得到的输出结果:
here I have myname-lp8dv and myname-lp8dv sanity: true and true but false python cmp: True
明明两个变量显示的字符串完全一致,Argo模板表达式中的比较却返回false,但字面量字符串比较又能正常工作,原因如下:
核心原因
Argo的表达式语言中,workflow.name直接返回字符串类型的工作流名称;而workflow.parameters.param返回的是一个Parameter结构体对象,并非单纯的字符串。
虽然在模板渲染(比如{{workflow.parameters.param}})时,会自动调用该对象的字符串转换方法,输出和workflow.name相同的内容,但在表达式的相等比较中,是直接比较对象的类型和值——字符串和Parameter对象自然不相等,因此返回false。
而Python代码中的比较'{{workflow.name}}' == '{{workflow.parameters.param}}'返回True,是因为这两个占位符在渲染后都被替换成了相同的字符串字面量,Python是在比较两个普通字符串,所以结果符合预期。
解决方法
在Argo表达式中,需要显式获取参数对象的value属性来进行字符串比较:
print ('fixed: {{= workflow.name == workflow.parameters.param.value}} ')
这样就能得到正确的true结果。
内容的提问来源于stack exchange,提问作者Arik
相关产品推荐
相关产品推荐

