web-dev-qa-db-ja.com

YAMLでの文字列補間

Perlでは、次のようなことができます。

my $home = "/home";
my $alice = "$home/alice";

YAMLで次のようなことを行うことはできますか?

Home: /home
Alice: $Home/alice

したがって、「アリス」は事実上/home/alice 最終的には?

13
Clinton

残念ながら、あなたは運が悪いです。やりたいことを行うには、ビューファイル(またはどこでも)から$homeを渡して、yamlエントリに補間する必要があります。これは次のようになります。

Alice: ! '%{home}/Alice' 

ほぼ正確にあなたの質問に対する詳細な答えについては、 このStackOverflow Q&A を参照してください。

9
Paul Fioravanti

ERBテンプレートを使用する必要があります。

次のように書くことができます:

Alice: <%=home%>/alice

使用する場合は、YAMLとして解析する前にERBでhome値を解析する必要があります。 homeがローカル変数の場合、ローカルバインディングを#resultメソッドの引数として渡す必要があります。これを渡さない場合、デフォルトとしてTOPLEVELバインディングが使用されます。

このような:

require 'erb'

home = 'home'
YAML.load(ERB.new(yaml_content).result(binding))
9
zw963

最近、これをPythonで探していて、GithubのAwesomeYAMLリポジトリからdynamic-yamlパッケージに出くわしました。

Link Awesome YAML Github Repo: https://github.com/dreftymac/awesome-yaml#parsers Python用の動的YAMLのリンク: https://github.com/childsish/dynamic- yaml

お役に立てれば!

編集:コメントは正しく、リンクが壊れている可能性があるため、簡単な例を次に示します。

次のようなYAMLファイルがある場合:

house:
    street: cool_street_name
    number: 45
    street_and_number: {house.street}-{house.number}

python -m pip install dynamic_yamlを指定してdynamic_yamlをインストールし、次のスクリプトを実行します。

import dynamic_yaml

with open(path_to_yaml_file, 'r') as f:
    data = dynamic_yaml.load(f)

次に、次のようになります。

print(data['house']['street_and_number'])
>> cool_street_name-45
3
Kilian Michiels

最終的に YAML::AppConfig を使用しましたが、確かにそれはYAMLソリューションではなく、Perl固有のソリューションです。これにより、YAMLに補間される$varsを含めることができます。

2
Clinton

Ygl を使用すると、次のように例を記述できます。

Home: /home
Alice: !? .Home + '/alice'

または

Home: /home
Alice: !? ('{0}/alice').format($_.Home)

免責事項:私はYgluの作者です。

0
lbovet