我有以下 YAML 文件:
somthing:
a: &a_num 5
b: &b_num 32
c: !!python/object/apply:eval [ 5 * 32] # works
d: !!python/object/apply:eval [ *a_num * *a_num] # throws error
错误:
应使用字母或数字字符,但找到" '
我试图对浮点数的变量进行类型转换:
c: !!python/object/apply:eval [ !!float *a * !!float *b]
但这也没有用
如何对变量进行算术运算?
如果不修改加载器、替代eval
和/或重写 YAML,这是行不通的。
如果您尝试加载,请转储以下内容:
c: [ 5 * 32]
你会看到那个不带引号的标量等效于:
c: ['5 * 32']
因此,您对 eval 的调用将作为参数获取具有单个字符串的列表。
你的 YAML 需要有效,而你的不是,所以你的程序永远不会第二次调用 eval。[ *a_num * *a_num]
的分析确实会失败,因为此节点开头的*
确实会阻止解析未引号的标量,因为它被识别为别名。别名被解析(直到a_num
后面的空格(,然后解析器需要下一个列表元素的逗号或结束]
。它尝试再次解析别名,如果可以,它仍然会抱怨逗号(尝试使用[ *a_num *a_num]
来查看该效果,您将永远不会到达eval
调用(。
因此,您要么必须求助于自己的 eval 替代方案,该替代方案知道如何处理一系列元素 ([*a_num, '*', *a_num]
( 作为参数(因为这必须是有效的 YAML(,或者您有这样的替代访问锚点/别名机制并呈现它[ '*a_num * *a_num' ]
。