4 ciri kuat Python masih hilang

Python adalah bahasa hidup - dalam perkembangan berterusan untuk mengikuti zaman. Yayasan Perisian Python tidak hanya membuat penambahan pada perpustakaan standard dan pelaksanaan CPython rujukan, tetapi juga memperkenalkan fitur dan penyempurnaan baru pada bahasa itu sendiri.

Sebagai contoh, Python 3.8 memperkenalkan sintaks baru untuk penugasan dalam talian ("operator walrus") yang menjadikan operasi tertentu lebih ringkas. Peningkatan sintaks lain yang baru disetujui, pemadanan corak, akan memudahkan menulis kod yang menilai salah satu daripada banyak kemungkinan kes. Kedua-dua ciri ini diilhamkan oleh kehadiran dan kegunaannya dalam bahasa lain.

Dan itu hanya dua dari banyak ciri berguna yang dapat ditambahkan ke Python untuk menjadikan bahasa lebih ekspresif, lebih kuat, lebih sesuai dengan dunia pengaturcaraan moden. Apa lagi yang kita mahukan? Berikut adalah empat lagi ciri bahasa yang dapat menambahkan sesuatu yang bernilai nyata untuk Python - dua yang sebenarnya kita dapat, dan dua yang mungkin tidak akan kita dapat. 

Pemalar benar

Python tidak mempunyai konsep nilai tetap. Pada masa ini, pemalar di Python kebanyakannya merupakan perkara biasa. Menggunakan nama yang terdapat di semua penutup dan ular - contohnya DO_NOT_RESTART - adalah petunjuk bahawa pemboleh ubah dimaksudkan untuk menjadi pemalar. Begitu juga,  typing.Final anotasi jenis memberikan petunjuk kepada linters bahawa objek tidak boleh diubah, tetapi tidak menegaskannya pada waktu runtime.

Kenapa? Kerana kebolehubahan sangat tertanam dalam tingkah laku Python. Apabila anda menetapkan nilai ke pemboleh ubah - misalnya,  x=3 - anda membuat nama di ruang nama tempatan  x, dan menunjukkannya ke objek dalam sistem yang mempunyai nilai bilangan bulat  3. Python selalu menganggap bahawa nama boleh berubah - bahawa nama apa pun dapat menunjukkan objek apa pun . Itu bermaksud bahawa setiap kali nama digunakan, Python menghadapi masalah untuk mencari objek apa yang ditunjuk. Dinamisme ini adalah salah satu sebab utama Python berjalan lebih perlahan daripada beberapa bahasa lain. Dinamisme Python menawarkan fleksibiliti dan kemudahan yang luar biasa, tetapi ia memerlukan kos prestasi masa operasi.

Salah satu kelebihan mempunyai pernyataan berterusan yang benar di Python adalah pengurangan frekuensi pencarian objek yang berlaku semasa runtime, dan prestasi yang lebih baik. Sekiranya masa berjalan mengetahui lebih awal bahawa nilai yang diberikan tidak akan pernah berubah, ia tidak perlu mencari ikatannya. Ini juga dapat memberi jalan untuk pengoptimuman pihak ketiga lebih lanjut, seperti sistem yang menghasilkan kod asli mesin dari aplikasi Python (Cython, Nuitka).

Walau bagaimanapun, pemalar sejati akan menjadi perubahan besar, dan kemungkinan besar adalah perubahan yang tidak serasi ke belakang. Juga perlu diperdebatkan jika pemalar akan datang dengan sintaks baru - misalnya, $ simbol yang belum digunakan  - atau sebagai lanjutan dari cara Python yang ada untuk menyatakan nama. Akhirnya, ada persoalan falsafah yang lebih besar mengenai apakah pemalar sejati masuk akal dalam bahasa di mana dinamisme telah menjadi sebahagian besar daya tarik.

Ringkasnya, ada kemungkinan kita akan melihat pemalar sebenar di Python, tetapi ini akan menjadi perubahan besar.

Beban dan generik yang betul

Dalam banyak bahasa, pelbagai versi fungsi yang sama dapat ditulis untuk berfungsi dengan pelbagai jenis input. Sebagai contoh,  to_string() fungsi dapat memiliki implementasi yang berbeda untuk menukar dari bilangan bulat, bilangan titik terapung, atau objek lain - tetapi mereka akan berkongsi nama yang sama demi kemudahan. "Beban berlebihan", atau "generik", lebih mudah untuk menulis perisian yang kuat, kerana anda dapat menulis kaedah generik untuk proses biasa daripada menggunakan kaedah khusus untuk jenis tertentu.

Python membolehkan anda menggunakan satu nama fungsi untuk melakukan banyak kerja, tetapi tidak dengan menentukan beberapa contoh fungsi. Anda dapat menentukan nama hanya sekali dalam ruang lingkup tertentu dan mengikatnya hanya pada satu objek pada satu waktu, jadi anda tidak dapat memiliki beberapa versi dari satu fungsi dengan nama yang sama.

Apa yang biasanya dilakukan oleh pembangun Python untuk mengatasi masalah ini adalah menggunakan built-in seperti  isinstance() atau  type() untuk menentukan jenis pemboleh ubah yang diserahkan kepada fungsi, kemudian mengambil tindakan berdasarkan jenisnya. Kadang-kadang ini melibatkan penghantaran ke versi khas dari fungsi di bawah tudung. Tetapi pendekatan ini menyukarkan pembangun lain untuk memperluas fungsi anda kecuali anda berusaha keras untuk membuatnya dapat diperluas - misalnya, dengan mengirimkan kaedah dalam kelas, yang mungkin dapat dikelaskan dalam kelas.

PEP 3124, maju pada bulan April 2007, mengusulkan mekanisme untuk menghias fungsi untuk menunjukkan mereka mungkin berlebihan. Usul itu ditangguhkan dan bukannya ditolak secara langsung - yang bermaksud idea itu pada dasarnya kukuh, tetapi waktunya tidak tepat untuk melaksanakannya. Salah satu faktor yang dapat mempercepat penerapan overloading di Python - atau menyebabkan gagasan dibuang sepenuhnya - adalah pelaksanaan sistem pencocokan pola yang baru diusulkan.

Secara teori, pencocokan corak dapat digunakan di bawah penutup untuk menangani pengiriman berlebihan. Walau bagaimanapun, pemadanan corak juga dapat diberikan sebagai alasan untuk tidak menerapkan generik di Python, kerana sudah menyediakan cara yang elegan untuk mengirim operasi berdasarkan jenis tanda tangan.

Oleh itu, kita mungkin benar-benar berlebihan di Python suatu hari, atau kelebihannya mungkin digantikan oleh mekanisme lain.

Pengoptimuman rekursi ekor

Banyak penyusun bahasa menggunakan pengoptimuman pengulangan ekor, di mana fungsi yang menyebut diri mereka tidak membuat bingkai tumpukan baru dalam aplikasi, dan dengan itu berisiko meletupkan timbunan jika mereka berjalan terlalu lama. Python tidak melakukan ini, dan sebenarnya penciptanya secara konsisten menentangnya.

Salah satu sebabnya ialah sebahagian besar Python, dari dalam ke luar, menggunakan  lelaran  daripada  berulang  - penjana, coroutine, dan sebagainya. Dalam kes ini, ini bermaksud menggunakan fungsi dengan gelung dan struktur timbunan dan bukannya mekanisme rekursif. Setiap panggilan gelung dapat disimpan ke dalam tumpukan untuk membuat rekursi baru, dan muncul dari tumpukan ketika rekursi selesai.

Pembangun Python digalakkan untuk menggunakan corak ini dan bukannya berulang, jadi nampaknya sedikit harapan untuk pengoptimuman rekursi. Kemungkinan di sini tidak mungkin sama sekali, kerana simpulan bahasa Python menyokong penyelesaian lain.

Lambdas pelbagai lapisan

Lambdas, atau fungsi tanpa nama, menjadikannya Python hanya setelah mendapat tentangan dari pihak pencipta bahasa Guido van Rossum. Oleh kerana Python lambdas wujud sekarang, mereka sangat terkehadapan: Mereka hanya membenarkan anda menggunakan satu ungkapan (pada dasarnya, apa sahaja di sebelah kanan tanda yang sama dalam operasi penugasan) sebagai badan fungsi. Sekiranya anda mahukan sekumpulan pernyataan yang lengkap, pecahkan sahaja dan buat fungsi sebenar dari mereka.

Sebabnya timbul pada reka bentuk bahasa kerana van Rossum melihatnya. Van Rossum menulis pada tahun 2006, "Saya mencari  mana-mana  penyelesaian yang tidak boleh diterima yang membenamkan blok berdasarkan lekukan-di pertengahan ungkapan. Oleh kerana saya menjumpai sintaks alternatif untuk pengelompokan penyataan (contohnya tanda kurung atau kata kunci permulaan / akhir) sama sekali tidak dapat diterima, ini menjadikan lambda multiline sebagai teka-teki yang tidak dapat diselesaikan. "

Dengan kata lain, masalahnya bukan teknikal, tetapi kekurangan sintaks untuk lambda multiline yang melengkapkan estetika sintaks Python yang ada. Mungkin tidak ada cara untuk melakukannya yang tidak melibatkan pembuatan casing khas, dan bahasa yang menimbulkan kes khas cenderung menjadi tidak menyenangkan untuk digunakan. Sehingga unicorn seperti itu muncul, kita hanya perlu berhubung dengan fungsi yang ditentukan secara berasingan.

Lambdas multiline mungkin tidak berlaku di Python.

Baca lebih lanjut mengenai Python:

  • Python 3.9: Apa yang baru dan lebih baik
  • Ciri baru terbaik di Python 3.8
  • Pengurusan projek Python yang lebih baik dengan Puisi
  • Virtualenv dan venv: Persekitaran maya Python dijelaskan
  • Python virtualenv dan venv lakukan dan tidak boleh dilakukan
  • Penjelasan dan proses subtitle Python dijelaskan
  • Cara menggunakan debugger Python
  • Cara menggunakan timeit untuk profil kod Python
  • Cara menggunakan cProfile untuk profil kod Python
  • Mulakan dengan async di Python
  • Cara menggunakan asyncio di Python
  • Cara menukar Python ke JavaScript (dan kembali lagi)
  • Python 2 EOL: Cara bertahan pada akhir Python 2
  • 12 Pythons untuk setiap keperluan pengaturcaraan
  • 24 perpustakaan Python untuk setiap pembangun Python
  • 7 IDE Python manis yang mungkin anda terlepas
  • 3 kekurangan utama Python - dan penyelesaiannya
  • 13 Kerangka web Python dibandingkan
  • 4 Kerangka ujian Python untuk menghancurkan pepijat anda
  • 6 ciri Python baru yang hebat yang anda tidak mahu ketinggalan
  • 5 Pembahagian Python untuk menguasai pembelajaran mesin
  • 8 perpustakaan Python yang hebat untuk pemprosesan bahasa semula jadi
  • 6 Perpustakaan Python untuk pemprosesan selari
  • Apa itu PyPy? Python lebih cepat tanpa rasa sakit
  • Apa itu Cython? Python pada kelajuan C