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; 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 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.