コンテンツにスキップ

[PyYAML] 参照による抽象化をやめる

次のコードのように PyYAML を使って出力する際は、重複するデータを参照によって抽象化することがある。

1
2
3
4
5
6
7
8
9
import yaml

sample_dict = {
    "key1": "value1",
    "key2": "value2",
}
yaml_data = [sample_dict, sample_dict]

print(yaml.dump(yaml_data))

上記のコードを実行すると、次のような YAML ファイルが出力される。

1
2
3
4
- &id001
  key1: value1
  key2: value2
- *id001

これを抽象化せずに重複するデータをそのまま出力するには、次のように Dumper クラスを継承して、ignore_aliases メソッドをオーバーライドするか、 lambda 関数で対応する。

import yaml

class NoAliasDumper(yaml.Dumper):
    def ignore_aliases(self, data):
        return True

sample_dict = {
    "key1": "value1",
    "key2": "value2",
}
yaml_data = [sample_dict, sample_dict]

print(yaml.dump(yaml_data, Dumper=NoAliasDumper))

# or
no_alias_dumper = yaml.dumper.Dumper
no_alias_dumper.ignore_aliases = lambda self, data: True
print(yaml.dump(yaml_data, Dumper=no_alias_dumper))

上記のコードを実行すると、次のような YAML ファイルが出力される。

1
2
3
4
- key1: value1
  key2: value2
- key1: value1
  key2: value2

参考