Мне сохранили имя функции в переменной как это:
myvar = 'mypackage.mymodule.myfunction'
и я теперь хочу назвать myfunction как это
myvar(parameter1, parameter2)
Что самый легкий путь состоит в том, чтобы достигнуть этого?
funcdict = {
'mypackage.mymodule.myfunction': mypackage.mymodule.myfunction,
....
}
funcdict[myvar](parameter1, parameter2)
Почему бы не сохранить саму функцию? myvar = mypackage.mymodule.myfunction
намного чище.
Самый простой
eval(myvar)(parameter1, parameter2)
У вас нет функции "указатель". У вас есть функция "имя".
Хотя это работает хорошо, многие люди будут говорить вам, что это «небезопасно» или «угрожает безопасности».
modname, funcname = myvar.rsplit('.', 1)
getattr(sys.modules[modname], funcname)(parameter1, parameter2)
Гораздо приятнее иметь возможность просто сохранить саму функцию, поскольку в Python это объекты первого класса.
import mypackage
myfunc = mypackage.mymodule.myfunction
myfunc(parameter1, parameter2)
Но если вам нужно импортировать пакет динамически, вы можете добиться этого с помощью:
mypackage = __import__('mypackage')
mymodule = getattr(mypackage, 'mymodule')
myfunction = getattr(mymodule, 'myfunction')
myfunction(parameter1, parameter2)
Имейте в виду, однако, что вся эта работа применима к любой области, в которой вы сейчас находитесь. Если вы не продолжите их почему-то, вы не можете рассчитывать на то, что они останутся, если вы покинете местный прицел.
def f(a,b):
return a+b
xx = 'f'
print eval('%s(%s,%s)'%(xx,2,3))
OUTPUT
5