4 fitur canggih Python masih hilang

Python adalah bahasa yang hidup - di bawah pengembangan konstan untuk mengikuti perkembangan zaman. Python Software Foundation tidak hanya membuat penambahan ke pustaka standar dan implementasi referensi CPython, tetapi juga memperkenalkan fitur baru dan penyempurnaan bahasa itu sendiri.

Misalnya, Python 3.8 memperkenalkan sintaks baru untuk tugas in-line ("operator walrus") yang membuat operasi tertentu lebih ringkas. Peningkatan sintaksis lain yang baru disetujui, pencocokan pola, akan mempermudah penulisan kode yang mengevaluasi salah satu dari banyak kemungkinan kasus. Kedua fitur ini terinspirasi oleh keberadaan dan kegunaannya dalam bahasa lain.

Dan itu hanya dua dari sekian banyak fitur berguna yang dapat ditambahkan ke Python untuk membuat bahasanya lebih ekspresif, lebih kuat, lebih sesuai dengan dunia pemrograman modern. Apa lagi yang mungkin kita harapkan? Berikut adalah empat lagi fitur bahasa yang dapat menambahkan sesuatu yang bernilai nyata ke Python - dua mungkin kita dapatkan, dan dua mungkin tidak. 

Konstanta sejati

Python tidak benar-benar memiliki konsep nilai konstan. Saat ini, konstanta dalam Python sebagian besar merupakan masalah konvensi. Menggunakan nama dengan huruf besar semua dan huruf besar / kecil - misalnya, DO_NOT_RESTART - adalah petunjuk bahwa variabel dimaksudkan untuk menjadi konstanta. Demikian pula,  typing.Final anotasi tipe memberikan petunjuk kepada linter bahwa suatu objek tidak boleh dimodifikasi, tetapi tidak memberlakukannya pada waktu proses.

Mengapa? Karena mutabilitas tertanam kuat dalam perilaku Python. Saat Anda menetapkan nilai ke variabel - misalnya,  x=3 - Anda membuat nama di namespace lokal  x, dan mengarahkannya ke objek dalam sistem yang memiliki nilai integer  3. Python selalu berasumsi bahwa nama dapat berubah - bahwa nama apa pun dapat menunjuk ke objek apa pun . Itu berarti bahwa setiap kali sebuah nama digunakan, Python akan kesulitan mencari objek apa yang ditunjuknya. Dinamisme ini adalah salah satu alasan utama Python berjalan lebih lambat daripada beberapa bahasa lain. Dinamisme Python menawarkan fleksibilitas dan kenyamanan yang luar biasa, tetapi mengorbankan kinerja runtime.

Salah satu keuntungan memiliki deklarasi konstanta sejati dengan Python adalah pengurangan frekuensi pencarian objek yang terjadi selama runtime, dan dengan demikian kinerja yang lebih baik. Jika runtime mengetahui sebelumnya bahwa nilai tertentu tidak pernah berubah, itu tidak harus mencari bindingnya. Ini juga dapat memberikan jalan untuk pengoptimalan pihak ketiga lebih lanjut, seperti sistem yang menghasilkan kode asli mesin dari aplikasi Python (Cython, Nuitka).

Namun, konstanta sejati akan menjadi perubahan besar, dan kemungkinan besar merupakan perubahan yang tidak kompatibel ke belakang. Ini juga akan menjadi perdebatan jika konstanta akan datang melalui sintaks baru - misalnya, $ simbol yang belum digunakan  - atau sebagai perpanjangan dari cara Python yang ada untuk mendeklarasikan nama. Akhirnya, ada pertanyaan filosofis yang lebih besar tentang apakah konstanta sejati masuk akal atau tidak dalam bahasa di mana dinamisme telah menjadi bagian besar yang menarik.

Singkatnya, mungkin saja kita akan melihat konstanta sebenarnya dalam Python, tetapi itu akan menjadi perubahan besar yang dapat merusak.

Overloading dan generik sejati

Dalam banyak bahasa, beberapa versi dari fungsi yang sama dapat ditulis untuk bekerja dengan jenis masukan yang berbeda. Misalnya, suatu  to_string() fungsi dapat memiliki implementasi yang berbeda untuk mengonversi dari bilangan bulat, bilangan floating-point, atau objek lain - tetapi keduanya akan menggunakan nama yang sama demi kenyamanan. “Overloading,” atau “generics,” mempermudah penulisan perangkat lunak yang kuat, karena Anda dapat menulis metode umum untuk proses umum daripada menggunakan metode khusus untuk jenis tertentu.

Python memungkinkan Anda menggunakan satu nama fungsi untuk melakukan pekerjaan banyak orang, tetapi tidak dengan mendefinisikan beberapa contoh fungsi. Anda hanya dapat menentukan nama sekali dalam cakupan tertentu dan mengikatnya hanya ke satu objek pada satu waktu, jadi Anda tidak dapat memiliki beberapa versi dari satu fungsi dengan nama yang sama.

Apa yang biasanya dilakukan pengembang Python untuk mengatasinya adalah menggunakan seperti bawaan  isinstance() atau  type() untuk menentukan jenis variabel yang dikirimkan ke suatu fungsi, lalu mengambil tindakan berdasarkan jenisnya. Kadang-kadang ini melibatkan pengiriman ke versi jenis khusus dari suatu fungsi di bawah tenda. Tetapi pendekatan ini menyulitkan pengembang lain untuk memperluas fungsi Anda kecuali jika Anda berusaha keras untuk membuatnya dapat diperluas - misalnya, dengan mengirimkan ke metode dalam kelas, yang dapat disubkelas.

PEP 3124, yang diajukan pada bulan April 2007, mengusulkan mekanisme fungsi dekorasi untuk menunjukkan bahwa mereka dapat kelebihan beban. Proposal itu ditunda dan bukannya ditolak mentah-mentah - artinya idenya pada dasarnya bagus, tetapi waktunya tidak tepat untuk mengimplementasikannya. Satu faktor yang mungkin mempercepat adopsi overloading dengan Python - atau menyebabkan ide dibuang seluruhnya - adalah penerapan sistem pencocokan pola yang baru diusulkan.

Secara teori, pencocokan pola dapat digunakan di bawah kap untuk menangani pengiriman yang berlebihan. Namun, pencocokan pola juga bisa diberikan sebagai alasan untuk tidak mengimplementasikan generik dengan Python, karena sudah menyediakan cara yang elegan untuk mengirim operasi berdasarkan tanda tangan tipe.

Jadi kita mungkin benar-benar kelebihan beban di Python suatu hari nanti, atau keuntungannya mungkin digantikan oleh mekanisme lain.

Pengoptimalan rekursi ekor

Banyak kompiler bahasa menggunakan pengoptimalan rekursi tail, di mana fungsi yang memanggil dirinya sendiri tidak membuat bingkai tumpukan baru dalam aplikasi, dan dengan demikian berisiko meledakkan tumpukan jika berjalan terlalu lama. Python tidak melakukan ini, dan faktanya pembuatnya secara konsisten menolak melakukannya.

Salah satu alasannya adalah banyak Python, dari dalam ke luar, menggunakan  iterasi  daripada  rekursi  - generator, coroutine, dan sebagainya. Dalam hal ini, ini berarti menggunakan fungsi dengan loop dan struktur tumpukan, bukan mekanisme rekursif. Setiap panggilan loop dapat disimpan ke dalam tumpukan untuk membuat rekursi baru, dan muncul dari tumpukan saat rekursi selesai.

Pengembang Python didorong untuk menggunakan pola ini daripada rekursi, jadi tampaknya ada sedikit harapan untuk pengoptimalan rekursi. Peluang di sini tidak mungkin sama sekali, karena idiom Python mendukung solusi lain.

Lambda multiline

Lambdas, atau fungsi anonim, berhasil membuatnya menjadi Python hanya setelah beberapa perlawanan dari pencipta bahasa Guido van Rossum. Karena Python lambda ada sekarang, mereka sangat dibatasi: Mereka hanya mengizinkan Anda untuk menggunakan ekspresi tunggal (pada dasarnya, apa saja di sebelah kanan tanda sama dengan dalam operasi penugasan) sebagai badan fungsi. Jika Anda menginginkan satu blok penuh pernyataan, cukup hancurkan dan buat fungsi aktual darinya.

Alasannya bermuara pada desain bahasa seperti yang dilihat oleh van Rossum. Seperti yang ditulis van Rossum pada tahun 2006, “Saya menemukan   solusi apa pun yang tidak dapat diterima yang menyematkan blok berbasis indentasi di tengah ekspresi. Karena saya menemukan sintaks alternatif untuk pengelompokan pernyataan (mis. Tanda kurung atau kata kunci awal / akhir) sama-sama tidak dapat diterima, ini membuat lambda multiline menjadi teka-teki yang tidak dapat dipecahkan. ”

Dengan kata lain, masalahnya bukanlah teknis, tetapi kurangnya sintaks untuk multiline lambda yang melengkapi estetika sintaks Python yang ada. Mungkin tidak ada cara untuk melakukannya yang tidak melibatkan pembuatan kasus khusus, dan bahasa yang menghasilkan kasus khusus cenderung menjadi tidak menyenangkan untuk digunakan. Sampai unicorn seperti itu muncul, kita hanya harus puas dengan fungsi yang ditentukan secara terpisah.

Lambda multiline mungkin tidak terjadi dengan Python.

Baca lebih lanjut tentang Python:

  • Python 3.9: Apa yang baru dan lebih baik
  • Fitur baru terbaik di Python 3.8
  • Manajemen proyek Python yang lebih baik dengan Poetry
  • Virtualenv dan venv: Penjelasan lingkungan virtual Python
  • Python virtualenv dan venv lakukan dan tidak boleh dilakukan
  • Penjelasan threading dan subproses Python
  • Cara menggunakan debugger Python
  • Cara menggunakan timeit untuk membuat profil kode Python
  • Cara menggunakan cProfile untuk membuat profil kode Python
  • Mulailah dengan async dengan Python
  • Cara menggunakan asyncio dengan Python
  • Cara mengonversi Python ke JavaScript (dan kembali lagi)
  • Python 2 EOL: Cara bertahan dari akhir Python 2
  • 12 Pythons untuk setiap kebutuhan pemrograman
  • 24 perpustakaan Python untuk setiap pengembang Python
  • 7 IDE Python manis yang mungkin Anda lewatkan
  • 3 kekurangan utama Python — dan solusinya
  • 13 kerangka web Python dibandingkan
  • 4 kerangka uji Python untuk menghancurkan bug Anda
  • 6 fitur Python baru yang hebat yang tidak ingin Anda lewatkan
  • 5 distribusi Python untuk menguasai pembelajaran mesin
  • 8 perpustakaan Python yang bagus untuk pemrosesan bahasa alami
  • 6 perpustakaan Python untuk pemrosesan paralel
  • Apa itu PyPy? Python lebih cepat tanpa rasa sakit
  • Apa itu Cython? Python dengan kecepatan C