Вызов функции из строки внутри одного модуля в Python?

Предположим, что у меня есть функция bar внутри модуля с именем foo.py. Где-то внутри foo.py, я хочу иметь возможность вызывать bar() из строки "bar". Как это сделать?

# filename: foo.py
import sys

def bar():
  print 'Hello, called bar()!'

if __name__ == '__main__':
  funcname = 'bar'
  # Here I should be able to call bar() from funcname

Я знаю, что существует некоторая встроенная функция в python, называемая getattr. Однако для этого требуется, чтобы "модуль-объект" был первым параметром. Как получить "модуль-объект" текущего модуля?

Ответ 1

globals, вероятно, легче понять. Он возвращает текущий модуль __dict__, поэтому вы можете сделать:

func_I_want = globals()['bar']  #Get the function
func_I_want()    #call it

Если вам действительно нужен объект модуля, вы можете получить его из sys.modules (но вам это обычно не нужно):

import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()

Обратите внимание, что в общем, вы должны спросить себя, почему вы хотите это сделать. Это позволит вызывать любую функцию через строку - это, вероятно, пользовательский ввод... Это может иметь потенциально плохие побочные эффекты, если вы случайно предоставляете пользователям доступ к неправильным функциям.

Ответ 2

Используйте словарь, который сохраняет отображение функций, которые вы хотите вызвать:

if __name__ == '__main__':
  funcnames = {'bar': bar}
  funcnames['bar']()

Ответ 3

Как насчет этого:

eval('bar' + '()')