Вызов функции из строки внутри одного модуля в 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' + '()')