根据函数的名称字符串执行函数

时间:2017-02-04 12:04:56

标签: python python-3.x

我想通过从字符串中提取第一个单词来调用该函数。例如,我的字符串就像:

"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])

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:2)

您可以使用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

现在,将函数字符串作为传递给locals() dict,并将*params作为函数的参数:

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

答案 1 :(得分:0)

关于split方法,默认情况下,分隔符是空格,因此您实际上不需要定义分隔符是空格,并且您想要列表中的第一个项目,您只需要键入索引0 {{1 }}

locals返回包含当前本地符号表的字典。 globals返回带有全局符号表的字典。

[0]

或者

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

如果函数是对象的一部分,则可以使用getattr内置函数。

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

getattr(object,name [,default])

     

返回named的值   对象的属性。 name必须是一个字符串。如果字符串是名称   对象的一个​​属性,结果是该值的值   属性。例如,getattr(x,'foobar')相当于   x.foobar。如果named属性不存在,则返回default   如果提供,则引发AttributeError。

答案 2 :(得分: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)

输出:

做点什么

答案 3 :(得分: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")