2017-08-02 10 views
1

ruamel.yamlライブラリを使用してYAMLファイルをロードするときに逆シリアル化できるように、正しいfrom_yamlメソッドをクラスに書き込もうとしています。YAMLをPythonオブジェクトに逆シリアル化する

のは、私のto_yamlクラスメソッドで私のようなものを返すんだと仮定しましょう:私はTypeErrorを取得し、逆シリアル化する方法では今これにより

@classmethod 
def from_yaml(cls, constructor, node): 
    dict_representation = constructor.construct_mapping(node, deep=True) 

@classmethod 
def to_yaml(cls, dumper, data): 
    dict_representation = { 
     'foo': data.foo, 
     'bar': data.bar 
    } 

    return dumper.represent_mapping(cls.yaml_tag, dict_representation) 

を:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-6-782b00e19bec> in <module>() 
----> 1 dict_representation = yaml.constructor.construct_mapping(node, deep=True) 

/home/**/.envs/myenv/local/lib/python2.7/site-packages/ruamel/yaml/constructor.pyc in construct_mapping(self, node, maptyp, deep) 
    1186       "found unhashable key", key_node.start_mark) 
    1187    value = self.construct_object(value_node, deep=deep) 
-> 1188    self.check_mapping_key(node, key_node, maptyp, key, value) 
    1189 
    1190    if key_node.comment and len(key_node.comment) > 4 and \ 

/home/**/.envs/myenv/local/lib/python2.7/site-packages/ruamel/yaml/constructor.pyc in check_mapping_key(self, node, key_node, mapping, key, value) 
    241  def check_mapping_key(self, node, key_node, mapping, key, value): 
    242   # type: (Any, Any, Any, Any, Any) -> None 
--> 243   if key in mapping: 
    244    if not self.allow_duplicate_keys: 
    245     args = [ 

TypeError: argument of type 'NoneType' is not iterable 

実際にこれをもっと経験的にやってみると、タイブシェル:

も同じ例外が発生します。私はここで何が欠けていますか?コメントのようなものは、ノードから取り出され、そのインスタンスに取り付けることができるように、ラウンドトリップ動作させるために、RoundTripConstructor()ニーズにconstruct_mapping()インスタンスTYP実際のマッピングは、渡されたゲットする

+0

例外の完全なスタックトレースと、使用しているyamlライブラリの名前を投稿すると、人々が手助けする方が簡単になります。 – Vasil

答えて

1

(通常CommentedMap() )。ラウンドトリップしていないロードを実行するときは、コメント情報を渡す必要がないため、余分なパラメータは必要ありません。

このメソッドは、提供されていない場合、つまり、NoneType is not iterableの例外を取得する場所であるマッピングタイプとして、デフォルトでは、現在のところ、スマートに設計されている可能性があります。

あなたの質問の最後にコードを起動するには、あなただけ行うことでシンプルなマッピングのコンストラクタを呼び出すことができます。

dict_representation = ruamel.yaml.constructor.SafeConstructor.construct_mapping(
    yaml.constructor, node) 

あなたfrom_yaml()クラスメソッドは、同じように動作するはずです:

@classmethod 
def from_yaml(cls, constructor, node): 
    dict_representation = ruamel.yaml.constructor.SafeConstructor.construct_mapping(
     constructor, node, deep=True) 

複雑なタイプ(間接的にアクセス可能な値がこのノードを参照する可能性がある)を作成する場合は、2段階の作成プロセスを使用することを検討する必要があります。

@classmethod 
def from_yaml(cls, constructor, node): 
    dict_representation = dict() 
    yield dict_representation 
    d = ruamel.yaml.constructor.SafeConstructor.construct_mapping(
     constructor, node, deep=True) 
    dict_representation.update(d) 
関連する問題