Python:从字符串名称调用函数

本问题已经有最佳答案,请猛点这里访问。

我有一个str对象,例如:menu = 'install'。我想从这个字符串运行install方法。例如,当我调用menu(some, arguments)时,它将调用install(some, arguments)。有什么办法吗?


如果是在一个类中,你可以使用getattr:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MyClass(object):
    def install(self):
          print"In install"

method_name = 'install' # set by the command line options
my_cls = MyClass()

method = None
try:
    method = getattr(my_cls, method_name)
except AttributeError:
    raise NotImplementedError("Class `{}` does not implement `{}`".format(my_cls.__class__.__name__, method_name))

method()

或者如果它是一个函数:

1
2
3
4
5
6
7
8
9
10
def install():
       print"In install"

method_name = 'install' # set by the command line options
possibles = globals().copy()
possibles.update(locals())
method = possibles.get(method_name)
if not method:
     raise NotImplementedError("Method %s not implemented" % method_name)
method()


你也可以用字典。

1
2
3
4
5
6
7
8
9
10
def install():
    print"In install"

methods = {'install': install}

method_name = 'install' # set by the command line options
if method_name in methods:
    methods[method_name]() # + argument list of course
else:
    raise Exception("Method %s not implemented" % method_name)


为什么我们不能直接使用eval()呢?

1
2
def install():
    print"In install"

新方法

1
2
def installWithOptions(var1, var2):
    print"In install with options" + var1 +"" + var2

然后调用下面的方法

1
2
3
4
method_name1 = 'install()'
method_name2 = 'installWithOptions("a","b")'
eval(method_name1)
eval(method_name2)

这将输出为

1
2
In install
In install with options a b