算术运算中的 Yaml 类型转换变量



我有以下 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' ]

相关内容

  • 没有找到相关文章

最新更新