如何转储带有前导零的 int 的 YAML?

How to dump a YAML with an int with leading zeros?

我需要转储带有前导零的整数,但不是字符串形式。 我可以通过这种方式像字符串一样转储它:

import sys
from ruamel.yaml import YAML

data = {'identifier': '001'}

yaml = YAML()
yaml.dump(data, sys.stdout)

结果是:

identifier: '001'

我不需要转储为字符串,而是转储为数字。
我需要这样的结果:

identifier: 001

我该怎么做?

>>> data = {'identifier': 0o001}

这将转换为整数。但是,不是您指定的格式。

如果需要检查是否可以生成特定输出,首先要做的是 尝试 round-trip 结果:

import sys
import ruamel.yaml

yaml_str = """\
identifier: 001
"""
    
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
data['another'] = double_o_one = data['identifier']
yaml.dump(data, sys.stdout)

给出:

identifier: 001
another: 001

所以这证明这可以通过编程方式完成,如果最坏的情况发生并且 你不知道如何从头开始制作 double_o_one,你可以 从字符串加载它。

如果你再调查一下,看看 scalarint.py 的来源:

print(type(double_o_one))
print(double_o_one.__dict__)
print()

data['james'] = double_o_seven = ruamel.yaml.scalarint.ScalarInt(7, width=3)
yaml.dump(data, sys.stdout)

这给出了:

<class 'ruamel.yaml.scalarint.ScalarInt'>
{'_width': 3, '_underscore': None}

identifier: 001
another: 001
james: 007

因此,如果您从字符串 x = '001' 开始,您会 x = ScalarInt(int(x), len(x))