2017-02-04 50 views
0

我想通過從字符串中提取第一個單詞來調用該函數。例如我的字符串是這樣的:基於函數名字符串的執行函數

"my_func arg_1 arg_2" 
#^ ^ ^second argument of function 
#^ ^first argument of function 
#^name of the function 

其中my_func是已經定義的函數的名稱。

基於上面提到的字符串,我想動態地執行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/主叫-A-函數對的一模塊從 - 一個串與 - 的函數名合蟒) – 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 

現在,函數字符串作爲關鍵作爲*params參數傳遞給locals()字典的功能爲:在空白

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

關於拆分方法,默認情況下分隔符是空格,所以您實際上不需要定義您的分隔符是空格,並且您想要列表中的第一項,只需鍵入索引0 [0]

locals返回一個包含當前本地符號表的字典。全局變量返回帶有全局符號表的字典。

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(對象,名稱[,默認])

返回對象的命名 屬性的值。名稱必須是字符串。如果該字符串是對象屬性之一的名稱 ,則結果是該屬性的值。例如,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")