0

私の目標は、以前に定義したノードを簡単に「フィルタリング」できるようにすることです。次の架空の 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 では機能しているようですが、可能であれば角括弧を省略する方法を考えています。

4

1 に答える 1

0

すでにタグ付けされた参照にタグを適用することはできないようです。

!tag *reference

は受け入れられません。最善の解決策は、参照を角かっこで囲み (シーケンスを作成)、タグを関数呼び出しまたは 1 つのオブジェクトのシーケンスを期待する特別なコンストラクターにすることです。したがって、利用可能な最も簡潔な構文は次のとおりです。

!prefix!suffix [*reference]

また

!tag [*reference]
于 2014-04-28T10:05:16.977 に答える