YAML.register_class()和yaml_object(yml)()之间重复吗?

时间:2018-07-24 10:46:46

标签: python yaml ruamel.yaml

在研究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

在任何情况下这都行不通吗?还是包裹的作者错过了?

1 个答案:

答案 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