None
in Pythonはオブジェクトです。
_>>> isinstance(None, object)
True
_
そのため、__ str __()のような関数を使用できます。
_>>> str(None)
'None'
_
しかし、なぜそれは__len __()に対して同じことをしないのですか?
_>>> len(None)
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
len(None)
TypeError: object of type 'NoneType' has no len()
_
変数が単なる空のリストではなくNone
であっても、_if list
_が受け入れられるのと同じようにPythonicであるように思われます。
len(None)
の使用をもっと問題にするケースはありますか?
あなたはこれが欲しいと言います:
関数がリストではなく
None
を返すと、エラーとして頻繁に発生するためです。
おそらく、次のようなコードがあります。
_list_probably = some_function()
for index in range(len(list_probably)):
...
_
そして得ている:
_TypeError: object of type 'NoneType' has no len()
_
次の点に注意してください。
len
は、コレクションの長さを決定するためのものです(例:list
、dict
、またはstr
-これら Sized
オブジェクト)です。これは、任意のオブジェクトを整数に変換するためのnotです。たとえば、int
またはbool
にも実装されていません。None
の可能性がある場合は、_if list_probably is not None
_を明示的にテストする必要があります。使用例: _if list_probably
_はNone
と空のリスト_[]
_を同じように扱いますが、これはおそらく正しい動作ではありません。そしてrange(len(...))
-のリストを処理するためのより良い方法があります。 _for item in list_probably
_、Zip
などを使用します。len
にNone
を実装すると、エラーを非表示他のオブジェクトと同様にNone
が誤って処理されます Zen Pythonの (_import this
_):
エラーが黙って渡されることはありません。
同様に、_for item in None
_は失敗しますが、それは_None.__iter__
_の実装が良い考えであることを意味するわけではありません!エラーは良いことです-プログラムの問題をすばやく見つけるのに役立ちます。
len
はオブジェクトのコレクションにのみ意味があります-Noneはコレクションではありません。