2017-02-04 73 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")