Hatanın açıklaması: 'NoneType' nesnesi yinelenemez
Python2'de NoneType, None türündedir. Python3'te NoneType, None sınıfıdır, örneğin:
>>> 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.
Yok değerine sahip bir değişken üzerinde yineleme başarısız olur:
for a in None:
print("k") #TypeError: 'NoneType' object is not iterable
Python yöntemleri bir değer döndürmezlerse NoneType döndürür:
def foo():
print("k")
a, b = foo() #TypeError: 'NoneType' object is not iterable
Döngü yapılarınızı NoneType için aşağıdaki gibi kontrol etmeniz gerekir:
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
Guido, sadece is
kontrol etmek için kullandığını söylüyor None
çünkü is
kimlik kontrolüne daha dayanıklı. Eşitlik operasyonlarını kullanmayın, çünkü bunlar kendi başlarına kabarmış uygulamalara tükürebilir. Python'un Kodlama Stili Yönergeleri - PEP-008
Türler Sinsi ve lambdaslardan gizlice girebilir:
import sys
b = lambda x : sys.stdout.write("k")
for a in b(10):
pass #TypeError: 'NoneType' object is not iterable
NoneType geçerli bir anahtar kelime değil:
a = NoneType #NameError: name 'NoneType' is not defined
None
Bir dizenin birleşimi ve bir dize:
bar = "something"
foo = None
print foo + bar #TypeError: cannot concatenate 'str' and 'NoneType' objects
Burada neler oluyor?
Python'un tercümanı kodunuzu pyc bayt koduna dönüştürdü. Python sanal makinesi bayt kodunu işledi, None içeren bir değişken üzerinde yinelemeyi söyleyen bir döngü yapısıyla karşılaştı. İşlem, Yok'taki __iter__
yöntem çağrılarak gerçekleştirildi .
Hiçbirinin __iter__
tanımlı bir yöntemi yoktur , bu nedenle Python'un sanal makinesi gördüklerini söyler: NoneType'ın hiçbir __iter__
yöntemi yoktur .
Bu yüzden Python'un ördek yazma ideolojisi kötü olarak kabul edilir. Programcı bir değişkenle tamamen makul bir şey yapar ve çalışma zamanında Yok tarafından kontamine olur, python sanal makinesi askere gitmeye çalışır ve halının her yerinde bir sürü ilgisiz saçmalık ortaya çıkarır.
Java veya C ++ bu sorunlara sahip değildir, çünkü Hiçbiri oluştuğunda ne yapacağınızı tanımlamadığınız için böyle bir programın derlenmesine izin verilmez. Python, istisnai durumlarda çalışması beklenemeyecek çok şey yapmanıza izin vererek programcıya kendini asması için birçok ip verir. Python, Java ve C ++ gibi, kendinize zarar vermemenizi engellediğinde evet efendim diyor.
None
dizi olarak coerced tamamen zararsız boş dizisi üretmek gerekir.