Apa itu objek 'NoneType'?

89

Saya mendapatkan kesalahan ini ketika saya menjalankan skrip python saya:

TypeError: cannot concatenate 'str' and 'NoneType' objects

Saya cukup yakin 'str' berarti string, tapi saya tidak tahu apa itu objek 'NoneType'. Skrip saya keluar di baris kedua, saya tahu yang pertama berfungsi karena perintah dari baris itu ada di asa saya seperti yang saya harapkan. Awalnya saya pikir itu mungkin karena saya menggunakan variabel dan input pengguna di dalam send_command.

Semua yang ada di 'CAPS' adalah variabel, semua yang ada di 'huruf kecil' adalah input dari opsi 'parser.add_option'.

Saya menggunakan pexpect, dan optparse

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
send_command(child, SNMPSRVUSRCMD + snmpuser + group + V3AUTHCMD + snmphmac + snmpauth + PRIVCMD + snmpencrypt + snmppriv)
tidak aman-IT
sumber
2
Kita perlu melihat lebih banyak kode dan masukan - NoneTyoe berarti salah satu variabel belum disetel
mmmmmm
3
NoneTypeadalah jenis nilai tunggal None. Salah satu nilai Anda bukanlah string.
Martijn Pieters
Cepat & Kotor: letakkan setiap istilah untuk digabungkan dalam str()str (SNMPSRVUSRCMD) + str (snmpuser) + ...
PeterMmm
2
@PeterMmm Itu ide yang buruk - masalah akan terwujud dengan sendirinya (mungkin lebih buruk) di masa mendatang. Akan lebih baik untuk mencari tahu mengapa salah satu variabel adalah None.
arshajii

Jawaban:

83

NoneTypeadalah jenis Noneobjek, yaitu objek yang tidak menunjukkan nilai . Noneadalah nilai hasil dari fungsi yang "tidak mengembalikan apa pun". Ini juga merupakan nilai pengembalian default umum untuk fungsi yang mencari sesuatu dan mungkin menemukannya atau mungkin tidak menemukannya; misalnya, ini dikembalikan oleh re.searchsaat regex tidak cocok, atau dict.getsaat kunci tidak memiliki entri di dikt. Anda tidak dapat menambahkan Nonestring atau objek lain.

Salah satu variabel Anda adalah None, bukan string. Mungkin Anda lupa returndi salah satu fungsi Anda, atau mungkin pengguna tidak memberikan opsi baris perintah dan optparsememberi Anda Nonenilai opsi itu. Saat Anda mencoba menambahkan Noneke string, Anda mendapatkan pengecualian itu:

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

Salah satu dari groupatau SNMPGROUPCMDatau V3PRIVCMDmemiliki Nonenilainya.

Burhan Khalid
sumber
Terima kasih!! Anda benar, salah satu opsi input pengguna saya tidak mengambil karena beberapa alasan. Saya menambahkan ini sebagai "nama" vs opsi dan boom, itu berhasil. Sekarang saya hanya perlu mencari tahu mengapa ini tidak dianggap sebagai opsi dengan benar, semua opsi lain berfungsi dengan baik.
insecure-IT
1
"Not set" agak kabur ... jika variabel tidak ditentukan dan Anda mencoba melakukan beberapa operasi dengannya, Anda akan mendapatkan file NameError. Ini juga bisa disetel, tetapi sama dengan None("set to nothing" = "not set"?), Maka Anda mungkin mendapatkan beberapa TypeError.
Nick T
Pada dasarnya (untuk orang-orang C / Java di sini) tidak ada = null
Zoe
24

NoneTypehanyalah tipe Nonesingleton:

>>> type(None)
<type 'NoneType'>

Dari tautan terakhir di atas:

None

Satu-satunya nilai tipe NoneType. Nonesering digunakan untuk merepresentasikan tidak adanya nilai, seperti ketika argumen default tidak diteruskan ke suatu fungsi. Penugasan Noneadalah ilegal dan meningkatkan a SyntaxError.

Dalam kasus Anda, sepertinya salah satu item yang Anda coba gabungkan adalah None, karenanya kesalahan Anda.

arshajii
sumber
21

Untuk kepentingan pemrograman defensif, objek harus diperiksa terhadap nullity sebelum digunakan.

if obj is None:

atau

if obj is not None:
Gürol Canbek
sumber
2
"adalah" hanya boleh digunakan jika Anda membutuhkannya. Pemrograman pertahanan terbaik adalah tes, banyak tes.
Jürgen A. Erhard
2
Pemrograman defensif adalah salah satu hal yang paling jahat. Jika Anda menemukan error seperti itu, artinya Anda melakukan kesalahan pemrograman. Hal-hal seperti "memeriksa null sebelum digunakan" hanya menyembunyikan beberapa kesalahan serius. Anda harus membiarkan pengecualian itu dilemparkan. Dan jangan membuat pemrogram membuang beberapa pengecualian khusus, ini benar-benar tidak praktis. Biarkan kesalahan alam dibuang. Faktanya, pemrograman defensif adalah gejala bahwa Anda harus menggunakan bahasa lain.
bzim
1
Saya menanyakan database melalui sqlAlchemy. Tidak ada hasil. Objek yang dikembalikan adalah Tidak Ada. Artinya tidak ada hasil. Tidak ada kesalahan. Anda memeriksa apakah hasilnya tidak ada, jika tidak, Anda menggunakan objek result. Tidak ada yang jahat tentang itu. Hal paling jahat tentang pemrograman adalah dogmatisme.
unity100
17

Artinya Anda mencoba untuk menggabungkan string dengan sesuatu None.

Tidak ada yang merupakan "null" dari Python, dan NoneTypemerupakan tipenya.

Kode ini akan memunculkan jenis kesalahan yang sama:

>>> bar = "something"
>>> foo = None
>>> print foo + bar
TypeError: cannot concatenate 'str' and 'NoneType' objects
André Laszlo
sumber
2

Dalam pesan kesalahan, alih-alih memberi tahu Anda bahwa Anda tidak dapat menggabungkan dua objek dengan menunjukkan nilainya (string dan Nonedalam contoh ini), penerjemah Python memberi tahu Anda hal ini dengan menunjukkan jenis objek yang Anda coba gabungkan. Jenis setiap string adalah strsementara jenis Noneinstance tunggal dipanggil NoneType.

Anda biasanya tidak perlu mengkhawatirkan diri sendiri NoneType, tetapi dalam contoh ini Anda perlu mengetahuinya type(None) == NoneType.

Feuermurmel
sumber
Saya memiliki masalah yang sangat mirip dan mencoba mendeteksi jika objeknya adalah NoneType, penegasan Anda tidak berhasil untuk saya: >>> type(key) <type 'NoneType'> >>> type(key) == NoneType Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined
RuBiCK
2
@RuBiCK NoneTypetidak didefinisikan di mana pun (yang saya ketahui). Jika Anda ingin memeriksa apakah suatu nilai None, cukup gunakan key is None(lihat stackoverflow.com/questions/23086383/… ). Jika tidak, Anda dapat menggunakan type(key) == type(None)efek yang sama.
Feuermurmel
1

Kesalahan Anda terjadi karena hal seperti ini: >>>
>>> None + "hello world"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

Objek None Python secara kasar setara dengan null , nil , dll. Dalam bahasa lain.

Dave
sumber
0

Salah satu variabel belum diberi nilai apa pun, oleh karena itu merupakan NoneType. Anda harus melihat mengapa ini terjadi, itu mungkin kesalahan logika sederhana di pihak Anda.

SeanOTRS
sumber