【问题标题】:Performing arithmetic operation in YAML?在 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 中执行算术?

【问题讨论】:

    标签: python math yaml pyyaml


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-16
        • 1970-01-01
        • 2022-06-14
        • 2017-04-15
        相关资源
        最近更新 更多