Apa artinya kesalahan TypeError: 'NoneType' object is not iterable
?
Saya mengerti tentang kode Python ini:
def write_file(data, filename): # creates file and writes list to it
with open(filename, 'wb') as outfile:
writer = csv.writer(outfile)
for row in data: # ABOVE ERROR IS THROWN HERE
writer.writerow(row)
None
dipaksa sebagai urutan itu harus menghasilkan urutan kosong, sama sekali tidak berbahaya.None
tidak pernah dipaksa untuk apa pun . MemilikiNone
diam-diam berperilaku seperti kesalahan jenis lain kulit; itu kebalikan dari "tidak berbahaya". Jika Anda membutuhkan placeholder palsu untuk urutan kosong, Anda dapat menggunakan()
atau''
/""
, keduanya merupakan lajang dan dapat dimuat semurahNone
. Jika Anda ingin memilih untuk secara diam-diam memperlakukan sesuatu yang salah sebagai urutan kosong, Anda bisa melakukannyafor row in data or ():
, tetapi tidak ada yang melakukannya, karena meneruskanNone
ke fungsi yang mengharapkan urutan adalah kesalahan yang tidak boleh berlalu secara diam-diam.Jawaban:
Itu berarti nilai
data
isNone
.sumber
for
loop alih-alih mengajukan pengecualian. Desain Python cacat di sini. KetikaNone
diperlakukan sebagai iterable itu harus mengembalikan daftar kosong setidaknya. Pengecualian ini tidak pernah membantu siapa pun dalam kehidupan nyata selain membuat kami memasukkan beberapaif data is not None:
jenis penanganan yang jelek .fieldlist
untukDictWriter
iniNone
!for i in data or []
data
ada atau tidakNone
, tetapi membiarkan pengecualian terjadi. Anda ingin konsumen API Anda tahu kapan mereka salah menggunakannya. MenerimaNone
sebagai urutan kosong akan membiarkan kesalahan sepertimylist = mylist.extend(morestuff)
, berhasil bersembunyi lebih lama; mereka pikir merekaextend
mengeditlist
(dan mereka melakukannya, tetapi kemudian segera menggantinya denganNone
), kemudian meneruskannya ke fungsi OP dan bertanya-tanya mengapa file tersebut kosong, tanpa kesalahan yang timbul dalam bentuk apa pun.Penjelasan kesalahan: Objek 'NoneType' tidak dapat diubah
Dalam python2, NoneType adalah tipe None. Dalam Python3 NoneType adalah kelas None, misalnya:
Iterasi atas variabel yang memiliki nilai Tidak ada yang gagal:
Metode Python mengembalikan NoneType jika mereka tidak mengembalikan nilai:
Anda perlu memeriksa konstruksi perulangan Anda untuk NoneType seperti ini:
Guido mengatakan hanya digunakan
is
untuk memeriksaNone
karenais
lebih kuat untuk memeriksa identitas. Jangan menggunakan operasi kesetaraan karena mereka dapat meludahkan implementasi bubble-up sendiri. Pedoman Gaya Pengodean Python - PEP-008NoneTypes adalah Sneaky, dan dapat menyelinap masuk dari lambdas:
NoneType bukan kata kunci yang valid:
Rangkaian
None
dan string:Apa yang terjadi di sini?
Penerjemah Python mengonversi kode Anda menjadi bytecode pyc. Mesin virtual Python memproses bytecode, ia menemukan looping construct yang mengatakan iterate pada variabel yang mengandung None. Operasi dilakukan dengan memohon
__iter__
metode pada Tidak Ada.Tidak ada yang tidak memiliki
__iter__
metode yang ditentukan, jadi mesin virtual Python memberi tahu Anda apa yang dilihatnya: bahwa NoneType tidak memiliki__iter__
metode.Inilah sebabnya mengapa bebek-mengetik Python ideologi dianggap buruk. Programmer melakukan sesuatu yang sepenuhnya masuk akal dengan variabel dan pada saat runtime itu terkontaminasi oleh None, mesin virtual python mencoba untuk menjadi tentara, dan memunculkan sekelompok omong kosong yang tidak terkait di seluruh karpet.
Java atau C ++ tidak memiliki masalah ini karena program seperti itu tidak akan diizinkan untuk dikompilasi karena Anda belum menentukan apa yang harus dilakukan ketika Tidak ada yang terjadi. Python memberi banyak tali kepada programmer untuk menggantung dirinya sendiri dengan memungkinkan Anda melakukan banyak hal yang seharusnya tidak dapat diharapkan bekerja dalam keadaan luar biasa. Python adalah yes-man, mengatakan yes-sir ketika itu akan menghentikan Anda dari merugikan diri sendiri, seperti Java dan C ++.
sumber
NoneType
danNone
(b) berpikir bahwaNameError: name 'NoneType' is not defined
danTypeError: cannot concatenate 'str' and 'NoneType' objects
sama denganTypeError: 'NoneType' object is not iterable
(c) perbandingan antara Python dan java adalah "sekelompok omong kosong yang tidak berhubungan"null
ke fungsi yang mengharapkan jenis koleksi apa pun. C ++ akan memiliki masalah yang sama (tetapi umumnya hanya mati dalam segfault tanpa melaporkan penyebabnya) untuknullptr
(diakui, C ++ yang baik jarang menggunakan pointer, tetapi apa yang telah Anda tunjukkan adalah Python yang buruk, dan C ++ yang buruk dapat mati saat runtime dari nol juga) . Python melakukan hal yang benar di sini; itu bukan "serdadu", tetapi gagal saat Anda mencoba menggunakanNone
apa pun yangNone
tidak bisa dilakukan. Masalah Anda bukan dengan Python, itu dengan bahasa yang diketik secara dinamis pada umumnya.Kode:
for row in data:
Pesan kesalahan:
TypeError: 'NoneType' object is not iterable
Obyek mana yang dikeluhkannya? Pilihan dua,
row
dandata
. Difor row in data
, mana yang perlu diubah? Hanyadata
.Ada apa dengan ini
data
? Jenisnya adalahNoneType
. HanyaNone
memiliki tipeNoneType
. Begitudata is None
.Anda dapat memverifikasi ini dalam IDE, atau dengan memasukkan mis
print "data is", repr(data)
sebelumfor
pernyataan, dan menjalankan kembali.Pikirkan tentang apa yang perlu Anda lakukan selanjutnya: Bagaimana seharusnya "tidak ada data" diwakili? Apakah kita menulis file kosong? Apakah kita membuat pengecualian atau mencatat peringatan atau tetap diam?
sumber
Hal lain yang dapat menghasilkan kesalahan ini adalah ketika Anda menetapkan sesuatu yang sama dengan pengembalian dari suatu fungsi, tetapi lupa untuk benar-benar mengembalikan apa pun.
Contoh:
Ini sedikit kesalahan yang sulit dikenali karena kesalahan juga dapat dihasilkan jika variabel baris tidak ada pada salah satu iterasi. Cara untuk menemukannya adalah bahwa jejak gagal pada baris terakhir dan tidak di dalam fungsi.
Jika Anda hanya mengembalikan satu variabel dari suatu fungsi, saya tidak yakin apakah kesalahan akan dihasilkan ... Saya menduga kesalahan "objek 'NoneType' tidak dapat diubah dengan Python" dalam kasus ini sebenarnya menyiratkan "Hei, saya mencoba untuk beralih pada nilai-nilai kembali untuk menempatkan mereka ke tiga variabel ini secara berurutan, tetapi saya hanya mendapatkan Tidak ada untuk beralih lagi "
sumber
Ini berarti bahwa variabel data melewati None (yang merupakan tipe NoneType), yang setara dengan nol . Jadi itu tidak dapat diubah sebagai daftar, seperti yang Anda coba lakukan.
sumber
for row in data or []:
Anda memanggil write_file dengan argumen seperti ini:
Tapi Anda belum mendefinisikan 'foo' dengan benar, atau Anda salah ketik dalam kode sehingga membuat variabel kosong baru dan meneruskannya.
sumber
Bagi saya itu adalah kasus memiliki topi Groovy saya alih-alih yang Python 3 satu.
Lupa
return
kata kunci di akhir adef
fungsi.Belum pernah mengkode Python 3 dengan sungguh-sungguh selama beberapa bulan. Sedang memikirkan pernyataan terakhir yang dievaluasi secara rutin dikembalikan sesuai cara Groovy.
Mengambil beberapa iterasi, melihat jejak stack, memasukkan
try: ... except TypeError: ...
blok debugging / melangkah melalui kode untuk mencari tahu apa yang salah.Solusi untuk pesan itu tentu saja tidak membuat kesalahan melompat ke arahku.
sumber