¿Por qué len (None) no devuelve 0?

None en Python es un objeto.

 >>> isinstance(None, object) True 

Y como tal puede emplear funciones como __str __ ()

 >>> str(None) 'None' 

Pero, ¿por qué no hace lo mismo para __len __ ()?

 >>> len(None) Traceback (most recent call last): File "", line 1, in  len(None) TypeError: object of type 'NoneType' has no len() 

Parece que sería Pythonic de la misma manera que if list es aceptable, incluso si la variable es None y no solo una lista vacía.

¿Hay casos que harían que el uso de len(None) más un problema?

Usted menciona que quiere esto:

porque aparece a menudo como un error cuando una función devuelve None lugar de una lista

Presumiblemente, tienes un código como:

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

y están recibiendo:

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

Tenga en cuenta lo siguiente:

  • len es para determinar la longitud de las colecciones (por ejemplo, una list , dict o str – estos son objetos de Sized ). No es para convertir objetos arbitrarios en enteros; tampoco está implementado para int o bool , por ejemplo;
  • Si None es una posibilidad, debería probar explícitamente if list_probably is not None . Usar, por ejemplo, if list_probably trataría None y la lista vacía [] igual, lo que probablemente no sea el comportamiento correcto; y
  • Por lo general, hay una mejor manera de lidiar con las listas que range(len(...)) – por ejemplo, for item in list_probably , usando zip , etc.

Implementar len for None solo ocultaría los errores donde None se está tratando, incorrectamente, como algún otro objeto, según el Zen de Python ( import this ):

Los errores nunca deben pasar en silencio.

De manera similar, el for item in None fallaría, pero eso no significa que la implementación de None.__iter__ sea ​​una buena idea. Los errores son una buena cosa: le ayudan a encontrar los problemas en sus progtwigs rápidamente.

len solo tiene sentido para colecciones de objetos – Ninguno no es una colección.