如何使用 default_factory 从 YAML 创建 Python 数据类?

问题描述 投票:0回答:1

我尝试直接从 YAML 描述创建数据类,其中一些属性具有默认值。

根据

py.yaml
的文档,我知道我可以注册一些标签来自动创建类并加载一些YAML。

将其与数据类结合起来,会得到类似的结果:

from dataclasses import dataclass, field

import yaml

@dataclass
class Person(yaml.YAMLObject):
    """A Person, to be loaded from YAML"""

    yaml_loader = yaml.SafeLoader
    yaml_tag = "!person"

    name: str
    parents: list[str]
    age: int = 0

我们可以使用以下两个 YAML 文件进行测试:

!person
name: John Toto
parents:
  - Jacques
  - Lily

!person
name: Jacques Toto
parents:
  - Olaf
  - Mary
age: 100

分别给出(我们可以看到

age
的默认值正在工作):

Person(name='John Toto', parents=['Jacques', 'Lily'], age=0)
Person(name='Jacques Toto', parents=['Olaf', 'Mary'], age=100)

但是,如何使用列表和字典(或任何其他需要使用

field(default_factory=...)
的属性?

例如下面这段代码:

@dataclass
class Person2(yaml.YAMLObject):
    """A Person, to be loaded from YAML"""

    yaml_loader = yaml.SafeLoader
    yaml_tag = "!person2"

    name: str
    parents: list[str] = field(default_factory=list)
    age: int = 0

p2 =  yaml.safe_load(
    """
!person2
name: Jacques Toto
age: 100
"""
)
print(p2)

尝试执行

print(p2)
时会出现以下异常:

File c:\Python311\Lib\dataclasses.py:240, in _recursive_repr.<locals>.wrapper(self)
    238 repr_running.add(key)
    239 try:
--> 240     result = user_function(self)
    241 finally:
    242     repr_running.discard(key)

File <string>:3, in __repr__(self)

AttributeError: 'Person2' object has no attribute 'parents'

如何使用

parents
方法向
default_factory
填充默认值?

python-3.x yaml python-dataclasses pyyaml
1个回答
0
投票

通过调试

pyyaml
创建类的代码,我们可以在库中找到这几行代码:

C:\Python311\Lib\site-packages\yam

© www.soinside.com 2019 - 2024. All rights reserved.