IBM からのお知らせ : 申し訳ございません。該当するURLのページが見つかりませんでした。
DSL云々はなるほどなーという感じだけど、Pythonの変な書き方も面白い。
こんなコードを書いて、
# magic_lex.py import sys import types try: raise RuntimeError except RuntimeError: e,b,t = sys.exc_info() caller_dict = t.tb_frame.f_back.f_globals def lex(): for t in caller_dict['tokens']: t_obj = caller_dict['t_'+t] if type(t_obj) is types.FunctionType: print t, '=', t_obj.__doc__ else: print t, '=', t_obj
実行するとこんなふうになる。
In [1]: import magic_lex In [2]: t_FOO = 'global var foo' In [3]: t_BAR = 'bar too' In [4]: tokens = ['FOO','BAR'] In [5]: copy_PLY.lex() FOO = global var foo BAR = bar too In [6]: def t_f1(): ...: 'docstring is here!' ...: pass ...: In [7]: tokens.append('f1') In [8]: copy_PLY.lex() FOO = global var foo BAR = bar too f1 = docstring is here!
sys.exc_info()
ってなにかと思ったら、例外発生時の情報を取得できるのね。で、スタックトレース用に渡されるシンボルテーブルも取得できると。
なので、magic_ply.pyを読み込むタイミングに依存しちゃうけど、アプリ起動時に必ず呼んでおけば、読み込み時にわざと例外を発生させて、起動時のローカルシンボルテーブル、つまりグローバルシンボルテーブル(((あー、違うな。シンボルテーブルのスコープはモジュールローカルみたい?だからグローバルに云々はならないのか)))が取得できるのか。
なるほどねーって言う感じ。すぐどうこうしようとか思いつけないけど、いつか肥やしになればいいな。
2003年の記事だけど今のPythonだと扱いが違ったりしないのかな。