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 ?

Pourquoi « is » ne parvient-il pas à comparer les méthodes en Python, mais fonctionne-t-il pour les fonctions ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-02 18:35:03495parcourir

  Why Does `is` Fail to Compare Methods in Python, But Works for Functions?

É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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn