在 YAML 中执行算术运算?

Posted

技术标签:

【中文标题】在 YAML 中执行算术运算?【英文标题】:Performing arithmetic operation in YAML? 【发布时间】:2014-10-20 10:27:07 【问题描述】:

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

some_time: 1 * 24 * 60 * 60

而不是精确:

some_time: 86400

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

【问题讨论】:

【参考方案1】:

我认为没有。至少不符合规范 (http://yaml.org/spec/1.2/spec.html)。人们向 yaml 添加了非官方标签(***似乎说有一个产量标签的提议,尽管他们没有说是谁提出的或在哪里提出的:http://en.wikipedia.org/wiki/YAML#cite_note-16),但在 pyyaml 中似乎没有你需要的东西。

查看 pyyaml 特定标签似乎没有什么有趣的东西。虽然!!timestamp '2014-08-26' 在您的某些情况下可能会很方便(http://pyyaml.org/wiki/PythonTagScheme)。

【讨论】:

【参考方案2】:

这可以通过使用 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']) 相同,但您不必在程序中显式处理它。

【讨论】:

Python3 错误:ConstructorError:在构建 Python 实例时需要一个类,但在“”第 1 行第 1 列中找到了 :!!python/object/应用:eval [ 1 * ... 对来自配置文件的输入进行评估是非常危险的。请不要这样做,除非是出于个人目的。【参考方案3】:

我搜索了一种方法,但没有任何成功,但我使用了以下方法来解决它:

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

【讨论】:

以上是关于在 YAML 中执行算术运算?的主要内容,如果未能解决你的问题,请参考以下文章

如何将金额类型更改为数字类型以在javascript中执行算术运算

获取 badarith,[erlang,'+',[error,0],[],同时使用 Erlang 片段在 TSUNG 中执行算术运算

C 指针的算术运算

C 指针的算术运算

JavaScript 算术

MATLAB-算术运算