在YAML中执行算术运算?

Luc*_*cas 15 python math yaml pyyaml

有时候我必须在配置文件中指定时间(以秒为单位),并且编写精确的秒数非常烦人 - 相反,我想执行算术,所以我可以使用:

some_time: 1 * 24 * 60 * 60
Run Code Online (Sandbox Code Playgroud)

而不是确切的:

some_time: 86400
Run Code Online (Sandbox Code Playgroud)

不幸的是,在使用这一行时:some_time: 1 * 24 * 60 * 60它会将该配置行视为字符串.当然,我可以使用 - eval(config['some_time'])但我很想知道是否可以在YAML中执行算术运算?

Raf*_*ida 11

我不认为有.至少不符合规范(http://yaml.org/spec/1.2/spec.html).人们向yaml添加非官方标签(维基百科似乎说有关于yield标签的提议,尽管他们没有说谁建议或在哪里:http://en.wikipedia.org/wiki/YAML#cite_note-16) ,但在pyyaml中似乎没有你需要的东西.

查看pyyaml特定标签似乎没有任何感兴趣的东西.虽然!!timestamp '2014-08-26'在某些场景中可能很方便(http://pyyaml.org/wiki/PythonTagScheme).


小智 6

这可以通过使用 PyYAML 提供的 Python 特定标签来完成,即:

!!python/object/apply:eval [ 1 * 24 * 60 * 60 ]
Run Code Online (Sandbox Code Playgroud)

如下所示:

In [1]: import yaml                                                                                                                             

In [2]: yaml.load("!!python/object/apply:eval [ 1 * 24 * 60 * 60 ]")                                                                            
Out[2]: 86400
Run Code Online (Sandbox Code Playgroud)

这自然与 perform 相同eval(config['some_time']),但使您不必在程序中显式处理它。