我想通过从字符串中提取第一个单词来调用该函数。例如,我的字符串就像:
"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 :(得分: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")