最上位ノードのアンカー値を強制するカスタム アンカー クラスを作成しました。単純にアンカー文字列をオーバーライドする (generate_anchor を使用) のではなく、ノードが後で参照されない場合でも、実際には Anchor を強制的に発行します。
class CustomAnchor(yaml.Dumper):
def __init__(self, *args, **kwargs):
super(CustomAnchor, self).__init__(*args, **kwargs)
self.depth = 0
self.basekey = None
self.newanchors = {}
def anchor_node(self, node):
self.depth += 1
if self.depth == 2:
assert isinstance(node, yaml.ScalarNode), "yaml node not a string: %s" % node
self.basekey = str(node.value)
node.value = self.basekey + "_ALIAS"
if self.depth == 3:
assert self.basekey, "could not find base key for value: %s" % node
self.newanchors[node] = self.basekey
super(CustomAnchor, self).anchor_node(node)
if self.newanchors:
self.anchors.update(self.newanchors)
self.newanchors.clear()
ノード名をオーバーライドして「_ALIAS」という接尾辞を付けますが、その行を削除してノード名とアンカー名を同じままにするか、別のものに変更することができます。
たとえば、 {'FOO': 'BAR'} をダンプすると、次のようになります。
FOO_ALIAS: &FOO BAR
また、一度に 1 つのトップ レベルのキーと値のペアを処理するためにのみ記述し、トップ レベルのキーのアンカーのみを強制します。すべてのキーが最上位の YAML ノードである YAML ファイルに dict を変換する場合は、dict を反復処理し、各キーと値のペアを {key:value} としてダンプするか、このクラスを書き直して、複数のキーを持つ dict 。