78 votes

Pointeur de fonction Python

J'ai un nom de fonction stocké dans une variable comme celle-ci:

 myvar = 'mypackage.mymodule.myfunction'
 

et je veux maintenant appeler ma fonction comme ça

 myvar(parameter1, parameter2)
 

Quel est le moyen le plus simple d'y parvenir?

117voto

Ignacio Vazquez-Abrams Points 312628
funcdict = {
  'mypackage.mymodule.myfunction': mypackage.mymodule.myfunction,
    ....
}

funcdict[myvar](parameter1, parameter2)

41voto

AndrewBC Points 476

Il est bien plus agréable de pouvoir simplement stocker la fonction elle-même, car ce sont des objets de première classe en python.

 import mypackage

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

Toutefois, si vous devez importer le package de manière dynamique, vous pouvez y parvenir grâce à:

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

myfunction(parameter1, parameter2)
 

Cependant, gardez à l’esprit que tout ce travail s’applique à la portée dans laquelle vous vous trouvez actuellement. Si vous ne les persistez pas, vous ne pouvez pas compter sur leur présence si vous quittez la portée locale.

16voto

Pratik Deoghare Points 9766
 def f(a,b):
    return a+b

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

SORTIE

  5
 

10voto

S.Lott Points 207588

Plus facile

 eval(myvar)(parameter1, parameter2)
 

Vous n'avez pas de fonction "pointeur". Vous avez une fonction "nom".

Bien que cela fonctionne bien, vous aurez un grand nombre de personnes vous disant que c'est "non sécurisé" ou un "risque de sécurité".

4voto

Matt Anderson Points 7461
modname, funcname = myvar.rsplit('.', 1)
getattr(sys.modules[modname], funcname)(parameter1, parameter2)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X