YAML中如何进行算术运算?

33 投票
3 回答
34592 浏览
提问于 2025-04-18 18:39

有时候我需要在配置文件里指定时间(以秒为单位),但写确切的秒数挺麻烦的。我希望能做一些简单的数学运算,这样我就可以用:

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)。

撰写回答