Comment est le " est " de mots clés mis en œuvre en Python?
... la is
mot-clé qui peut être utilisé pour l'égalité dans les cordes.
>>> s = 'str'
>>> s is 'str'
True
>>> s is 'st'
False
J'ai essayé les deux __is__()
et __eq__()
mais ils n'ont pas de travail.
>>> class MyString:
... def __init__(self):
... self.s = 'string'
... def __is__(self, s):
... return self.s == s
...
>>>
>>>
>>> m = MyString()
>>> m is 'ss'
False
>>> m is 'string' # <--- Expected to work
False
>>>
>>> class MyString:
... def __init__(self):
... self.s = 'string'
... def __eq__(self, s):
... return self.s == s
...
>>>
>>> m = MyString()
>>> m is 'ss'
False
>>> m is 'string' # <--- Expected to work, but again failed
False
>>>
Vous devez vous connecter pour publier un commentaire.
Test de chaînes avec
is
ne fonctionne que lorsque les chaînes sont internés. Sauf si vous savez vraiment ce que vous faites et explicitement interné les chaînes que vous devriez jamais utilisationis
sur les cordes.is
tests pour identité, pas l'égalité. Cela signifie que Python compare simplement l'adresse mémoire d'un objet réside dans.is
, fondamentalement, la réponse à la question "puis-je avoir deux noms pour le même objet?" - la surcharge cela n'aurait aucun sens.Par exemple,
("a" * 100) is ("a" * 100)
est Faux. Généralement Python écrit chaque chaîne dans un emplacement différent de la mémoire, un stage arrive le plus souvent, pour les littéraux de chaîne.("a" * 100) is ("a" * 100)
peut être Faux en 2010, mais aujourd'hui, c'est Vrai.La
is
opérateur est l'équivalent de la comparaison deid(x)
valeurs.id
est actuellement mis en œuvre pour l'utilisation des pointeurs comme la comparaison. Donc vous ne pouvez pas surchargeris
lui-même, et autant que je sache, vous ne pouvez pas surchargerid
soit.Donc, vous ne pouvez pas. Inhabituel en python, mais il est.
id
, mais pas dans le sens que vous probablement signifié. Il suffit de neid = <function>
.Le Python
is
mot-clé tests de l'identité de l'objet. Vous ne devriez PAS l'utiliser pour tester la chaîne de l'égalité. Il peut sembler à travailler fréquemment parce que les implémentations de Python, comme ceux de beaucoup de très haut niveau langues, qui effectue un "stage" de chaînes de caractères. C'est-à-dire que les littéraux de chaîne et les valeurs en interne sont conservés dans un hachage de liste et celles qui sont identiques sont rendus à titre de références pour le même objet. (Ceci est possible parce que Python chaînes sont immuables).Cependant, comme avec n'importe quel détail de l'implémentation, vous ne devriez pas compter sur cette. Si vous voulez tester l'égalité utiliser l'opérateur==. Si vous voulez vraiment tester l'identité de l'objet, puis utilisez
is
--- et j'avais du mal à venir avec un cas où faut-il se préoccuper de la chaîne de l'identité de l'objet. Malheureusement, vous ne pouvez pas compter sur si les deux chaînes sont en quelque sorte "intentionnellement" à l'identique les références de l'objet en raison de ladite formation.La
is
mot-clé compare les objets (ou, plutôt, les compare, si les deux sont des références pour le même objet).Qui est, je pense, pourquoi il n'y a pas de mécanisme pour faire votre propre mise en œuvre.
Il arrive à travailler parfois sur des chaînes parce que Python magasins de chaînes "intelligemment", de sorte que lorsque vous créez des chaînes identiques, ils sont stockés dans un objet.
Vous pouvez espérer voir la référence vs comparaison de données en un simple "copier" exemple:
Si vous n'avez pas peur de vous embêter avec bytecode, vous pouvez intercepter et patch
COMPARE_OP
avec8 ("is")
argument pour appeler votre fonction de raccordement sur des objets comparés. Regardezdis
documentation du module pour les start-dans.Et n'oubliez pas d'intercepter
__builtin__.id()
trop si quelqu'un va faireid(a) == id(b)
au lieu dea is b
.is
œuvres pourrait être une solution.est ne parvient pas à comparer une variable de type chaîne de valeur de chaîne et deux variables de chaîne lorsque la chaîne de caractères commence par un '-'. Ma version de Python est 2.6.6
'est' compare l'identité de l'objet tandis que == compare les valeurs.
Exemple:
Vous ne pouvez pas surcharger le
is
de l'opérateur. Ce que vous voulez de surcharge est le==
de l'opérateur. Cela peut être fait par la définition d'un__eq__
méthode dans la classe.Vous êtes à l'aide de l'identité de comparaison. == est probablement ce que vous voulez. L'exception à cette règle est lorsque vous voulez vérifier si un élément et un autre sont exactement le même objet et la même position de mémoire. Dans votre exemple, l'élément ne sont pas les mêmes, puisque l'on est d'un type différent (my_string) que les autres (chaîne de caractères). Aussi, il n'y a pas une telle chose comme someclass.
__is__
en python (à moins, bien sûr, vous l'y avez mis vous-même). S'il y avait, objets de comparaison avec est ne pas être fiable pour comparer simplement les emplacements de mémoire.Quand je l'ai rencontré pour la première fois le est mot-clé, il me confond ainsi. J'aurais pensé que est et == ne sont pas différents. Ils ont produit le même résultat à partir de l'interprète sur de nombreux objets. Ce type d'hypothèse est en fait EXACTEMENT ce est... est pour. C'est l'équivalent python "Hey, ne pas confondre ces deux objets. ils sont différents.", qui est essentiellement ce que [celui qui il était que redressé me] dit. Rédigée de manière différente, mais un point == l'autre point.
l'
pour des exemples utiles et un peu de texte pour aider avec les parfois déroutant différences
visite un document à partir d'python.org s'hôte de messagerie écrit par "Danny Yoo"
ou, si c'est en mode hors connexion, utilisez la non cotées pastebin j'ai fait de son corps.
dans le cas où ils, dans quelques 20 ou bleu lunes (bleu lunes sont un événement réel), sont à la fois vers le bas, je vais vous citer les exemples de code
Affirmation des Erreurs peuvent se produire facilement avec est mot-clé lors de la comparaison d'objets. Par exemple, les objets un et b peut détenir de même valeur et de partager la même adresse mémoire. Donc, faire une
va l'évaluer à
Mais si
évalue à
vous devriez probablement vérifier
et
Ceux-ci pourraient être différentes et une raison de l'échec.