如何在YAML中表示价值+单位?

时间:2013-12-27 00:54:17

标签: yaml config

我正在设计一个新的配置/数据格式,它将在YAML中。许多输入是int / float值,带有相关单位(例如升,夸脱,品脱,秒,分钟......)。

我一直在搜索和阅读,但仍然无法弄清楚:将单元关联到YAML中的配置项的最佳方法是什么? ?

示例:说我有几种饮料的清单,(除其他外),我想输入他们的音量。我可以想到几个方面,但(至少在我看来)它们都不是真正理想的:

  1. 要求所有音量值以相同的单位输入。

    强制用户自己进行单位转换,这是单调乏味,容易出错,以后难以验证,因为现在数量输入与饮料列出的原始数量不同。 (饮料来自几个不同的来源,每个来源可能使用不同的度量单位。)

  2. 使用音量和单位序列表示值。示例:

    volume: [ 0.5, Gallons ]
    

    (映射也会起作用,虽然更详细)序列可能没问题,但我不确定我是否对此感到满意。

  3. 使用两个“音量”值,一个用于值,另一个用于单位。例如:

    volume_value: 0.5
    volume_units: Gallons
    

    我认为这不是首发。详细,非常松散的关联,容易出错。

  4. 改为使用字符串并在应用程序中解析它。例如:

    volume: 0.5 Gallons
    

    最简单的输入,并且很容易编写一个健壮的解析器。看起来可能有点像黑客,但是......

  5. 应用程序代码:

    volume: !gallons 0.5
    

    不确定这个,因为我是YAML的新手并且还没有很好地理解标签。语法可能更脆弱一点。


  6. 所以,问题是:根据YAML规范,或事实上的最佳实践/约定,是否有一种表示价值+单位的特定方式?是否是我列出的五个中的一个或其他内容,我希望有一个“正确的答案”,留在网站问题指南。

3 个答案:

答案 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