Python:从string名称调用函数

我有一个str对象,例如:menu ='install'。 我想从这个string运行安装方法。 例如,当我调用菜单(一些参数),它会调用安装(一些参数)。 有没有办法做到这一点?

3 Solutions collect form web for “Python:从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 
  • 如何连接两个字典在Python中创build一个新的字典?
  • 如何在维护秩序的同时从列表中删除重复项?
  • 在Python中添加一行到现有的文件
  • 追加到一个元组中定义的列表 - 这是一个错误?
  • 什么是安装pip,virtualenv和为Python分发的正确方法?
  • 使用python和BeautifulSoup从网页检索链接
  • 只读取文件的第一行?
  • 如何将列表合并到元组列表中?
  • Django视图不使用模板返回json
  • 如何将两个字段定义为“独特”的情侣
  • 将代码添加到__init__.py