関数の再定義をエディタで行う関数 | Pythonでなんか作ってみる

関数の再定義をエディタで行う関数

IPythonはPythonのインタラクティブモードとシェルを合わせたような便利な機能。
WindowsでもLinuxでもPythonを使ってテキスト処理が容易く出来る。
しかし所詮シェルなので、この上で関数定義などして間違って記述したときに訂正して再定義するのが面倒なんだよね。

↑キーでキー入力のヒストリーが表示されるけど、defから始まって最終行までを一つ一つ再入力しなければならない。かといって、エディタでファイルを開いてモジュールを定義するのも面倒だし、使い捨て関数の場合そのファイルを消すのを忘れないようにしないといけない。

というわけで、Historyに残った関数定義を一時ファイルに吐き出し、エディタで編集させた後、インタラクティブに戻ったときに関数を再定義するという関数を考えた。
インタラクティブモードから直接使うことしか考えていないので、別の関数から呼び出したら誤動作すると思う。

以下のように使う。

In [1]: def abc(s):
...: print s+'abc'
...:
In [2]: abc(0)
---------------------------------------------------------------------------
TypeError: unsupported operand type(s) for +: 'int' and 'str'
In [3]: import ptools
In [4]: ptools.editfunc(In[1])
In [5]: abc(0)
0abc



ソースコード。

import os,re,sys,tempfile

def editfunc(funcstr):
m = re.match(r'^def +([a-zA-Z_]\w*) *\(.*\) *:',funcstr)
if not m:
raise ValueError(funcstr)
funcname = m.group(1)
fd,fname = tempfile.mkstemp(suffix='.py')
os.write(fd,funcstr)
os.close(fd)
os.system('vim %s' % fname)
execfile(fname, sys._getframe().f_back.f_globals)
os.remove(fname)


ここではvimをエディタに使うことにしているけど、お好みに応じてどうぞ。