web-dev-qa-db-ja.com

Pylintは、文字列をリテラルと「is」で比較すると文句を言う

次のコードスニペットを検討してください。

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

Pylintが2行目に推奨R0123を返します。これは エラーメッセージwiki では見つかりませんでした。 ドキュメントのこの部分 でそれについて言及していますが、

リテラル比較(R0123):

リテラルとの比較オブジェクトをリテラルと比較するときに使用されます。これは通常、期待されていないものとは異なるリテラルと比較できるためです。

この説明は私にはまったく役に立ちません。 2つの文字列オブジェクト間の比較にisを使用すると、予想とは異なる結果になる可能性があることを知っていますが、オブジェクトとリテラルの比較では、==と同じです。そして==を使用すると、エラーが消えます。

ここでisを使用すべきではないのはなぜですか?

9
iFreilicht

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
16
Mureinik