2012-03-05 2 views
0

私は古いゲーム内のスクリプト言語用のインタプリタを作成していますので、その関数のシンボルと一致する言語からのコマンド名を持つ辞書をコンパイルする必要があります。あなたはこのような機能を呼び出すことができます... How to call a function based on list entry?Pythonのモジュールでdefのシンボルを取得

を、そして私はあなたがモジュール内のすべての関数の文字列のリストを取得するには、dirを使用できることを知っている:

今、私はすでにここに考え出しました。私はこのリストを手に入れることができましたし、正規表現を使って組み込みのコマンドを削除しました。それ以外のスクリプトは実際にスクリプトが呼び出せないようにしています。目標はここにサンドボックスすることです。 :)

モジュールに定義されている項目のリストがありましたので、各定義のシンボルを取得する必要があります。より視覚的に表現するために

、これは私がのための記号を取得したいテストモジュールです:

def notify(stack,mufenv): 
     print stack[-1] 

これはinitスクリプト経由で引っ張られ、私はに通知し、関数の名前を取得することができています使用してリスト:

import mufprims 
    import re 

    moddefs=dir(mufprims) 
    primsfilter=re.compile('__.+__') 
    primslist=[ 'mufprims.' + x for x in dir(mufprims) if not primsfilter.match(x) ] 
    print primslist 

これが返されます。

['mufprims.notify'] 

を...の正確な名称でありますfunction私はシンボルを探したい。 ここではhttp://docs.python.org/library/symtable.htmlを読みましたが、わかりません。私はこれが私が欲しいものの鍵だと思っていますが、理解できる例は見当たりませんでした。どのようなアイデアを私はリストから引っ張った機能のシンボルを得るだろうか?

+0

正規表現の名前をテストするのではなく、 'inspect'モジュールを見ましたか? http://docs.python.org/library/inspect.html#inspect.isroutine – jdi

答えて

2

getattrと関数名を使用して、mufprimsモジュールから関数を取得します。これと同じように:

primslist=[getattr(mufprims, x) for x in dir(mufprims) if not primsfilter.match(x) ] 
+0

あなたは素晴らしいです。 – Kelketek

2

私は、オブジェクトの機能を取得するための別の可能性の提案を追加するかもしれないと思った:

オブジェクトに dirを使用して
import inspect 

# example using os.path 
import os.path 
results = inspect.getmembers(os.path, inspect.isroutine) 

print results 

# truncated result 
[..., 
('splitdrive', <function splitdrive at 0x1002bcb18>), 
('splitext', <function splitext at 0x1002bcb90>), 
('walk', <function walk at 0x1002bda28>)] 

は、本質的に非を含め、あなたにそのオブジェクトのすべてのメンバーを与えるだろう-callable属性など。inspectモジュールを使用すると、より制御された戻り値の型を得ることができます。

関連する問題