Пояснення помилки: "NoneType" об'єкт не можна перетворити
У python2, NoneType - це тип None. У Python3 NoneType - клас None, наприклад:
>>> print(type(None)) #Python2
<type 'NoneType'> #In Python2 the type of None is the 'NoneType' type.
>>> print(type(None)) #Python3
<class 'NoneType'> #In Python3, the type of None is the 'NoneType' class.
Ітерація над змінною, яка має значення None Не відбувається:
for a in None:
print("k") #TypeError: 'NoneType' object is not iterable
Методи Python повертають NoneType, якщо вони не повертають значення:
def foo():
print("k")
a, b = foo() #TypeError: 'NoneType' object is not iterable
Потрібно перевірити свої петельні конструкції на NoneType таким чином:
a = None
print(a is None) #prints True
print(a is not None) #prints False
print(a == None) #prints True
print(a != None) #prints False
print(isinstance(a, object)) #prints True
print(isinstance(a, str)) #prints False
Гвідо каже, що використовувати його is
потрібно лише для перевірки, None
оскільки is
це більш надійно перевіряти особу. Не використовуйте операції з рівності, тому що вони можуть самостійно випльовувати міхурову реалізацію. Керівні принципи стилю кодування Python - PEP-008
Типи підступні і можуть прокрастися з лямбдів:
import sys
b = lambda x : sys.stdout.write("k")
for a in b(10):
pass #TypeError: 'NoneType' object is not iterable
NoneType - недійсне ключове слово:
a = NoneType #NameError: name 'NoneType' is not defined
З'єднання None
і рядок:
bar = "something"
foo = None
print foo + bar #TypeError: cannot concatenate 'str' and 'NoneType' objects
Що тут відбувається?
Інтерпретатор Python перетворив ваш код у байт-код pyc. Віртуальна машина Python обробляла байт-код, він наштовхувався на циклічну конструкцію, яка говорила про перехід змінної, що містить None. Операція була виконана шляхом виклику __iter__
методу на None.
У жодному немає __iter__
визначеного методу, тому віртуальна машина Python повідомляє вам, що він бачить: у NoneType немає __iter__
методу.
Ось чому ідеологія типізації качок Python вважається поганою. Програміст робить щось цілком розумне зі змінною, і під час виконання його забруднюється Ніхто, віртуальна машина python намагається зайнятись солдатом, і набирає купу непов’язаних дурниць по всьому килиму.
У Java або C ++ немає цих проблем, оскільки таку програму не було б дозволено компілювати, оскільки ви не визначилися, що робити, коли не виникає None. Python дає програмісту багато мотузок, щоб він повісився, дозволяючи вам робити багато речей, над якими не можна очікувати роботи за виняткових обставин. Python - це людина, що говорить "так", коли це заважає вам заподіяти шкоду собі, як це робить Java та C ++.
None
її примушують до послідовності, вона повинна створювати порожню послідовність, абсолютно нешкідливу.