Язык Python: вызов функции из имени строки [дубликат]
этот вопрос уже есть ответ здесь:
- Вызов функции модуля с помощью его имени (строка) 10 ответов
у меня есть объект str например:menu = 'install'
. Я хочу запустить метод установки из этой строки. Например, когда я звоню menu(some, arguments)
он будет вызывать install(some, arguments)
. Есть ли способ сделать это ?
3 ответа:
если он находится в классе, вы можете использовать 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()
или если это функция:
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 a b