从具有函数名和参数的列表中获取函数的字符串表示

时间:2013-08-11 12:54:18

标签: python

我只是想知道Python中是否有某种方法可以从列表中创建函数及其参数,并将它们存储在可以传递给eval的变量中

e.g。 :

def dummyfunction(title):
    print "Hello %s" %(title)

调用此函数的正常方法是: dummyfunction("John")

我在列表中的函数名称及其参数为list1 = ['dummyfunction', 'John']。我的要求是将此函数的字符串表示形式设为dummyfunction("John"),它可以用作{{1}的输入函数因为它需要字符串参数。

4 个答案:

答案 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()。