次のコードスニペットを検討してください。
my_string = 'asdf'
print(my_string is 'xfje') #R0123
Pylintが2行目に推奨R0123
を返します。これは エラーメッセージwiki では見つかりませんでした。 ドキュメントのこの部分 でそれについて言及していますが、
リテラル比較(R0123):
リテラルとの比較オブジェクトをリテラルと比較するときに使用されます。これは通常、期待されていないものとは異なるリテラルと比較できるためです。
この説明は私にはまったく役に立ちません。 2つの文字列オブジェクト間の比較にis
を使用すると、予想とは異なる結果になる可能性があることを知っていますが、オブジェクトとリテラルの比較では、==
と同じです。そして==
を使用すると、エラーが消えます。
ここでis
を使用すべきではないのはなぜですか?
is
は、左側の引数が右側の引数と同じ完全に同じ参照であることを確認します。これは、シングルトンであるNone
では問題ありませんが、通常、複数のインスタンスが同じ論理値を持つことができる他のタイプではお勧めできません。
たとえば、次の例:
>>> my_string = ''.join([c for c in 'xfje'])
>>> print my_string
xfje
>>> print my_string == 'xfje'
True
>>> print my_string is 'xfje'
False