これは私がやろうとしていることです (コードは Python 3 にあります):
import ruamel.yaml as yaml
from print import pprint
yaml_document_with_aliases = """
title: test
choices: &C
a: one
b: two
c: three
---
title: test 2
choices: *C
"""
items = list(yaml.load_all(yaml_document_with_aliases))
結果は次のとおりです。
ComposerError: found undefined alias 'C'
非ドキュメントベースの YAML ファイルを使用している場合、これは期待どおりに機能します。
import ruamel.yaml as yaml
from print import pprint
yaml_nodes_with_aliases = """
-
title: test
choices: &C
a: one
b: two
c: three
-
title: test 2
choices: *C
"""
items = yaml.load(yaml_nodes_with_aliases)
pprint(items)
結果:
[{'choices': {'a': 'one', 'b': 'two', 'c': 'three'}, 'title': 'test'},
{'choices': {'a': 'one', 'b': 'two', 'c': 'three'}, 'title': 'test 2'}]
(とにかくやりたかったこと)
現時点では不可能なので、次の脆弱な回避策を使用しています。
def yaml_load_all_with_aliases(yaml_text):
if not yaml_text.startswith('---'):
yaml_text = '---\n' + yaml_text
for pat, repl in [('^', ' '), ('^\s*---\s*$', '-'), ('^\s+\.{3}$\n', '')]:
yaml_text = re.sub(pat, repl, yaml_text, flags=re.MULTILINE)
yaml_text = yaml_text.strip()
return yaml.safe_load(yaml_text)