Язык Python: вызов функции из имени строки [дубликат]


этот вопрос уже есть ответ здесь:

  • Вызов функции модуля с помощью его имени (строка) 10 ответов

у меня есть объект str например:menu = 'install'. Я хочу запустить метод установки из этой строки. Например, когда я звоню menu(some, arguments) он будет вызывать install(some, arguments). Есть ли способ сделать это ?

3 55

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