0
0

pyYAMLで読み込み時に動的に変わる設定ファイルを書く

Last updated at Posted at 2024-02-29

TL;DR

- !!python/object/apply:eval ['hogehoge']

なぜそんなことを

mkDocsで文書を作ってて、最終更新日時を自動で埋め込みたくなった。

pyYAMLの黒魔術

YAMLで設定ファイルを書く系のpython製ツールの多くはpyYAMLを使って設定ファイルを読んでいるが、pyYAMLにはデータ型を指定したりするためのタグによる拡張が含まれている。

YAML tags and Python types - PyYAML Documentation

この中の !!python/object/apply を使うと、限定的ではあるけど、pythonの関数呼び出しが実現できる。

使えそうな関数

os.getenv

!!python/object/apply:os.getenv ['環境変数名', 'デフォルト値']]

環境変数を取り込める。あとは mkdocs build を呼び出すラッパースクリプトにでも値を入れれば好きな値を注入できる。

operator.add, operator.concat

!!python/object/apply:operator.add [文字列1, 文字列2]

他のタグで作った文字列を他の文字列と連結できる。なお、2項演算子の関数化でしかないので、リストに3つ文字列を入れると容赦なくエラーになるので、適宜入れ子にする必要がある。

eval

!!python/object/apply:eval ['python statement']

呼び出し元でimportされていないモジュールを使うとかでない限り、ほぼ何でもできる。これを知ってれば↑のは実は要らないけど、気持ち悪いのは理解できる。

最終的にこんな風になった

mkdocs.yml
copyright: !!python/object/apply:operator.concat ['<a href="hogehoge">hogehoge</a><br>Last Modified: ', !!python/object/apply:eval ['datetime.date.today().isoformat()']]

copyrightに著作権表示以外のものを放り込んでいるのはご愛敬。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0