web-dev-qa-db-ja.com

len(None)が0を返さないのはなぜですか?

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)の使用をもっと問題にするケースはありますか?

15
SuperBiasedMan

あなたはこれが欲しいと言います:

関数がリストではなくNoneを返すと、エラーとして頻繁に発生するためです。

おそらく、次のようなコードがあります。

_list_probably = some_function()
for index in range(len(list_probably)):
    ...
_

そして得ている:

_TypeError: object of type 'NoneType' has no len()
_

次の点に注意してください。

  • lenは、コレクションの長さを決定するためのものです(例:listdict、またはstr-これら Sized オブジェクト)です。これは、任意のオブジェクトを整数に変換するためのnotです。たとえば、intまたはboolにも実装されていません。
  • Noneの可能性がある場合は、_if list_probably is not None_を明示的にテストする必要があります。使用例: _if list_probably_はNoneと空のリスト_[]_を同じように扱いますが、これはおそらく正しい動作ではありません。そして
  • 通常、range(len(...))-のリストを処理するためのより良い方法があります。 _for item in list_probably_、Zipなどを使用します。

lenNoneを実装すると、エラーを非表示他のオブジェクトと同様にNoneが誤って処理されます Zen Pythonの (_import this_):

エラーが黙って渡されることはありません。

同様に、_for item in None_は失敗しますが、それは_None.__iter___の実装が良い考えであることを意味するわけではありません!エラーは良いことです-プログラムの問題をすばやく見つけるのに役立ちます。

14
jonrsharpe

lenはオブジェクトのコレクションにのみ意味があります-Noneはコレクションではありません。

15
orlp