web-dev-qa-db-fra.com

Pylint se plaint de comparer une chaîne à un littéral avec 'is'

Considérez cet extrait de code:

my_string = 'asdf'
print(my_string is 'xfje') #R0123

Pylint retourne une recommandation R0123 sur la deuxième ligne, que je n'ai pas pu trouver sur le wiki du message d'erreur . Il en est fait mention dans cette partie de la documentation , cependant:

comparaison littérale (R0123):

Comparaison au littéral Utilisé lors de la comparaison d'un objet à un littéral, ce qui est généralement ce que vous ne voulez pas faire, car vous pouvez comparer à un littéral différent de ce qui était attendu.

Cette explication ne me sert pas du tout. Je sais que l'utilisation de is pour la comparaison entre deux objets chaîne peut conduire à des résultats différents de ceux attendus, mais pour la comparaison de l'objet au littéral, il est identique à ==. Et lorsque vous utilisez ==, l'erreur disparaît.

Pourquoi ne devrais-je pas utiliser is ici?

9
iFreilicht

is vérifie que l'argument de gauche contient la même référence exacte que l'argument de droite. C'est très bien pour None qui est un singleton, mais c'est généralement une mauvaise idée pour d'autres types, où plusieurs instances peuvent avoir la même valeur logique.

Considérez, par exemple l'exemple suivant:

>>> my_string = ''.join([c for c in 'xfje'])
>>> print my_string
xfje
>>> print my_string == 'xfje'
True
>>> print my_string is 'xfje'
False
16
Mureinik