Saya memiliki fungsi yang dapat mengembalikan satu dari tiga hal:
- sukses (
True
) - kegagalan (
False
) - kesalahan pembacaan / aliran parsing (
None
)
Pertanyaan saya adalah, jika saya tidak seharusnya menguji True
atau False
, bagaimana saya harus melihat apa hasilnya. Di bawah ini adalah bagaimana saya saat ini melakukannya:
result = simulate(open("myfile"))
if result == None:
print "error parsing stream"
elif result == True: # shouldn't do this
print "result pass"
else:
print "result fail"
apakah ini benar-benar sesederhana menghapus == True
bagian atau haruskah saya menambahkan tipe data tri-bool. Saya tidak ingin simulate
fungsi untuk melemparkan pengecualian karena semua yang saya ingin program luar lakukan dengan kesalahan adalah log dan lanjutkan.
simulate
fungsi saya menangkap semua pengecualian; Saya tidak ingin apa pun yang terjadi di dalam simulator untuk menghentikan sisa program yang sedang berjalan (dan memproses elemen berikutnya). Tetapi jawabannya membuat saya berubah pikiran.simulate
barang Anda dapat ditangkap dan dicoba lagi, itu bagus. Tetapi jika "gagal", seharusnya tidak kembaliNone
. Seharusnya hanya memunculkan pengecualian pada skrip yang menyebutnya. Either way,simulate
dilakukan. MengembalikanNone
tidak membantu seperti meningkatkan pengecualian yang tepat - atau membiarkan pengecualian menyebarsimulate
ke dalam skrip panggilan untuk ditangani.except Exception:
saja. Ini menangkap semua kesalahan "nyata", bersama denganWarning
danStopIteration
. Itu memungkinkanKeyboardInterrupt
danSystemExit
melaluinya. Jika Anda benar-benar ingin menangkapnya, mungkin lebih baik menggunakan yang lain, coba luar / kecuali atau struktur lain yang dengan jelas mendokumentasikan maksud Anda, karena itu bukan "kesalahan". (Tapi saya mengatakan "hampir tidak pernah" ... mungkin dalam kasus Anda, Anda benar-benar ingin mengambil semuanya, dan bahkan mencegah Ctrl-C atausys.exit()
keluar, dll.)Jawaban:
Jangan takut akan Pengecualian! Program Anda baru saja masuk dan melanjutkan semudah:
Dan sekarang Anda dapat memiliki jenis notifikasi yang jauh lebih kaya dari metode simulasi tentang apa yang sebenarnya salah, jika Anda menemukan kesalahan / tidak ada kesalahan yang tidak cukup informatif.
sumber
traceback.format_exc()
. Lihat jawaban SO ini.tetap sederhana dan eksplisit. Tentu saja Anda dapat menentukan kamus terlebih dahulu.
Jika Anda berencana memodifikasi
simulate
fungsi Anda untuk memasukkan lebih banyak kode kembali, mempertahankan kode ini mungkin menjadi sedikit masalah.The
simulate
juga mungkin meningkatkan pengecualian pada kesalahan parsing, dalam hal ini Anda akan baik akan menangkapnya sini atau membiarkannya menyebarkan tingkat atas dan sedikit pencetakan akan berkurang menjadi satu baris jika-lain pernyataan.sumber
Tidak pernah, tidak pernah, tidak pernah mengatakan
Tidak pernah. Ini gila, karena Anda mengulangi apa yang ditentukan secara berlebihan sebagai aturan kondisi redundan untuk pernyataan-if.
Lebih buruk lagi, tetap, tidak pernah, tidak pernah, tidak pernah mengatakan
Kamu punya
not
. Jangan ragu untuk menggunakannya.Akhirnya, melakukan
a == None
itu tidak efisien. Lakukana is None
.None
adalah objek singleton khusus, hanya ada satu. Cukup periksa untuk melihat apakah Anda memiliki objek itu.sumber
True
tidak berlebihan (meskipun saya setuju itu tidak masuk akal). Itu bisa memanggil__eq__
atau metode khusus lainnya, yang bisa melakukan apa saja secara praktis.if something == True
menghasilkan hasil yang berbeda dariif something
, misalnya untuk non-booleansomething
.2==True
menghasilkan false sedangkan2
dievaluasi ke true;None==False
itu salah tetapinot None
itu benar!something
pengembalianTrue
aktifbool(something)
. Dalam hal ini, jika Anda HANYA ingin memeriksa apakahsomething
memiliki nilaiTrue
yaitubool
. Maka Anda HARUS melakukanif something == True
IMO.Saya ingin menekankan bahwa, bahkan jika ada situasi di mana
if expr :
tidak cukup karena salah satu ingin memastikanexpr
iniTrue
dan tidak hanya berbeda dari0
/None
/ apa pun,is
harus disukai dari==
untuk alasan yang sama S. Lott mentionned untuk menghindari== None
.Memang sedikit lebih efisien dan, ceri pada kue, lebih dapat dibaca manusia.
sumber
Saya percaya bahwa melemparkan pengecualian adalah ide yang lebih baik untuk situasi Anda. Alternatifnya adalah metode simulasi untuk mengembalikan tuple. Item pertama akan menjadi status dan yang kedua hasilnya:
sumber
False
dikembalikan, itu akan dicetak'error parsing stream'
.