在研究ruamel.yaml(https://yaml.readthedocs.io/en/latest/dumpcls.html)时,我注意到可以使用YAML.register_class()
或@yaml_object(yaml)
来注册课程。此外,似乎两个函数的实现几乎相同,只是内部函数名称如此。
我的印象是此@yaml_object(yaml)
总是可以用@yaml.register_class
代替(即使用object方法作为装饰器。在保持向后兼容性的同时,我认为@yaml_object(yaml)(cls)
可以被重新实现为return yaml.register_class(cls)
,从而减少了代码重复。
示例:
import sys
from dataclasses import dataclass
from ruamel.yaml import YAML, yaml_object
yaml = YAML()
@yaml.register_class
@dataclass
class Asdf:
foo: int
bar: int
yaml.dump(Asdf(1,2), sys.stdout)
打印
!Asdf
foo: 1
bar: 2
在任何情况下这都行不通吗?还是包裹的作者错过了?
答案 0 :(得分:1)
是可以的,但是直到register_class
实际返回cls
为止。
此返回cls
是在2018-07-12引入的,决议为issue #186。
如果您这样做:
import sys
from ruamel.yaml import YAML, yaml_object
yaml = YAML()
def yaml_object(yml):
return yml.register_class
@yaml_object(yaml)
class Asdf:
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
yaml.dump(Asdf(1,2), sys.stdout)
它给出:
!Asdf
foo: 1
bar: 2