我无法在PyYAML文档中找到如何执行此操作。我想代表我在YAML中定义的python类,并且如果未在YAML中指定,则将默认值赋予构造函数中的参数。例如:
>>> class Test(yaml.YAMLObject):
... yaml_tag = u"!Test"
... def __init__(self, foo, bar=3):
... self.foo = foo
... self.bar = bar
... def __repr__(self):
... return "%s(foo=%r, bar=%r)" % (self.__class__.__name__, self.foo, self.bar)
...
>>> yaml.load("""
... --- !Test
... foo: 5
... """)
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
File "<stdin>", line 7, in __repr__
AttributeError: 'Test' object has no attribute 'bar'
我期望它将使用
bar=3
创建一个Test对象,但是我猜想它在创建对象时会绕过我的构造函数。如果我在YAML中包括bar的映射,那么一切都会按预期进行:>>> yaml.load("""
... --- !Test
... foo: 5
... bar: 42
... """)
Test(foo=5, bar=42)
有谁知道我如何使用默认值?
最佳答案
我遇到了同样的问题:yaml_tag
由于某种原因无法正常工作。因此,我使用了替代方法:
import yaml
def constructor(loader, node) :
fields = loader.construct_mapping(node)
return Test(**fields)
yaml.add_constructor('!Test', constructor)
class Test(object) :
def __init__(self, foo, bar=3) :
self.foo = foo
self.bar = bar
def __repr__(self):
return "%s(foo=%r, bar=%r)" % (self.__class__.__name__, self.foo, self.bar)
print yaml.load("""
- !Test { foo: 1 }
- !Test { foo: 10, bar: 20 }""")
输出:
[Test(foo=1, bar=3), Test(foo=10, bar=20)]
关于python - pyyaml中的默认构造函数参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7224033/