8

次のようなYAML ファイル ( all.yaml) があります。

...
var1: val1
var2: val2
var3: {{var1}}-{{var2}}.txt
...

次のようにPythonでロードすると:

import yaml

f = open('all.yaml')
dataMap = yaml.safe_load(f)
f.close()
print(dataMap["var3"])

出力は{{var1}}-{{var2}}.txtありませんval1-val2.txt

ネストされた変数を値に置き換えることは可能ですか?

私はそれをロードしようとしました:

import jinja2
templateLoader = jinja2.FileSystemLoader( searchpath="/path/to/dir" )
templateEnv = jinja2.Environment( loader=templateLoader )
TEMPLATE_FILE = "all.yaml"
template = templateEnv.get_template( TEMPLATE_FILE )

例外はスローされなくなりました。今は行き詰まっており、続行する方法を調査する必要があります。

4

4 に答える 4

0

YAML 仕様内のスカラー部分の置換/置換はありません。

そのレベルでやりたいことはすべて、アプリケーションで実行する必要があります。私にとって、そして YAML にとって{{var1}}は、ネストされたマッピングにすぎません。{{var1}}の略です{{var1: null}: null}。それ以降-は不可です。

ただし、投稿には複数の問題があります。

  1. 古い (2005) YAML 1.1 のみをサポートする PyYAML を使用しています。したがって、YAML 1.2 でできるように...、明示的なドキュメント開始 () を使用せずに複数のドキュメント (つまり、で終わる) を持つことはできません。---

  2. ---ファイルの代わりに読み取るように最初の行を修正しても、辞書の後にスカラーを続けることができないため...、ファイルはロードされません(から){{var1}}--{{var2}}.txt

  3. また、ファイルで使用するだけの場合{{var1}}、PyYAML は YAML マッピングを Python dict としてロードし、Python は dict の変更可能なキーを許可しないため、これをロードできません。TypeErrorやろうとしたときにPythonで取得するのと同じように:{dict(var1=None): None}

したがって、少なくとも入力ファイルall.yamlを次のように変更する必要があります。

---
var1: val1
var2: val2
var3: '{{var1}}-{{var2}}.txt'
...

これを取得して YAML にロードします。

このファイルを 2 回ロードする必要があります。

  • テンプレートをレンダリングするために使用できる値を取得するために PyYAML で 1 回
  • jinja2によるテンプレートとして1回

テンプレートをレンダリングした後、その (文字列) をもう一度 PyYAML にロードすると、必要な値が得られます。

all.yaml現在のディレクトリとこのプログラムで上記のように修正された場合:

import yaml
import jinja2

YAML_FILE = 'all.yaml'
with open(YAML_FILE) as fp:
    dataMap = yaml.safe_load(fp)

env = jinja2.Environment(loader=jinja2.FileSystemLoader(searchpath='.'))
template = env.get_template(YAML_FILE)

data = yaml.safe_load(template.render(**dataMap))
print(data["var3"])

あなたが望むものを印刷します:

val1-val2.txt
于 2015-08-12T14:21:23.330 に答える