在 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 实例时需要一个类,但在“我搜索了一种方法,但没有任何成功,但我使用了以下方法来解决它:
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 中执行算术运算