为什么len(None)不返回0?

时间:2015-05-15 10:34:18

标签: python nonetype

Python中的

None是一个对象。

>>> 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()

似乎Pythonic与if list可接受的方式相同,即使变量是None而不仅仅是空列表。

是否存在会使len(None)出现更多问题的案例?

2 个答案:

答案 0 :(得分:15)

len仅对对象集合有意义 - None不是集合。

答案 1 :(得分:14)

你提到你想要这个:

  

因为当函数返回None而不是列表

时,它经常出现错误

据推测,您的代码如下:

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

正在获得:

TypeError: object of type 'NoneType' has no len()

请注意以下事项:

  • len用于确定集合的长度(例如listdictstr - 这些是Sized对象)。用于将任意对象转换为整数的 - 例如,它也未针对intbool实施;
  • 如果有可能None,您应该明确测试if list_probably is not None。使用例如if list_probably会将None和空列表[]视为相同,这可能不是正确的行为;和
  • 通常有更好的方法来处理range(len(...))的列表 - 例如for item in list_probably,使用zip

len实施None只会隐藏错误,其中None正在被错误地处理,与某些其他对象一样 - 每the Zen of Pythonimport this):

  

错误绝不应该以无声方式传递。

同样for item in None会失败,但这并不意味着实施None.__iter__是个好主意!错误是一件好事 - 它们可以帮助您快速找到程序中的问题。