2017-02-04 9 views
0

文字列から最初の単語を抽出してその関数を呼び出したいとします。関数の名前文字列に基づいて関数を実行

my_funcがすでに定義された関数の名前です
"my_func arg_1 arg_2" 
#^ ^ ^second argument of function 
#^ ^first argument of function 
#^name of the function 

:たとえば、私の文字列は次のようです。

上記の文字列に基づいて、私は動的にmy_func関数を実行したいと思います。だから、私の関数呼び出しは次のようにする必要があります:

my_func(arg_1, arg_2) 

現在、私はevalを使用して経由してこれを達成しようとしています:

eval(command.split(' ', 1)[0]) 

をどのように私はこれを達成することができますか?

+0

'空白にsplit'とグローバルスコープから関数を取得するために 'globals'を使います。 –

+0

eval(command.split( ''、1)[0]) – zegulas

+2

[Pythonで関数の名前を持つ文字列からモジュールの関数を呼び出す]の可能な複製(http://stackoverflow.com/questions/3061/) Pythonで関数名を持つ文字列からのモジュールの呼び出し(function-of-the-function-name-in-python) – fuglede

答えて

0

あなたは文字列に基づいて機能の参照を取得するためにlocals()(またはglobals())を使用することができます。、今

# Sample function 
def foo(a, b): 
    print('{} - {}'.format(a, b)) 

# Your string with functions name and attributes 
my_str = "foo x y" 

func, *params = my_str.split() 
#^ ^tuple of params string 
#^function name string 

として関数の引数として*paramslocals()辞書にキーとしてファンクション文字列を渡します:以下のサンプル例です

>>> locals()[func](*params) 
x - y # output printed by `foo` function 
0

デフォルトでは、区切り文字はスペースであるため、実際に区切り記号がスペースであることを定義する必要はなく、リストの最初の項目を望むようにインデックス0 [0]を入力するだけです。

localsは現在のローカルシンボルテーブルを持つ辞書を返します。 globalsは、グローバルシンボルテーブルを持つ辞書を返します。

var = "my_func arg_1 arg_2" 
print (locals()[var.split()[0]]()) 

それとも

var = "my_func arg_1 arg_2" 
print (globals()[var.split()[0]]()) 

機能を使用すると、内蔵の機能のgetattrを使用することができ、オブジェクトの一部であった場合。

var = "my_func arg_1 arg_2" 
getattr(object, var.split()[0]) 

GETATTR(オブジェクト、名[、デフォルト])オブジェクトの名前付き 属性の

戻り値。 nameは文字列でなければなりません。文字列がオブジェクトの属性の1つの名前 である場合、その結果はその 属性の値になります。たとえば、getattr(x、 'foobar')は x.foobarに相当します。指定された属性が存在しない場合は、デフォルトで が返されます。そうでない場合、AttributeErrorが発生します。

0

何かの行に沿って: 機能がローカルスコープ内に存在するかどうかを確認します。

存在する場合は、eval()を使用して実行します。

def add(): 
    print("do something") 

def find_function(funct_name, defined_names): 
    if defined_names.get(funct_name) is None: 
     print("no function called {}".format(funct_name)) 
     return 

    eval(funct_name + "()") 

# access local user defined names. 
defined_names = locals() 
#print(defined_names) 

function_name = 'add' 
find_function(function_name ,defined_names) 

出力:

は、あなたがあなたのフロントアップ機能を定義する場合は、その名前のマッピングをより詳細に制御することができ、何か

0

を行います。

def my_func(a): 
    print(a) 


functions = {'my_func': my_func} 


def exe(text): 
    command = text.split(" ") 
    f = command[0] 
    args = command[1:] 
    if f in functions: 
     functions[f](args) 


exe("my_func arg_1 arg_2") 
関連する問題