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()
相同。我找不到更好的方法来禁用类型标签。
是否可以为非标准 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()
相同。我找不到更好的方法来禁用类型标签。