astgithub.com個人的にコード生成をするときにはprestringというパッケージをベースにして行うことが多い。テンプレートエンジンによるコード生成やASTを直接触る方法との差分は別の機会に書くとして今回追加しようとした機能についてまとめておく。コード生成コード生成というのは何かの入力を元に何らかのコードを生成するもののこと。<生成されたコード>swagger関係のものなど巷にはコード生成用のツールが溢れていたりはする。自分たちの利用している環境(コード)に則さないなどちょっと不便さを感じたときには調整する必要が出てきたりする。この調整に結構手間取ることが多い。自分で作るとなると今度はコード生成用のコードが必要になる(当たり前だけれど)。コード生成用のコードここでのコード生成用のコードというのは実行するとソースコードになるコードのこと。以下の様なコードを実行するとpythonのコードを出力する。{message}")')withがたくさん出てくる以外はある程度出力結果が透けて見える程度の構文。あるのだけど手書きするのが面倒。ファイルへの出力、実行速度など考えるべきことは他にも色々あるけれど今回は省略)。コードからコード生成用のコードを生成するコード生成用のコードを書き始めるタイミングでは、出力後のコードのサンプルをリテラル的にそのまま書き下したいと言うことが多い。慣れればコード生成用のコードをそのまま直に書くということもできるようになっては来るのだけれど。めんどくさい(ちなみにテンプレートエンジンでのコード生成は、このあたりのフェーズではけっこう高速に作業することができて、単にテンプレートに直接出力後のコードの文字列を記述するだけで良い)。この部分をどうにかしようという話。入力として出力後のコード例を受け取って、ASTを作り、ASTから出力用のコードを生成すれば良さそう。<生成されたコード>例えば先程のhello.pyのコードを生成したい場合には以下の様なコードを書く。print(m)transform_stringがコードの文字列を渡すと良い感じにやってくれる。inspectパッケージのgetsourceで自分自身のソースコードを取ってこれるのでこれを渡している。以下のような出力になる。毎回コードを書くのも面倒なのでコマンドとしても使えるようにした。入力としてソースコードのファイルを取る。{message}")')print(m)直接実行できるようなコードが生成されるので生成された結果を確かめられる。mを渡さなくても同様の振る舞いになるがこのあたりの挙動は変更するかもしれない。途中で力尽きたのでおまけに近い。ASTからのコード生成pythonでASTを触るライブラリはたくさんあるのだけれど。標準ライブラリの範囲でやることにした。標準ライブラリのastパッケージはたしかコメントなどの情報が消えてしまったような記憶がある。そんなわけで2to3(python2.xからpython3.xへの変換用のツール)に使われているライブラリのlib2to3を拝借して使うことにした。ちなみにyapfというコードフォーマッターもこのライブラリを使っている。prestring.python.parseに小さなコード片を書いた。transformと同様の感じで以下の様な関数がある。parse_fileparse_stringlib2to3のnodeはけっこう便利で、文字列化すると自動でソースコードになる。{message}")作ったASTはdump_treeで出力できる。parse_file("./hello.py")dump_tree(t)小さめのコードを渡しても出力が長い。prefix='']ちなみにloggingライブラリのコードを変換するとこんな感じになります。pyinspectというものを地味に作っている。...2017-06-27docutils用にsphinxのliteralincludeのsubsetを作って使ってみる。sphinxで利用可能なdirectiveの1つ。componentという機能を追加した月別アーカイブはてなブログをはじめよう!podhmoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。