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に著作権表示以外のものを放り込んでいるのはご愛敬。