Quelle est la meilleure façon d'appeler une fonction en fonction d'une chaîne avec le nom de la fonction dans un programme Python. Par exemple, disons que j'ai un module foo
, et j'ai une chaîne dont le contenu est "bar"
. Quelle est la meilleure façon d'appeler foo.bar()
?
J'ai besoin d'obtenir la valeur de retour de la fonction, c'est pourquoi je ne l'utilise pas seulement eval
. J'ai compris comment le faire en utilisant eval
pour définir une fonction temporaire qui renvoie le résultat de cet appel de fonction, mais j'espère qu'il existe une façon plus élégante de le faire.
foo
module, vous pouvez leglobals()
faire:methodToCall = globals()['bar']
ou
locals renvoie un dictionnaire avec une table de symboles locale actuelle. globals renvoie un dictionnaire avec une table de symboles globale.
la source
La solution de Patrick est probablement la plus propre. Si vous devez également récupérer dynamiquement le module, vous pouvez l'importer comme:
la source
importlib.import_module
. Les documents officiels disent à propos de__import__
: "Il s'agit d'une fonction avancée qui n'est pas nécessaire dans la programmation Python de tous les jours, contrairement à importlib.import_module ()." docs.python.org/2/library/functions.html#__import__importlib.import_module
est pris en charge dans 3.6. Voir docs.python.org/3.6/library/…Juste une simple contribution. Si la classe que nous devons instance est dans le même fichier, nous pouvons utiliser quelque chose comme ceci:
Par exemple:
Et, sinon une classe:
la source
Étant donné une chaîne, avec un chemin python complet vers une fonction, voici comment j'ai obtenu le résultat de ladite fonction:
la source
__import__
fonction.La meilleure réponse selon la FAQ de programmation Python serait:
la source
La réponse (j'espère) que personne n'a jamais voulu
Comportement similaire à Eval
Pourquoi ne pas ajouter l'importation automatique
Dans le cas où nous aurions des dictionnaires supplémentaires, nous voulons vérifier
Nous devons aller plus loin
la source
Pour ce que ça vaut, si vous aviez besoin de passer le nom de la fonction (ou classe) et le nom de l'application sous forme de chaîne, vous pouvez le faire:
la source
handler = getattr(sys.modules[__name__], myFnName)
Essaye ça. Bien que cela utilise toujours eval, il ne l'utilise que pour invoquer la fonction à partir du contexte actuel . Ensuite, vous avez la vraie fonction à utiliser comme vous le souhaitez.
Le principal avantage pour moi de cela est que vous obtiendrez toutes les erreurs liées à l'évaluation au moment de l'invocation de la fonction. Ensuite, vous n'obtiendrez que les erreurs liées à la fonction lorsque vous appelez.
la source
eval
sauf si strictement nécessaire.getattr(__module__, method_name)
est un bien meilleur choix dans ce contexte.rien de ce qui a été suggéré ne m'a aidé. Je l'ai découvert cependant.
J'utilise python 2.66
J'espère que cela t'aides
la source
self.__getattribute__('title')
est égal àself.title
self.__getattribute__('title')
ne fonctionne pas dans tous les cas (je ne sais pas pourquoi) après tout, mais lefunc = getattr(self, 'title'); func();
fait. Donc, il vaut peut-être mieux utiliser à lagetattr()
placegetattr
plutôt.Comme cette question Comment appeler dynamiquement des méthodes au sein d'une classe en utilisant l'attribution de nom de méthode à une variable [duplicate] marquée comme doublon comme celle-ci, je poste une réponse connexe ici:
Le scénario est, une méthode dans une classe veut appeler une autre méthode sur la même classe dynamiquement, j'ai ajouté quelques détails à l'exemple original qui offre un scénario plus large et une clarté:
la source
Ceci est une réponse simple, cela vous permettra d'effacer l'écran par exemple. Il y a deux exemples ci-dessous, avec eval et exec, qui afficheront 0 en haut après le nettoyage (si vous utilisez Windows, passez
clear
àcls
, les utilisateurs Linux et Mac laissent tel quel par exemple) ou simplement l'exécutent, respectivement.la source