我只是想知道Python中是否有某种方法可以从列表中创建函数及其参数,并将它们存储在可以传递给eval
的变量中
e.g。 :
def dummyfunction(title):
print "Hello %s" %(title)
调用此函数的正常方法是:
dummyfunction("John")
我在列表中的函数名称及其参数为list1 = ['dummyfunction', 'John']
。我的要求是将此函数的字符串表示形式设为dummyfunction("John")
,它可以用作{{1}的输入函数因为它需要字符串参数。
答案 0 :(得分:2)
首先,如果可以,只需将函数本身放在列表中,而不是放置函数名称:
sexpression = [dummyfunction,1,2,3]
sexpression[0](*sexpression[1:])
如果函数是对象方法,则可以使用getattr
:
strpression = ['dummyfunction',1,2,3]
getattr(myobj,strpression[0])(*strpression[1:])
如果它在一个已知的模块中,你可以用模块对象代替myobj
因为您可以按名称查找函数,所以没有理由使用eval
来调用函数。不要这样做。
最后,如果你想一起收集任意函数以便按名称查找,你可以这样做:
namespace = {'dummyfunction': dummyfunction}
#or
namespace = {f.__name__:f for f in [dummyfunction]}
答案 1 :(得分:1)
如果函数被定义为模块全局,则可以使用globals
:
func = globals()[list1[0]]
func(list1[1])
但是上面的代码可能会导致调用任何abitrary函数。如果您不想这样,请使用以下表格。
funcs = {
'dummyfunction': dummyfunction,
}
func = funcs[list1[0]]
func(list1[1])
答案 2 :(得分:-2)
如果你只是希望函数调用的字符串表示传递给eval,那么你可以这样做:
eval("dummyFunction(\"John\")")
#or
eval("dummyFunction('John')")
如果你有一个包含函数名和参数的列表,那么执行以下操作:
list1 = ['dummyfunction', 'John']
eval(list1[0]+"('"+list1[1]+"')")
答案 3 :(得分:-3)
列表中的第一个引用是否是函数的字符串名称,还是函数对象本身?如果它是函数对象本身,您可以这样做:
list[0](*list[1:])
如果它真的是字符串名称,您可以尝试:
globals()[list[0]](*list[1:])
请注意,只有在全局命名空间中定义了函数时,这才有效。如果它在本地命名空间或类或其他东西中,那么您需要从该命名空间获取该函数,而不是globals()。