Anda ingin memeriksa apakah ada objek
bertindak seperti angka dalam keadaan tertentu
Jika Anda menggunakan Python 2.5 atau yang lebih lama, satu-satunya cara yang nyata adalah dengan memeriksa beberapa "keadaan tertentu" dan melihat.
Di 2.6 atau lebih baik, Anda dapat menggunakan isinstance
dengan bilangan.Nomor - kelas dasar abstrak (ABC) yang ada persis untuk tujuan ini (lebih banyak ABC ada dicollections
modul untuk berbagai bentuk koleksi / kontainer, sekali lagi dimulai dengan 2.6; dan, juga hanya dalam rilis tersebut, Anda dapat dengan mudah menambahkan kelas dasar abstrak Anda sendiri jika perlu).
Bach ke 2.5 dan sebelumnya, "dapat ditambahkan ke 0
dan tidak dapat diulang" bisa menjadi definisi yang baik dalam beberapa kasus. Tapi, Anda benar-benar perlu bertanya pada diri sendiri, apa yang Anda tanyakan sehingga apa yang ingin Anda anggap sebagai "angka" pasti bisa dilakukan , dan apa yang pasti tidak bisa dilakukan bisa dilakukan - dan periksa.
Ini mungkin juga diperlukan di 2.6 atau yang lebih baru, mungkin untuk tujuan membuat pendaftaran Anda sendiri untuk menambahkan jenis yang Anda pedulikan yang belum didaftarkan numbers.Numbers
- jika Anda ingin mengecualikan beberapa jenis yang mengklaim bahwa mereka adalah nomor tetapi Anda hanya tidak bisa menangani, itu bahkan lebih berhati-hati, karena ABC tidak memiliki unregister
metode [[misalnya Anda dapat membuat ABC Anda sendiri WeirdNum
dan mendaftarkan di sana semua jenis yang aneh untuk Anda, kemudian periksa terlebih dahulu untuk isinstance
menebusnya sebelum Anda melanjutkan untuk memeriksa isinstance
normal numbers.Number
untuk melanjutkan dengan sukses.
BTW, jika dan ketika Anda perlu memeriksa apakah x
bisa atau tidak bisa melakukan sesuatu, Anda biasanya harus mencoba sesuatu seperti:
try: 0 + x
except TypeError: canadd=False
else: canadd=True
Kehadiran __add__
per se memberi tahu Anda tidak ada yang berguna, karena misalnya semua urutan memilikinya untuk tujuan penggabungan dengan urutan lain. Pemeriksaan ini setara dengan definisi "bilangan adalah sesuatu yang urutan dari hal-hal seperti itu adalah argumen tunggal yang valid untuk fungsi bawaan sum
", misalnya. Jenis yang benar-benar aneh (misalnya, yang memunculkan pengecualian "salah" saat dijumlahkan menjadi 0, seperti, katakanlah, a ZeroDivisionError
atauValueError
& c) akan menyebarkan pengecualian, tetapi tidak apa-apa, beri tahu pengguna secepatnya bahwa jenis gila seperti itu tidak dapat diterima dalam keadaan baik perusahaan;-); tetapi, "vektor" yang dapat diringkas ke skalar (pustaka standar Python tidak memilikinya, tetapi tentu saja mereka populer sebagai ekstensi pihak ketiga) juga akan memberikan hasil yang salah di sini, jadi (mis.yang "tidak diizinkan untuk berulang" (misalnya, periksa iter(x)
kenaikan gaji TypeError
, atau untuk keberadaan metode khusus __iter__
- jika Anda berada di 2.5 atau lebih awal dan karenanya perlu pemeriksaan Anda sendiri).
Sekilas tentang kerumitan seperti itu mungkin cukup untuk memotivasi Anda untuk mengandalkan kelas dasar abstrak kapan pun memungkinkan ... ;-).