Tester l'existence d'une méthode dans une class

Le problème exposé dans ce sujet a été résolu.

Bonsoir les agrumes !

J'aimerais savoir si il est possible en python 3 de tester l’existence d'une méthode dans une class et de ensuite appeler la méthode. Sachant que j'ai le nom de la méthode dans une variable.

Bonne soirée :)

+0 -0

Conceptuellement, je dirais que l'introspection est à prendre avec des pincettes, il faut toujours se demander s'il n'y a pas d'autres solutions que celle-ci. Ça tombe bien j'en ai une ;)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
>>> class A:
...     pass
... 
>>> a = A()
>>> try:
...     x = a.method()
... except AttributeError:
...     pass
... 
>>> 

En C on utiliserait la technique du LBYL, mais en python on préfère l'EAFP (avec try et except).

Voir une discussion intéressante ICI

Bonne continuation…

Le problème est que j'ai le nom de ma méthode dans une variable, mais je peux faire :

1
2
3
4
5
6
try:
    func = getattr(obj, action) # la variable action contient le nom de ma méthode
except AttributeError:
    pass # do something
else:
    result = func(args)

L'exemple est tiré de l'article donné par Grimur. Mais sinon merci pour LBYL et EAFP que je ne connaissais pas !

+0 -0

Je ne comprend pas réellement le problème, c'est sans doute en rapport avec la conception qui n'est pas suffisamment exprimée ici, car tu ne veux pas rentrer dans les détails… Mais le principe est d'exécuter ta méthode directement sans l'utilisation de getattr.

Ma solution, c'est "j'essaie d'exécuter ma méthode de classe et dans le cas où cette méthode n'existe pas, faire autre chose"

Maintenant la question est pourquoi le nom d'une méthode dans une variable, c'est là où plus de détails sur la conception seraient bienvenue, mais c'est toi qui voit.

En fait j'ai un serveur avec bottle.py et une route /cmd/<action> qui me permet de lancer certaine méthode d'une class. Donc je ne sais pas à l'avance quelle méthode je dois appeler. Le but est

+0 -0

Merci psycopy mais la proposition de Grimur me parait plus intéressante car je peux en plus récupérer la méthode !

+0 -0

Pour faire comme fred le conseille, tu peux procéder ainsi :

1
2
3
4
try:
    x = YourClass.__dict__[method_name](obj, args)
except KeyError:
    pass
+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte