Maison > Article > développement back-end > Pourquoi « is » ne parvient-il pas à comparer les méthodes en Python, mais fonctionne-t-il pour les fonctions ?
Égalité des méthodes en Python : résoudre l'énigme de l'inégalité de référence
En Python, les méthodes et les fonctions présentent une curieuse différence : tandis que les fonctions présentent une égalité de référence , les méthodes ne le font pas. Cela peut entraîner des bugs inattendus, en particulier lorsque l'on s'appuie sur l'opérateur is pour comparer les méthodes.
Pourquoi l'égalité de référence échappe aux méthodes
Contrairement aux fonctions, qui sont des entités statiques, la méthode les objets sont créés dynamiquement à chaque accès. En effet, les méthodes agissent comme des descripteurs, renvoyant un nouvel objet méthode lorsque leur méthode .__get__ est invoquée. Par exemple, dans l'exemple fourni :
class What: def meth(self): pass
L'affectation What.meth renvoie un objet fonction, qui est différent de l'objet méthode lié créé plus tard lorsque inst.meth est appelé. Cela explique pourquoi What.meth est What.meth évalué à False.
L'égalité est-elle dans Python 3.8
Dans les versions 3.8 et ultérieures de Python, une approche alternative est disponible : en utilisant == pour les tests d'égalité. Deux méthodes sont considérées comme égales si leurs attributs .__self__ et .__func__ sont des objets identiques, indiquant qu'elles enveloppent la même fonction et sont liées à la même instance.
Pour les fonctions __et Méthodes non liées
Quelle que soit la version de Python, les fonctions et les méthodes non liées (dans Python 2) peuvent être comparées à l'aide de l'opérateur is, car elles représentent toutes deux la même référence de fonction sous-jacente.
Test de la fonction sous-jacente
Si l'exigence est de vérifier si deux méthodes représentent la même fonction sous-jacente, l'attribut .__func__ peut être comparé :
if What().meth.__func__ == What().meth.__func__: print("Methods represent the same function")
Cette approche fournit des contrôles d'égalité cohérents et fiables pour les méthodes et les fonctions, quel que soit leur statut de liaison ou leur version Python.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!