2008-03-02 02:36:44

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

テーマ: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をエディタに使うことにしているけど、お好みに応じてどうぞ。
AD
いいね!した人  |  コメント(0)  |  リブログ(0)

mar-amebloさんの読者になろう

ブログの更新情報が受け取れて、アクセスが簡単になります

コメント

[コメントをする]

コメント投稿

AD

ブログをはじめる

たくさんの芸能人・有名人が
書いているAmebaブログを
無料で簡単にはじめることができます。

公式トップブロガーへ応募

多くの方にご紹介したいブログを
執筆する方を「公式トップブロガー」
として認定しております。

芸能人・有名人ブログを開設

Amebaブログでは、芸能人・有名人ブログを
ご希望される著名人の方/事務所様を
随時募集しております。