16

私は PyYAML で YAML を使用しています。ネストされた構造をダンプした後に *id002 参照を回避する方法はありますか? 読みやすくするために、そこに実際の (タプル) 値を表示したいと思います。

小さな例を作成しようとしているときに、同じ id オブジェクトを使用した場合にのみ発生することに気付きました。

import yaml

t = ("b", "c")
x = {(1, t):1, (2, t):2, }
print(yaml.dump(x))

だから私copy.copy()は問題を解決すると思ったが、タプルの場合はうまくいかないようだ:(別のIDで新しいタプルを作成できますか?

4

2 に答える 2

21

PyYAML ダンパーは、ignore_aliasesメソッドを使用して、プリミティブ型がこのように「固定」および「参照」されるのを防ぎます。そのメソッドをオーバーライドして、渡されたオブジェクトに関係なく常に ignore_aliases にすることができます。デフォルトでは、yaml.Loaderクラスはyaml.load¹で使用されます。

t = ("b", "c")
x = {(1, t):1, (2, t):2, }

yaml.Dumper.ignore_aliases = lambda *args : True

yaml.dump(x, sys.stdout)

あなたを得るでしょう:

? !!python/tuple
- 1
- !!python/tuple [b, c]
: 1
? !!python/tuple
- 2
- !!python/tuple [b, c]
: 2

そうすれば、最善を尽くして、同じハッシュを持つタプルを別のものに見せる必要がなくなります。default_flow_styleパラメーターを指定yaml.loadFalseたりTrue、出力のさまざまなレイアウトを取得したりすることができます。

これを機能させることができなかった理由はid()、要素が同じである限り、代表者が の結果と一致し、それが別々に生成された 2 つのタプルで同じであるためです。


¹私が作成したruamel.yamlでのみこれを試しました。これは PyYAMLの拡張バージョンですが、どちらも同じように動作するはずです。

于 2015-06-06T12:02:41.253 に答える