Fitur pattern matching Python , yang diperkenalkan dalam versi 3.10, memiliki kerentanan tak terduga yang memungkinkan pengembang untuk membajak pernyataan match melalui Abstract Base Classes ( ABCs ). Penemuan ini telah memicu perdebatan sengit di komunitas Python tentang keputusan desain di balik mekanisme kontrol alur terbaru bahasa pemrograman ini.
Timeline Kerentanan Pattern Matching Python
- Python 3.10: Pattern matching diperkenalkan dengan pernyataan
match
/case
- Pattern matching menggunakan pemeriksaan
isinstance()
yang menghormati metode__subclasshook__
ABC - ABC dapat mendefinisikan logika khusus untuk penentuan subclass
- Python 3.8: Protocol diperkenalkan sebagai alternatif yang lebih aman untuk structural typing
- Python 2.6: ABC dengan
__subclasshook__
pertama kali tersedia (11 tahun sebelum Protocol)
Celah Tersembunyi dalam Pattern Matching
Masalah ini berasal dari cara pattern matching Python berinteraksi dengan Abstract Base Classes dan metode __subclasshook__
mereka. Metode ini memungkinkan ABCs untuk mendefinisikan logika khusus dalam menentukan apakah suatu kelas dihitung sebagai subkelas, bahkan jika kelas target tidak memiliki pengetahuan tentang ABC tersebut. Ketika pattern matching memeriksa isinstance(obj, class)
, ia menghormati hook khusus ini, menciptakan peluang untuk perilaku yang tidak terduga.
Seorang pengembang dapat membuat ABC yang mencocokkan objek berdasarkan kondisi yang sewenang-wenang - apakah mereka memiliki atribut tertentu, nama mereka adalah palindrom, atau bahkan berdasarkan input pengguna. Ini berarti pernyataan match yang tampaknya memeriksa tipe tertentu mungkin sebenarnya menjalankan logika yang sama sekali berbeda di balik layar.
Abstract Base Classes (ABCs): Kelas Python yang mendefinisikan antarmuka yang harus diimplementasikan oleh kelas lain, memungkinkan pemeriksaan tipe yang fleksibel tanpa pewarisan eksplisit.
Kekhawatiran Komunitas tentang Desain Bahasa
Komunitas Python telah menyatakan kekhawatiran signifikan tentang perilaku ini, terutama terkait keterbacaan dan kemudahan pemeliharaan kode. Banyak pengembang khawatir bahwa fitur ini menciptakan aksi seram dari jarak jauh di mana debugging menjadi hampir tidak mungkin ketika ABCs dari berbagai bagian basis kode berinteraksi secara tidak terduga.
Kritik yang lebih luas meluas ke implementasi pattern matching Python itu sendiri. Tidak seperti bahasa fungsional yang menangani pattern matching dengan elegan, versi Python telah menarik kritik karena perilakunya yang tidak konsisten dengan variable scoping dan desainnya yang berbasis pernyataan daripada berbasis ekspresi. Komunitas telah mencatat bahwa pencocokan pada konstanta versus variabel menghasilkan hasil yang sangat berbeda, merusak ekspektasi fundamental tentang bagaimana kode Python seharusnya berperilaku.
Variable scoping: Bagaimana bahasa pemrograman menentukan di mana variabel dapat diakses dan dimodifikasi dalam kode.
Masalah yang Diidentifikasi Komunitas dengan Pattern Matching Python
- Variable Scoping: Variabel bocor keluar dari blok match, merusak ekspektasi
- Inkonsistensi Sintaks:
case 404
vscase not_found
berperilaku sangat berbeda - Statement vs Expression: Tidak seperti bahasa lain, pattern matching Python berbasis statement
- Fleksibilitas Terbatas: Tidak dapat menggunakan variabel secara langsung tanpa solusi alternatif
- Double Indentation: Memerlukan tingkat indentasi ekstra dibandingkan konstruksi lainnya
- Perilaku Caching: Hasil
__subclasshook__
di-cache, membatasi perilaku dinamis
Pendekatan Alternatif dan Solusi Sementara
Meskipun berpotensi disalahgunakan, beberapa anggota komunitas melihat aplikasi yang sah untuk fungsi ini. Fitur ini pada dasarnya memungkinkan structural typing - memeriksa apakah objek mengimplementasikan antarmuka tertentu tanpa pewarisan eksplisit. Ini sangat berharga sebelum Python 3.8 memperkenalkan Protocols , yang menyediakan cara yang lebih aman untuk mencapai hasil serupa.
Namun, konsensus tetap sangat menentang penggunaan teknik ini dalam kode produksi. Komunitas menekankan bahwa meskipun secara teknis mungkin, pendekatan seperti itu melanggar prinsip kejutan paling sedikit dan membuat kode jauh lebih sulit untuk dipelihara dan di-debug.
Perdebatan Pattern Matching yang Lebih Luas
Penemuan ini telah memicu kembali diskusi tentang pilihan desain pattern matching Python . Banyak pengembang merasa fitur ini diimplementasikan dengan buruk dibandingkan dengan fungsionalitas serupa dalam bahasa lain, mengutip masalah seperti persyaratan indentasi ganda, dukungan ekspresi terbatas, dan aturan sintaks yang tidak konsisten.
Fitur pattern matching secara keseluruhan dirancang dengan cukup masuk akal, dan orang akan mengharapkannya berperilaku dengan cara yang masuk akal. Sedangkan subclasshook adalah sihir yang sangat gelap.
Reaksi komunitas menyoroti kekhawatiran yang berkembang tentang penambahan bahasa Python terbaru. Beberapa pengembang berpendapat bahwa fitur seperti pattern matching menambah kompleksitas tanpa memberikan manfaat yang proporsional, terutama ketika alternatif yang lebih sederhana seperti dictionary atau pernyataan if sering kali sudah cukup.
Meskipun teknik pembajakan ABC ini menunjukkan fleksibilitas Python , ini juga berfungsi sebagai kisah peringatan tentang konsekuensi yang tidak diinginkan dari menggabungkan fitur bahasa yang kuat. Rekomendasi kuat komunitas Python tetap jelas: hindari teknik ini dalam kode produksi untuk menjaga keterbacaan dan mencegah mimpi buruk debugging.
Referensi: CRIMES WITH PYTHON'S PATTERN MATCHING