コンテンツにスキップ

[PyYAML] アンカーとエイリアスを使わずに出力する

PyYAML が重複データをアンカー(&id001)とエイリアス(*id001)で出力するとき、参照を使わず同じ値を繰り返して出力する方法を示す。

次のコードのように 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

アンカーとエイリアスを使わず同じデータをそれぞれ出力するには、ignore_aliasesの挙動を変える。次に示すように、Dumper クラスの継承と 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

参考