13

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、オブジェクトを作成するときにコンストラクターをバイパスすると思います。YAMLにバーのマッピングを含めると、すべてが期待どおりに機能します。

>>> yaml.load("""
... --- !Test
... foo: 5
... bar: 42
... """)
Test(foo=5, bar=42)

デフォルト値を使用させる方法を知っている人はいますか?

4

3 に答える 3

12

私は同じ問題に遭遇しました: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)]
于 2011-08-29T07:32:28.373 に答える