YAML中如何进行算术运算?
有时候我需要在配置文件里指定时间(以秒为单位),但写确切的秒数挺麻烦的。我希望能做一些简单的数学运算,这样我就可以用:
some_time: 1 * 24 * 60 * 60
而不是写成确切的:
some_time: 86400
可惜的是,当我使用这一行:some_time: 1 * 24 * 60 * 60
时,它会把这一行当成字符串来处理。当然,我可以用 - eval(config['some_time'])
来计算,但我想知道在YAML里是否可以直接进行数学运算?
3 个回答
0
我找了很多方法来解决这个问题,但都没有成功。不过我找到了一种变通的方法,下面是我用的代码:
import yaml
from box import Box
file = """
data:
train_size: 100**2
test_size: 10**2
"""
config = Box(yaml.safe_load(file))
tr_size = eval(config.data.train_size)
# 100**2 -> 10000
ts_size = eval(config.data.test_size)
# 10**2 -> 100
9
这可以通过使用PyYAML提供的Python特定标签来实现,也就是:
!!python/object/apply:eval [ 1 * 24 * 60 * 60 ]
下面的示例演示了这一点:
In [1]: import yaml
In [2]: yaml.load("!!python/object/apply:eval [ 1 * 24 * 60 * 60 ]")
Out[2]: 86400
这实际上和执行 eval(config['some_time'])
是一样的,但这样做可以让你在程序中不必显式地处理它。
19
我觉得没有。至少在规范上是没有的(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)。