PyYAML:如何为非标准对象设置默认表示?

PyYAML: How to set a default representer for non-standard objects?

是否可以为非标准 Python 对象指定默认的 PyYAML 表示器?

import yaml
class Foo(int): pass 
class Bar(float): pass

data = dict(foo=Foo(42), bar=Bar(3.14), baz=[1,2])
print(yaml.safe_dump(data))
# Raises error: 
#     RepresenterError: ('cannot represent an object', ...)

print(yaml.dump(data))
# Prints:
#     bar: !!python/object/new:__main__.Bar
#     - 3.14
#     baz:
#     - 1
#     - 2
#     foo: !!python/object/new:__main__.Foo
#     - 42

如何指示 PyYAML 对所有非标准对象使用默认表示器?例如,我想调用对象的 __str__()__repr__() 方法 iff​​ 它不能被安全地表示。

我很幸运采用了以下“幼稚”的方法:

import yaml
class Foo(int): pass 
class Bar(float): pass
data = dict(foo=Foo(42), bar=Bar(3.14), baz=[1,2])

# Set default representer
def default_representer(dumper, data):
    # Alternatively, use repr() instead str():
    return dumper.represent_scalar('tag:yaml.org,2002:str', str(data))
yaml.representer.SafeRepresenter.add_representer(None, default_representer)

# Now this works as expected: unknown objects 
# are printed as strings.
print(yaml.safe_dump(data))
# Prints:
#     bar: '3.14'
#     baz:
#     - 1
#     - 2
#     foo: '42'

为了也通过 yaml.dump() 完成这项工作,我设置了 Dumper 参数:

print(yaml.dump(data, Dumper=yaml.SafeDumper))

然而,这使得它在本质上与yaml.safe_dump()相同。我找不到更好的方法来禁用类型标签。