Указатель функции Python

Мне сохранили имя функции в переменной как это:

myvar = 'mypackage.mymodule.myfunction'

и я теперь хочу назвать myfunction как это

myvar(parameter1, parameter2)

Что самый легкий путь состоит в том, чтобы достигнуть этого?

69
задан Rodrigues Luis 17 August 2012 в 09:18
поделиться

6 ответов

funcdict = {
  'mypackage.mymodule.myfunction': mypackage.mymodule.myfunction,
    ....
}

funcdict[myvar](parameter1, parameter2)
100
ответ дан 24 November 2019 в 13:42
поделиться

Почему бы не сохранить саму функцию? myvar = mypackage.mymodule.myfunction намного чище.

5
ответ дан 24 November 2019 в 13:42
поделиться

Самый простой

eval(myvar)(parameter1, parameter2)

У вас нет функции "указатель". У вас есть функция "имя".

Хотя это работает хорошо, многие люди будут говорить вам, что это «небезопасно» или «угрожает безопасности».

8
ответ дан 24 November 2019 в 13:42
поделиться
modname, funcname = myvar.rsplit('.', 1)
getattr(sys.modules[modname], funcname)(parameter1, parameter2)
4
ответ дан 24 November 2019 в 13:42
поделиться

Гораздо приятнее иметь возможность просто сохранить саму функцию, поскольку в Python это объекты первого класса.

import mypackage

myfunc = mypackage.mymodule.myfunction
myfunc(parameter1, parameter2)

Но если вам нужно импортировать пакет динамически, вы можете добиться этого с помощью:

mypackage = __import__('mypackage')
mymodule = getattr(mypackage, 'mymodule')
myfunction = getattr(mymodule, 'myfunction')

myfunction(parameter1, parameter2)

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

37
ответ дан 24 November 2019 в 13:42
поделиться
def f(a,b):
    return a+b

xx = 'f'
print eval('%s(%s,%s)'%(xx,2,3))

OUTPUT

 5
13
ответ дан 24 November 2019 в 13:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: