Saya punya Nonetype
nilai x
, umumnya angka, tapi bisa jadi None
. Saya ingin membaginya dengan angka, tetapi Python memunculkan:
TypeError: int() argument must be a string or a number, not 'NoneType'
Bagaimana saya bisa memecahkan masalah ini?
int(None)
melempar pengecualian karena Tidak Ada tidak bisa diubah menjadi int. Jawaban atas pertanyaan Anda tidak bisa dilakukan. Anda dapat mengganti sesuatu, seperti 0, atau 2771, atau gajah merah muda, tetapi apa pun yang Anda gantikan, Anda tetap tidak dapat mengonversi Tidak Ada menjadi int.None
menjadi gajah merah muda juga tidak baik, kecuali Anda mengerjakan beberapa sistem bilangan yang secara resmi mendefinisikan pembagian angka dengan gajah merah muda (dan Anda telah menulis kode untuk mendukungnya)Jawaban:
Di salah satu komentar, Anda berkata:
Jika itu kode Anda, cari tahu bagaimana Anda mendapatkan
None
ketika Anda mengharapkan nomor dan hentikan itu terjadi.Jika itu adalah kode orang lain, cari tahu kondisi yang diberikan
None
dan tentukan nilai yang masuk akal untuk digunakan untuk itu, dengan kode bersyarat biasa:result = could_return_none(x) if result is None: result = DEFAULT_VALUE
...atau bahkan...
if x == THING_THAT_RESULTS_IN_NONE: result = DEFAULT_VALUE else: result = could_return_none(x) # But it won't return None, because we've restricted the domain.
Tidak ada alasan untuk secara otomatis menggunakan di
0
sini - solusi yang bergantung pada "palsu" -None
anggapan Anda akan menginginkan ini. ItuDEFAULT_VALUE
(bahkan jika ada) sepenuhnya tergantung pada tujuan kode Anda.sumber
int(value or 0)
Ini akan menggunakan 0 jika Anda memberikan nilai apa pun yang dipertimbangkan Python
False
, seperti None, 0, [], "", dll. Karena 0 adalahFalse
, Anda sebaiknya hanya menggunakan 0 sebagai nilai alternatif (jika tidak, Anda akan menemukan 0 berubah menjadi nilai itu).int(0 if value is None else value)
Ini hanya menggantikan
None
dengan 0. Karena kami menguji secaraNone
khusus, Anda dapat menggunakan beberapa nilai lain sebagai penggantinya.sumber
(value or 0)
- tanpa pengecoran tipe int - jika kita yakin bahwa nilainya hanya dapat berupa None atau intCara umum "Pythonic" untuk menangani situasi semacam ini dikenal sebagai EAFP untuk " Lebih mudah meminta maaf daripada izin ". Yang biasanya berarti menulis kode yang mengasumsikan semuanya baik-baik saja, tetapi kemudian membungkusnya dengan
try...except
blok untuk menangani berbagai hal — untuk berjaga-jaga — ternyata tidak.Inilah gaya pengkodean yang diterapkan pada masalah Anda:
try: my_value = int(my_value) except TypeError: my_value = 0 # or whatever you want to do answer = my_value / divisor
Atau mungkin yang lebih sederhana dan sedikit lebih cepat:
try: answer = int(my_value) / divisor except TypeError: answer = 0
Pendekatan terbalik dan yang lebih tradisional dikenal sebagai LBYL yang merupakan singkatan dari " Lihat sebelum Anda melompat " adalah apa yang disarankan oleh @Soviut dan beberapa yang lain. Untuk cakupan tambahan topik ini lihat jawaban saya dan komentar terkait untuk pertanyaan Menentukan apakah kunci ada dalam kamus di tempat lain di situs ini.
Salah satu potensi masalah dengan EAFP adalah ia dapat menyembunyikan fakta bahwa ada sesuatu yang salah dengan beberapa bagian lain dari kode Anda atau modul pihak ketiga yang Anda gunakan, terutama ketika pengecualian sering terjadi (dan karenanya bukan kasus yang benar-benar "luar biasa" sama sekali).
sumber
Itu
TypeError
hanya muncul ketika Anda mencoba untuk lulusint()
None
(yang merupakan satu-satunyaNoneType
nilai, sejauh yang saya tahu). Saya akan mengatakan bahwa tujuan Anda yang sebenarnya seharusnya tidak mengonversiNoneType
menjadiint
ataustr
, tetapi untuk mencari tahu di mana / mengapa Anda mendapatkanNone
alih-alih angka seperti yang diharapkan, dan memperbaikinya atau menanganinya denganNone
benar.sumber
int()
bilangan kompleks, sepertiint(1+2j)
, juga akan menyebabkan aTypeError
dinaikkan, meskipun diakui hal itu mungkin sangat tidak mungkin. Terlepas dari itu, saya pikir Anda berkata akan, tanpa pertanyaan, umumnya nasihat yang baik untuk diikuti.Di Python 3, Anda juga dapat menggunakan kata kunci "atau". Cara ini:
foo = bar or 0 foo2 = bar or ""
sumber
Saya telah berhasil menggunakan int (x atau 0) untuk jenis kesalahan ini, selama Tidak Ada harus sama dengan 0 dalam logika. Perhatikan bahwa ini juga akan menyelesaikan ke 0 dalam kasus lain di mana pengujian x mengembalikan False. misalnya daftar kosong, set, kamus atau string panjang nol. Maaf, Kindall sudah memberikan jawaban ini.
sumber
Ini bisa terjadi jika Anda lupa mengembalikan nilai dari suatu fungsi: kemudian mengembalikan None. Lihat semua tempat di mana Anda menetapkan ke variabel itu, dan lihat apakah salah satunya adalah pemanggilan fungsi di mana fungsinya tidak memiliki pernyataan return.
sumber
return
bukanreturn some_expression
.return None
pernyataanAnda harus memeriksa untuk memastikan nilainya bukan None sebelum mencoba melakukan penghitungan apa pun padanya:
my_value = None if my_value is not None: print int(my_value) / 2
Catatan:
my_value
sengaja disetel ke Tidak Ada untuk membuktikan kode berfungsi dan bahwa pemeriksaan sedang dilakukan.sumber
is [not] None
)my_value
tanpa syarat ke Tidak Ada; Mengapa? Anda tidak mempertanyakan mengapa OP berpikir dia perlu melakukanint(my_value)
padahalmy_value
(jika tidak ada) "umumnya angka".Saya mengalami masalah yang sama menggunakan fungsi email python. Di bawah ini adalah kode yang saya coba untuk mengambil subjek email ke dalam variabel. Ini berfungsi dengan baik untuk sebagian besar email dan variabel terisi. Jika Anda menerima email dari Yahoo atau sejenisnya dan pengirim tidak mengisi baris subjek, Yahoo tidak membuat baris subjek di email dan Anda mendapatkan NoneType yang dikembalikan dari fungsi tersebut. Martineau memberikan jawaban yang benar seperti halnya Soviut. Jawaban IMO Soviut lebih ringkas dari segi pemrograman; belum tentu dari Python. Berikut beberapa kode untuk menunjukkan tekniknya:
import sys, email, email.Utils afile = open(sys.argv[1], 'r') m = email.message_from_file(afile) subject = m["subject"] # Soviut's Concise test for unset variable. if subject is None: subject = "[NO SUBJECT]" # Alternative way to test for No Subject created in email (Thanks for NoneThing Yahoo!) try: if len(subject) == 0: subject = "[NO SUBJECT]" except TypeError: subject = "[NO SUBJECT]" print subject afile.close()
sumber
Dalam beberapa situasi, sebaiknya memiliki fungsi untuk mengonversi None menjadi int zero:
def nz(value): ''' Convert None to int zero else return value. ''' if value == None: return 0 return value
sumber