私の目標は、以前に定義したノードを簡単に「フィルタリング」できるようにすることです。次の架空の YAML ファイルについて考えてみます。
%YAML 1.1
---
- fruit: &fruitref { type: banana, color: yellow }
- another_fruit: !rotten *fruitref
*fruitref
カスタム関数(つまり、以前に定義されたオブジェクト、この場合はマップ) を引数として呼び出して戻り値を取得するには、YAML ファイルまたはこのファイルを解析する Python コードで何を定義する必要がありますか? ターゲットは、以前に定義された値 (マップ、シーケンスなど) を「フィルタリング」するためのシンプルで簡潔な構文です。
ノート
!
次のエラーのために、コンストラクトタグ *
エイリアスが無効な YAML であるように思われます。
expected <block end>, but found '<alias>'
in "/tmp/test.yaml", line 4, column 21
これは、必要な構文を達成できないことを意味する可能性が最も高いですが、簡潔さには気を配っています (というか、ターゲット ユーザーはそうするでしょう)。
通ったルート
YAML:!!python/object/apply:__main__.rotten [*fruitref]
機能しますが、意図した用途には冗長すぎます。複数の引数は必要ありません。ユースケースは常にエイリアス (以前に定義されたマップ/シーケンス/オブジェクト) のフィルターです。
YAML:%TAG !f! !!python/object/apply:__main__.
おそらく!f!rotten [*fruitref]
受け入れられるでしょうが、%TAG
ディレクティブを利用する方法が見つかりません。
編集: !!
PyYAML 3.10 では機能しないことがわかりました。次のような完全な URL でなければなりません。%TAG !f! %TAG !f! tag:yaml.org,2002:python/object/apply:__main__.
パイソン:yaml.add_constructor
add_constructor
クラスの特定のインスタンスにマップを「キャスト」するために既に使用しています。注意点は、タグ エイリアスが無効な YAML のように見えることです。
これまでで最高
add_constructor('!rotten', filter_rotten)
Python と!rotten [*fruitref]
YAML では機能しているようですが、可能であれば角括弧を省略する方法を考えています。