我尝试直接从 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
填充默认值?
通过调试
pyyaml
创建类的代码,我们可以在库中找到这几行代码:
C:\Python311\Lib\site-packages\yam