我正在设计一个新的配置/数据格式,它将在YAML中。许多输入是int / float值,带有相关单位(例如升,夸脱,品脱,秒,分钟......)。
我一直在搜索和阅读,但仍然无法弄清楚:将值和单元关联到YAML中的配置项的最佳方法是什么? ?
示例:说我有几种饮料的清单,(除其他外),我想输入他们的音量。我可以想到几个方面,但(至少在我看来)它们都不是真正理想的:
要求所有音量值以相同的单位输入。
强制用户自己进行单位转换,这是单调乏味,容易出错,以后难以验证,因为现在数量输入与饮料列出的原始数量不同。 (饮料来自几个不同的来源,每个来源可能使用不同的度量单位。)
使用音量和单位序列表示值。示例:
volume: [ 0.5, Gallons ]
(映射也会起作用,虽然更详细)序列可能没问题,但我不确定我是否对此感到满意。
使用两个“音量”值,一个用于值,另一个用于单位。例如:
volume_value: 0.5
volume_units: Gallons
我认为这不是首发。详细,非常松散的关联,容易出错。
改为使用字符串并在应用程序中解析它。例如:
volume: 0.5 Gallons
最简单的输入,并且很容易编写一个健壮的解析器。看起来可能有点像黑客,但是......
应用程序代码:
volume: !gallons 0.5
不确定这个,因为我是YAML的新手并且还没有很好地理解标签。语法可能更脆弱一点。
所以,问题是:根据YAML规范,或事实上的最佳实践/约定,是否有一种表示价值+单位的特定方式?是否是我列出的五个中的一个或其他内容,我希望有一个“正确的答案”,留在网站问题指南。
答案 0 :(得分:1)
您应该认真考虑使用标记版本,因为这将允许您立即创建加仑实例,该实例可以是通用Volume类的衍生物,您可以在其上进行标准化计算。使用配置的代码将变得更加灵活。
如果这样做,请扩展您的库提供的安全加载程序,尤其是如果您无法完全控制配置文件的创建。如果你不使用解释语言(perl,python,ruby)加载它,你就有可能在计算机上运行任何代码的特殊配置。
如果标签不是您想要的方式,那么您还可以提供另一种替代方案,即嵌套映射:
volume:
Gallons: 0.5
或作为一个班轮:
volume: {Gallons: 0.5}
或者如果您愿意:
volume: {0.5: Gallons}
上述内容需要在加载后进行解释,就像您的选项2,3和4一样。
正如@denian关于使用字符串而不是浮点数的评论有一点,如果你想使用分数使用!decimalfraction "0.5"
进行计算,你可以这样做。在Python(PyYAML,ruamel.yaml)中,您可以调整YAML加载器,这样您就不需要在0.5
周围提供引号,但这会导致文件中的所有浮点数要作为字符串加载(然后可以通过十进制实例创建来解释而不会舍入错误)。
答案 1 :(得分:0)
我不确定最佳做法,但我会使用类似的东西:
Coca Cola: {unit: 0.5}
更详细的选项将是:
Pepsi: {value: 0.5, unit: gallons}
另一种选择是使用序列(YAML1.2规范的第2.4节)
-
name: Coca Cola
unit: gallons
value: 0.5
-
name: Pepsi
unit: gallons
value: 0.75
查看YAML规范,它有很好的例子。 http://www.yaml.org/spec/1.2/spec.html
答案 2 :(得分:0)
我最终得到了这种表述
volume : 0.5
volume_units : gallons
因为我将它与没有任何单位的物品一起使用更自然。 E.g。
experiment_setup :
volume : 0.5
volume_units : gal
vessel: cylinder
color: red
concentration: 10
concentration_units : mol
我可以通过自然名称一致地调用特定项目:
experiment_setup.volume
experiment_setup.color
并且不一致不喜欢
experiment_setup.volume.value
experiment_setup.color
或
experiment_setup.volume_value
experiment_setup.color