【问题标题】:ruamel.yaml weird behavior when dumping floatsruamel.yaml 倾倒浮动时的奇怪行为
【发布时间】:2020-08-24 12:39:45
【问题描述】:

当我阅读我的 YAML 时,如果我使用有序的 dict 打印就可以了,但是当我转储它时,我的浮点数会以某种方式被冲洗掉。

这是一个最小的工作示例

import sys
import ruamel.yaml

yaml = ruamel.yaml.YAML()   

s = 'f: [2330.0e6, 2338.0e6]'
d = yaml.load(s)

yaml.dump(dict, sys.stdout)
print(d)

这个输出

f: [2330.0e6, 2340.0e6]
ordereddict([('f', [2330000000.0, 2338000000.0])])

有序的字典是正确的,但是 YAML 转储将数字更改为 2340...

我做错了什么?

【问题讨论】:

    标签: python yaml pyyaml ruamel.yaml


    【解决方案1】:

    你展示的可能不是整个节目。

    你正在加载到变量d,但是你正在转储dict,后者通常会给出一个RepresenterError,因为内置的dict类本身不能被转储(当然它的一个实例可以 被抛弃)

    如果我在 python 3.8 上运行:

    import sys
    import ruamel.yaml
    
    yaml = ruamel.yaml.YAML()   
    
    s = 'f: [2330.0e6, 2338.0e6]'
    d = yaml.load(s)
    
    yaml.dump(d, sys.stdout)
    print(d)
    

    我明白了

    f: [2330.0e6, 2338.0e6]
    ordereddict([('f', [2330000000.0, 2338000000.0])])
    

    正如预期的那样。

    【讨论】:

    • 我在 2.7,但也许我应该尝试升级 ruamel.yaml?
    • 另外,这不是一个完整的程序,它是一个最小的工作示例。如果问题可以用 7 行来证明,就没有理由包含 500 行代码:)
    • Python 2.7 提供与 Python 3.8 相同的 ReprsenterError,因此这不是输出,您的程序的其余部分以某种方式使用 dict 作为变量。升级 ruamel.yaml 可能会有所帮助,但我不记得像你描述的那样修复了一个错误。
    【解决方案2】:

    Anthon 提供的答案启发了我升级我的 ruamel.yaml(从 0.15 开始)。我使用的是 Python 2.7(我知道它不再受支持,长篇大论......)

    无论如何,pip install --upgrad ruamel.yaml 解决了这个问题 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      相关资源
      最近更新 更多