首页 > 解决方案 > YAML.register_class() 和 yaml_object(yml)() 之间的重复?

问题描述

在研究 ruamel.yaml ( https://yaml.readthedocs.io/en/latest/dumpcls.html ) 时,我注意到注册类可以使用YAML.register_class()或来完成@yaml_object(yaml)。此外,这两个函数的实现似乎几乎相同,直至内部函数名称。

我的印象是,这@yaml_object(yaml)总是可以替换为@yaml.register_class(即使用对象方法作为装饰器。在保持向后兼容性的同时,我认为@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

有没有这样行不通的情况?或者这是包的作者错过的东西?

标签: pythonyamlruamel.yaml

解决方案


是的,这是可能的,但这只是现在才register_class真正返回cls.

此回归cls于 2018-07-12 引入,解决问题 #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

推荐阅读