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?
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