Python:从string名称调用函数
我有一个str对象,例如:menu ='install'。 我想从这个string运行安装方法。 例如,当我调用菜单(一些参数),它会调用安装(一些参数)。 有没有办法做到这一点?
如果它在一个类中,则可以使用getattr:
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()
或者如果它是一个function:
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()
你也可以使用字典。
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()?
def install(): print "In install"
新的方法
def installWithOptions(var1, var2): print "In install with options " + var1 + " " + var2
然后你调用下面的方法
method_name1 = 'install()' method_name2 = 'installWithOptions("a","b")' eval(method_name1) eval(method_name2)
这给出了输出
In install In install with options ab