Jenis objek apa yang termasuk dalam domain "subscriptable"?
python
terminology
Alistair
sumber
sumber
hasattr(SomeClassWithoutGetItem, '__getitem__')
menentukan apakah suatu barang dapat disubkripsikan?[
...]
mengindeks sintaks disebut subscript , karena itu setara dengan notasi matematika yang menggunakan subscript yang sebenarnya; misalnyaa[1]
Python untuk apa yang akan ditulis oleh matematikawan sebagai a₁ . Jadi "subscriptable" berarti "bisa menjadi subscript". Yang, dalam istilah Python, berarti harus diterapkan__getitem__()
, karenaa[1]
hanya gula sintaksis untuka.__getitem__(1)
.hasattr
seharusnya bekerja dengan baik, tetapi itu bukan cara Pythonic untuk melakukan sesuatu; Latihan Python mendorong Bebek Mengetik . Artinya, jika Anda berencana untuk mengambil item dari objek Anda menggunakan subskrip, silakan dan lakukan; jika Anda berpikir itu mungkin tidak berhasil karena objek tidak dapat disubkripsikan, bungkus dalamtry
blok denganexcept TypeError
.Dari atas kepala saya, berikut ini adalah satu-satunya built-in yang dapat disubkripsikan:
Tetapi jawaban mipadi benar - setiap kelas yang mengimplementasikannya
__getitem__
dapat disubkripsikansumber
Objek skrip adalah objek yang mencatat operasi yang dilakukan untuk itu dan dapat menyimpannya sebagai "skrip" yang dapat diputar ulang.
Misalnya, lihat: Kerangka Kerja Skrip Aplikasi
Sekarang, jika Alistair tidak tahu apa yang dia tanyakan dan benar-benar berarti objek "dapat disandikan" (seperti yang diedit oleh orang lain), maka (seperti yang dijawab mipadi) ini adalah yang benar:
Objek subscriptable adalah objek apa pun yang mengimplementasikan
__getitem__
metode khusus (think list, kamus).sumber
Arti subskrip dalam komputasi adalah: "simbol (secara tertulis ditulis sebagai subskrip tetapi dalam praktiknya biasanya tidak) digunakan dalam suatu program, sendiri atau dengan yang lain, untuk menentukan salah satu elemen dari array."
Sekarang, dalam contoh sederhana yang diberikan oleh @ user2194711 kita dapat melihat bahwa elemen appending tidak dapat menjadi bagian dari daftar karena dua alasan: -
1) Kami tidak benar-benar memanggil metode append; karena itu perlu
()
menyebutnya.2) Kesalahan mengindikasikan bahwa fungsi atau metode tidak dapat disubkripsikan; berarti mereka tidak dapat diindeks seperti daftar atau urutan.
Sekarang lihat ini: -
Itu berarti tidak ada subskrip atau mengatakan elemen dalam
function
seperti mereka terjadi secara berurutan; dan kami tidak dapat mengaksesnya seperti yang kami lakukan, dengan bantuan[]
.Juga; seperti yang dikatakan mipadi dalam jawabannya; Ini pada dasarnya berarti bahwa objek mengimplementasikan
__getitem__()
metode. (jika dapat disubkripsikan). Jadi kesalahan yang dihasilkan:sumber
Saya punya masalah yang sama. saya tengah mengerjakan
Jadi menggunakan
[
menyebabkan kesalahan. Harusarr.append("HI")
sumber
Sebagai jawaban wajar untuk jawaban sebelumnya di sini, sangat sering ini adalah tanda bahwa Anda berpikir Anda memiliki daftar (atau dict, atau objek subscriptable lainnya) ketika Anda tidak.
Misalnya, katakanlah Anda memiliki fungsi yang harus mengembalikan daftar;
Sekarang ketika Anda memanggil fungsi itu, dan
something_happens()
untuk beberapa alasan tidak mengembalikanTrue
nilai, apa yang terjadi? Theif
gagal, dan sehingga Anda jatuh;gimme_things
tidak secara eksplisitreturn
apa pun - jadi pada kenyataannya, itu akan secara implisitreturn None
. Maka kode ini:akan gagal dengan "
NoneType
objek tidak subscriptable" karena, baik,things
adalahNone
dan jadi Anda coba lakukanNone[0]
yang tidak masuk akal karena ... apa pesan kesalahan mengatakan.Ada dua cara untuk memperbaiki bug ini dalam kode Anda - yang pertama adalah untuk menghindari kesalahan dengan memeriksa yang
things
sebenarnya valid sebelum mencoba menggunakannya;atau dengan cara yang sama menjebak
TypeError
pengecualian;Lain adalah mendesain ulang
gimme_things
sehingga Anda memastikan itu selalu mengembalikan daftar. Dalam hal ini, itu mungkin desain yang lebih sederhana karena itu berarti jika ada banyak tempat di mana Anda memiliki bug yang sama, mereka dapat dibuat sederhana dan idiomatis.Tentu saja, apa yang Anda masukkan ke
else:
cabang tergantung pada use case Anda. Mungkin Anda harus mengajukan pengecualian ketikasomething_happens()
gagal, agar lebih jelas dan eksplisit di mana ada sesuatu yang salah? Menambahkan pengecualian ke kode Anda sendiri adalah cara penting untuk membuat diri Anda tahu persis apa yang terjadi ketika sesuatu gagal!(Perhatikan juga bagaimana perbaikan terakhir ini masih belum sepenuhnya memperbaiki bug - itu mencegah Anda dari mencoba untuk berlangganan,
None
tetapithings[0]
masih merupakanIndexError
kapanthings
daftar kosong. Jika Anda memilikitry
Anda dapat melakukannyaexcept (TypeError, IndexError)
untuk menjebaknya juga.)sumber