-2

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

例如:

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

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

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

4

4 回答 4

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]}
于 2013-08-11T13:16:02.100 回答
1

如果函数被定义为模块全局,您可以使用globals

func = globals()[list1[0]]
func(list1[1])

但是上面的代码可能会导致调用任何任意函数。如果您不希望这样,请使用以下表格。

funcs = {
    'dummyfunction': dummyfunction,
}
func = funcs[list1[0]]
func(list1[1])
于 2013-08-11T12:56:21.867 回答
-2

如果您只想将函数调用的字符串表示形式传递给 eval ,那么您可以这样做:

eval("dummyFunction(\"John\")")
#or
eval("dummyFunction('John')")

如果您有一个包含函数名称和参数的列表,请执行以下操作:

list1 = ['dummyfunction', 'John']
eval(list1[0]+"('"+list1[1]+"')")
于 2013-08-11T13:19:57.667 回答
-3

列表中的第一个引用真的是函数的字符串名称,还是函数对象本身?如果它是函数对象本身,你可以这样做:

list[0](*list[1:])

如果它真的是字符串名称,您可以尝试:

globals()[list[0]](*list[1:])

请注意,这仅在您的函数在全局命名空间中定义时才有效。如果它在本地命名空间或类或其他东西中,那么您需要从该命名空间获取函数,而不是 globals()。

于 2013-08-11T12:57:32.903 回答