2015-05-15 6 views
7

None в Python - это объект.Почему не len (None) возвращает 0?

>>> 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) еще одной проблемой?

+11

Потому что 'None' не имеет' __len__'; это не ['Sized'] (https://docs.python.org/2/library/collections.html#collections.Sized). – jonrsharpe

+0

@jonrsharpe Но это может быть просто добавленная функция, которая возвращает 0 независимо от того, что. – SuperBiasedMan

+0

это могло бы, но это не имело бы большого смысла. Почему объект имеет длину, если это не коллекция объектов? –

ответ

8

Вы сказали, что вы хотите:

, потому что он приходит часто, как ошибки, когда функция возвращает None вместо списка

Предположительно, у вас есть такой код:

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

и получают:

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

Обратите внимание на следующее:

  • len для определения длины коллекций (например, a list, dict или str - это Sized объектов). Это не для преобразования произвольных объектов в целые числа - он также не применяется для int или bool, например;
  • Если возможно, 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 Python (import this):

Ошибки должны никогда не проходите молча.

for item in None Точно так же потерпит неудачу, но это не значит, что реализация None.__iter__ является хорошей идеей!Ошибки - это хорошо - они помогают быстро найти проблемы в ваших программах.

14

len имеет смысл только для коллекций объектов - ни один не является коллекцией.

+0

Не имеет ли смысл сказать, что он всегда может вернуть 0, чем правдивость (или ложность) «Нет»? – SuperBiasedMan

+0

@SuperBiasedMan Да, это имеет меньшее значение. Спросите себя, длина красного цвета 0? – orlp

+1

@SuperBiasedMan да! Целое число тоже не имеет длины, но имеет правду - см. Https://docs.python.org/2/library/stdtypes.html#truth-value-testing. Также обратите внимание, что вы обычно должны тестировать 'None' на * identity *, а не на правду *. – jonrsharpe