如何在 PyYAML dump() 期间获得一致的引号?

How to get consistent quotes during PyYAML dump()?

我想使用 PyYAML(使用 yaml.dump())将字典转储到 yaml 文件中。字典看起来像这样:

{'releases':
 {'release1': {'name': 'release1, 'version': '1.0.0', 'sha1': 'sha1'},
 {'release2': {'name': 'release2', 'version': '20', 'sha1': 'sha1'},
 {'release3': {'name': 'release3', 'version': '3.0', 'sha1': 'sha1'},
 ...

这些版本号可以有任何格式。例如。 1.0、2.0.1、30、v4、...
在转储期间,PyYAML 将单引号添加到可以解释为 float 或 int 的值。这是有道理的,似乎是有意为之。然而,这使得最终的 yaml 文件看起来非常不一致(无论如何它都是有效的):

releases:
  release1:
    name: release1
    sha1: sha1
    version: 1.0.0
  release2:
    name: release2
    sha1: sha1
    version: '20'
  release3:
    name: release3
    sha1: sha1
    version: '3.0'
...

有没有办法对所有版本号强制加引号?
我尝试使用 default_flow_style,但它不起作用或为我不想要的键和值添加引号。

如果您想控制 PyYAML 序列化值的方式,您需要一个自定义序列化程序,例如

class SingleQuoted(str):
  pass

def represent_single_quoted(dumper, data):
  return dumper.represent_scalar(BaseResolver.DEFAULT_SCALAR_TAG,
      data, style="'")

yaml.add_representer(SingleQuoted, represent_single_quoted)

如果有的话,您可以通过用 SingleQuoted 将任何值用单引号括起来强制序列化,例如

SingleQuoted('1.0.0')