トップ 最新 追記

本 日 の h o g e

hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。

更新情報の取得には rdflirs を使ってもらえると嬉しいです.


02/14/2012 ふむ [長年日記]

tDiary 3400日目

[Py] アンドロイドはニシキヘビのコードを書くか?

コード書きなら誰もが 1 度は通るであろう道を適当に通ってみた. Python コードの自動生成

$ python pycodegen.py *.py

という感じに pycodebattler のコード を学習させて自動生成してみたら,こんなのが出来上がった.

try :
    set ,frozenset 
except NameError :
    from optparse import OptionParser 

    parser =OptionParser (usage ='%prog [options] file1 file2 ...')
    parser .add_option ('-C',action ='store_true',help ='no color output')
    parser .add_option ('-C',action ='store_true',help ='no wait per each turn')
    options ,args =parser .parse_args ()


class Warrior :
    def range (self ):
        return self .hitpoint ()>self .max_hitpoint ()

なんだこの意味不明なコードは.

メカニズム

だいたいざっくり言うと以下のような感じ. エラーになった場合は延々やり直す. 巨大なテーブルは作るわランダムだからおかしな構文が量産されるわで恐ろしく効率が悪い.というかほとんど無理矢理.

  1. ソースコードをトークン分割して学習
  2. ランダムにマルコフ連鎖してトークン列を取得
  3. トークン列からソースコードを再構築
  4. ソースコードから構文木を生成してチェック
  5. print する

各フェーズで使っているものは以下のような感じ.

ソースコードのトークン分割とトークン列からのソースコード再構築:

Python には tokenize という便利なモジュールがある.

こいつの generate_tokens 関数 (多分 tokenize 関数でも可),untokenize 関数を使えばトークン列への分割とトークン列からのソースコードの再構築を行うことができる.

ソースコードから構文木を生成:

Python には ast という便利なモジュールがある.

こいつの parse 関数を使えばソースコードを走査して構文木をオブジェクトにして返してくれる. ビルトイン関数 compile を使うのと等価のようだけど,結局 ast を import しないといけないあたりに謎を感じる.

構文木をチェックする:

Python コードのチェッカーに pyflakes というものがある. pylint とか pychecker とか似たようなものは色々あるけれど,とりあえずライブラリとしても使いやすそうだったので pyflakes を使ってみた.

構文木オブジェクトを pyflakes.checker.Checker に食わせるとエラーメッセージを蓄えてくれるらしい. あとはメッセージのあるなしを見てやれば良い.

結論

てかやっぱ意味もなくただ繋げていくだけじゃダメだよね. という当たり前の結論に達しましたとさ.