Rilis stabil Python 3.9.0

Versi stabil Python 3.9.0 diharapkan akan dirilis hari ini , 10/05/2020. Versi baru akan menerima pembaruan patch kira-kira setiap 2 bulan selama kurang lebih 18 bulan. Beberapa waktu setelah rilis versi final 3.10.0, pembaruan kesembilan dan terakhir akan dirilis dengan perbaikan bug 3.9.



“Ini adalah versi pertama Python yang menggunakan penginstal 64-bit di Windows. Penginstal sekarang juga secara aktif melarang penginstalan di Windows 7. "

“Ini adalah versi Python pertama yang menggunakan penginstal 64-bit di Windows secara default. Penginstal sekarang juga mencegah penginstalan di Windows 7. "



Saya telah membaca catatan rilis Python 3.9 dan diskusi terkait. Berdasarkan informasi tersebut, saya ingin menulis panduan komprehensif sehingga semua orang bisa mendapatkan gambaran tentang fungsi-fungsi beserta detail pekerjaannya.



UPD :

Transisi ke siklus rilis tahunan yang stabil, lihat PEP 602

alec_kalinin.dll

“Setiap versi baru Python sekarang akan keluar pada bulan Oktober. Python 3.10 akan dirilis pada Oktober 2021, Python 3.11 pada Oktober 2022. Buckfix akan dirilis setiap dua bulan. Ini adalah kabar baik bagi saya, sekarang kami dapat dengan jelas merencanakan untuk meningkatkan lingkungan python. "



PEP 584



PEP ini menyarankan untuk menambahkan operator merge ( | ) dan update ( | = ) ke kelas dict bawaan.



Untuk menggabungkan: |



>>> a = {'milk': 'prostokvashino', 'heese': 'cheddar'} 
>>> b = {'milk': 1, 'heese': 2, 'bread': 3} 
>> >  | b 
{'milk': 1, 'heese': 2, 'bread': 3}
>>> b | a 
{'milk': 'prostokvashino', 'heese': 'cheddar', 'bread': 3}


Untuk memperbarui: | =



>>> a | = b 
>>> a 
{'milk': 1, 'heese': 2, 'bread': 3}


Aturan utama yang harus diingat adalah jika ada konflik kunci, nilai paling kanan akan dipertahankan.



Tentu saja, banyak pythonists akan memiliki pertanyaan, mengapa ini perlu, jika sudah ada opsi yang akrab bagi semua orang



{**d1, **d2}


Pertanyaan ini dijawab di PEP itu sendiri:



Kamus yang membongkar terlihat jelek dan tidak mudah dideteksi. Beberapa orang akan dapat menebak apa artinya ini ketika mereka pertama kali melihatnya.


Seperti yang dikatakan Guido :

Saya minta maaf tentang PEP 448 , tetapi bahkan jika Anda tahu tentang ** d dalam konteks yang lebih sederhana, jika Anda bertanya kepada pengguna Python biasa bagaimana menggabungkan dua dikt ke yang baru, saya ragu banyak orang akan memikirkan {** d1, ** d2}. Saya tahu saya sendiri lupa tentangnya ketika utas ini dimulai!


Selain itu, {** d1, ** d2} tidak berfungsi untuk subkelas dict seperti defaultdict




PEP 585



Petunjuk jenis generik dalam koleksi standar.



Generik adalah tipe yang dapat diparameterisasi, semacam wadah. Juga dikenal sebagai tipe parametrik atau tipe generik.



Rilis ini menyertakan dukungan untuk sintaks universal di semua koleksi standar yang saat ini tersedia di modul Pengetikan. Kita bisa menggunakan tipe list atau dict sebagai tipe generik daripada menggunakan tipe Typing.List atau Typing.Dict .



Dulu:



from typing import List

a: List[str] = list()

def read_files(files: List[str]) -> None:
    pass


Menjadi:



a: list[str] = list()

def read_files(files: list[str]) -> None:
    pass


Daftar lengkap jenis
tuple

list

dict

set

frozenset

type

collections.deque

collections.defaultdict

collections.OrderedDict

collections.Counter

collections.ChainMap

collections.abc.Awaitable

collections.abc.Coroutine

collections.abc.AsyncIterable

collections.abc.AsyncIterator

collections.abc.AsyncGenerator

collections.abc.Iterable

collections.abc.Iterator

collections.abc.Generator

collections.abc.Reversible

collections.abc.Container

collections.abc.Collection

collections.abc.Callable

collections.abc.Set # typing.AbstractSet

collections.abc.MutableSet

collections.abc.Mapping

collections.abc.MutableMapping

collections.abc.Sequence

collections.abc.MutableSequence

collections.abc.ByteString

collections.abc.MappingView

collections.abc.KeysView

collections.abc.ItemsView

collections.abc.ValuesView

contextlib.AbstractContextManager # typing.ContextManager

contextlib.AbstractAsyncContextManager # typing.AsyncContextManager

re.Pattern # typing.Pattern, typing.re.Pattern

re.Match # typing.Match, typing.re.Match



PEP 615



Dukungan database zona waktu IANA di pustaka standar.



Zona waktu IANA sering disebut sebagai tz atau info zona. Ada sejumlah besar zona waktu IANA dengan jalur pencarian berbeda untuk menentukan zona waktu IANA untuk objek tanggal dan waktu. Misalnya, kita bisa meneruskan nama jalur pencarian sebagai Benua / Kota ke objek datetime untuk menyetel tzinfo-nya.



dt: datetime = datetime(2000, 01, 25, 01, tzinfo=ZoneInfo("Europe/London"))


Jika kita memasukkan kunci yang salah, pengecualian akan dilempar

zoneinfo.ZoneInfoNotFoundError

PEP 616



Fungsi string baru untuk menghilangkan prefiks dan sufiks. Dua fungsi baru telah ditambahkan



ke objek str .



  • Fungsi pertama menghilangkan awalan.
    str.removeprefix(prefix)
  • Fungsi kedua menghilangkan sufiks.
    str.removesuffix(suffix)


>>> 'hello_world'.removeprefix ('hello_') 
world
>>> 'hello_world'.removesuffix ('_world') 
hello


PEP 617



Python 3.9 mengusulkan untuk mengganti parser Python berbasis LL (1) saat ini dengan parser berbasis PEG baru yang berkinerja tinggi dan stabil.



Pengurai CPython saat ini berbasis LL (1). Selanjutnya, tata bahasa didasarkan pada LL (1), yang memungkinkannya diurai dengan pengurai LL (1). Pengurai LL (1) bekerja dari atas ke bawah. Selain itu, ini mengurai data input dari kiri ke kanan. Tata bahasa saat ini adalah tata bahasa bebas konteks, jadi konteks token tidak diperhitungkan.

Python 3.9 mengusulkan untuk menggantinya dengan parser berbasis PEG baru, yang berarti itu akan menghilangkan batasan tata bahasa LL Python saat ini (1). Selain itu, perbaikan telah dilakukan pada parser saat ini, menambahkan sejumlah peretasan yang akan dihapus. Alhasil, hal ini akan mengurangi biaya pemeliharaan dalam jangka panjang.



Misalnya, sementara parser dan tata bahasa LL (1) mudah diimplementasikan, kendala mencegahnya mengekspresikan konstruksi umum dengan cara yang alami untuk perancang dan pembaca bahasa. Pengurai hanya melihat satu token ke depan untuk membedakan berbagai kemungkinan.



masalah30966



Kemampuan untuk membatalkan masa depan simultan .



Parameter baru cancel_futures telah ditambahkan ke concurrent.futures.Executor.shutdown () .



Parameter ini berisi semua kontrak berjangka yang belum dimulai. Sebelum versi 3.9, proses menunggu hingga mereka selesai sebelum keluar dari eksekutor.



Parameter baru cancel_futures telah ditambahkan ke ThreadPoolExecutor dan ProcessPoolExecutor . Ini berfungsi ketika nilai parameter adalah True, maka semua kontrak berjangka yang tertunda akan dibatalkan ketika fungsi shutdown () dipanggil .



Saat shutdown ()dijalankan, penerjemah memeriksa untuk melihat apakah pelaksana telah dikumpulkan sampah. Jika masih dalam memori, ia mendapatkan semua item yang tertunda dan kemudian membatalkan kontrak berjangka.



masalah30966



Sejumlah peningkatan telah dilakukan pada library asyncio dan multiprosesing dalam rilis ini.



Misalnya,



  1. The reuse_address parameter asyncio.loop.create_datagram_endpoint () adalah tidak lagi didukung karena masalah keamanan yang signifikan.
  2. Menambahkan coroutine baru , coroutine shutdown_default_executor (), dan asyncio.to_thread () . Panggilan baru ke asyncio.to_thread () digunakan untuk menjalankan fungsi terkait I / O pada thread terpisah untuk menghindari pemblokiran event loop.


Adapun peningkatan pustaka multiprocessing, metode close () baru telah ditambahkan ke kelas multiprocessing.SimpleQueue . Metode ini secara eksplisit menutup antrian. Ini memastikan bahwa antrian ditutup dan tidak lebih lama dari yang diharapkan. Penting untuk diingat bahwa metode get (), put (), empty () tidak bisa dipanggil setelah antrian ditutup.







masalah37444



Memperbaiki bug dengan mengimpor paket.



Masalah utama dengan mengimpor pustaka Python sebelum rilis 3.9 adalah perilaku impor yang tidak konsisten di Python ketika impor relatif diteruskan oleh paket tingkat atas.



builtins .__ import __ () memunculkan ValueError sementara importlib .__ import __ () memunculkan ImportError.



Sekarang sudah diperbaiki . __Import __ () sekarang memunculkan ImportError alih-alih ValueError.



masalah40286



Generasi byte acak.



Fitur lain yang ditambahkan di versi 3.9 adalah random.Random.randbytes () . Ini dapat digunakan untuk menghasilkan byte acak.



Kita dapat menghasilkan angka acak, tetapi bagaimana jika kita perlu menghasilkan byte acak? Sebelum versi 3.9, pengembang harus kreatif untuk menghasilkan byte acak. Meskipun kita bisa menggunakan os.getrandom () , os.urandom (), atau secret.token_bytes (), kita tidak bisa menghasilkan pola pseudo-random.



Misalnya, untuk memastikan bahwa nomor acak dihasilkan dengan perilaku yang diharapkan dan proses mereproduksi, kami biasanya menggunakan seed dengan modul random.Random.



Hasilnya, metode random.Random.randbytes () diperkenalkan . Ini menghasilkan byte acak.



masalah28029



Koreksi fungsi penggantian string.



Prinsip dari fungsi replace adalah untuk argumen maksimum yang diberikan untuk menggantikan sebuah kejadian, itu menggantikan himpunan karakter dari string dengan himpunan karakter baru.



Untuk lebih menjelaskan masalah ini, sebelum versi 3.9 fungsi ganti memiliki perilaku yang tidak konsisten:



Orang akan berharap untuk melihat blog



"" .replace ("", "blog", 1) 
>>> '' 




Orang akan berharap untuk melihat |



"" .replace ("", "|", 1) 
>>> '' 




"" .replace ("", "prefix") 
>>> 'prefix'




issue39648, issue39479, issue39288, issue39310



Perubahan dalam modul "matematika".



Mengembalikan kelipatan persekutuan terkecil dari argumen bilangan bulat:



>>> import  math 
>>> math.lcm(48,72,108) 
432




Mengembalikan pembagi persekutuan terbesar dari argumen bilangan bulat. Di versi sebelumnya, hanya dua argumen yang didukung. Menambahkan dukungan untuk sejumlah argumen yang berubah-ubah:



>>> import  math 
>>> math.gcd(9,12,21) 
3




Menghitung bilangan floating-point yang paling dekat dengan " x " ke arah " y ".



>>> math.nextafter(2, -1)
1.9999999999999998




Metode ini mengembalikan nilai bit paling signifikan dari bilangan titik mengambang x.



>>> 1 - math.ulp(1)
0.9999999999999998
>>> math.nextafter(1, -1) + math.ulp(1)
1.0




masalah38870



Metode unparse telah ditambahkan ke modul ast.

Metode baru dapat digunakan untuk membuat baris kode dan kemudian menjalankannya.



>>> import ast
>>> parsed = ast.parse('from sys import platform; print(platform)')
>>> unparsed_str = ast.unparse(parsed)
>>> print(unparsed_str)
from sys import platform
print(platform)
>>> exec(unparsed_str)
win32




issue39507, issue39509



Menambahkan kode baru ke http.HTTPStatus.



" Simpan 418! "

418 IM_A_TEAPOT
103 EARLY_HINTS
425 TOO_EARLY




UPD :

PEP 614



Batasan tata bahasa yang menenangkan untuk dekorator.



Dulu:



buttons = [QPushButton(f'Button {i}') for i in range(10)]

button_0 = buttons[0]

@button_0.clicked.connect
def spam():
    ...

button_1 = buttons[1]

@button_1.clicked.connect
def eggs():
    ...


Sekarang Anda dapat menghapus tugas yang tidak perlu dan menelepon secara langsung:



buttons = [QPushButton(f'Button {i}') for i in range(10)]

@buttons[0].clicked.connect
def spam():
    ...

@buttons[1].clicked.connect
def eggs():
    ...




"Tuple harus diapit tanda kurung."



Ini didasarkan pada visi Guido dalam huruf yang sama. Kutipan:



Tapi saya tidak akan mengizinkan koma. Saya tidak setuju dengan ini



@f, g
def pooh(): ...


Hal ini dapat mengarahkan programmer yang tidak berpengalaman pada kesimpulan bahwa beberapa dekorator dapat dipanggil secara berurutan dengan cara ini. Tanda kurung diperlukan untuk mengklarifikasi semuanya tanpa batasan tambahan atau sintaks yang rumit.




masalah17005



Modul graphlib baru menyediakan fungsionalitas untuk pengurutan topologis dari grafik node yang di-hash.

Detail lebih lanjut dapat ditemukan di dokumentasi .



UPD :ifinik

gambar



>>> from graphlib import TopologicalSorter 
>>> graph = {'E': {'C', 'F'}, 'D': {'B', 'C'}, 'B': {'A'}, 'A': {'F'}} 
>>> ts = TopologicalSorter(graph) 
>>> tuple(ts.static_order()) 
('C', 'F', 'E', 'A', 'B', 'D')
>>> tuple(ts.static_order())
('F', 'C', 'A', 'E', 'B', 'D')


Grafik tidak dapat langsung ditransfer, tetapi isi TopologicalSorter menggunakan metode tambah . Selain itu, kelas tersebut disesuaikan dengan komputasi paralel dan dapat digunakan, misalnya, untuk membuat antrean tugas.



issue37630, issue40479



Memperbarui hashlib.

Hashlib sekarang dapat menggunakan hash SHA3 dan SHAKE XOF dari OpenSSL.

Modul hash bawaan sekarang dapat dinonaktifkan atau diaktifkan secara selektif, misalnya untuk menerapkan implementasi berbasis OpenSSL.



Optimasi



Ringkasan peningkatan kinerja dari Python 3.4 ke Python 3.9:



Python version                       3.4     3.5     3.6     3.7     3.8    3.9
--------------                       ---     ---     ---     ---     ---    ---

Variable and attribute read access:
    read_local                       7.1     7.1     5.4     5.1     3.9    4.0
    read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.8
    read_global                     15.5    19.0    14.3    13.6     7.6    7.7
    read_builtin                    21.1    21.6    18.5    19.0     7.5    7.7
    read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   18.6
    read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   20.1
    read_instancevar                32.4    33.1    28.0    26.3    25.4   27.7
    read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   24.5
    read_namedtuple                 73.8    57.5    45.0    46.8    18.4   23.2
    read_boundmethod                37.6    37.9    29.6    26.9    27.7   45.9

Variable and attribute write access:
    write_local                      8.7     9.3     5.5     5.3     4.3    4.2
    write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.9
    write_global                    19.7    21.2    18.0    18.0    15.8   17.2
    write_classvar                  92.9    96.0   104.6   102.1    39.2   43.2
    write_instancevar               44.6    45.8    40.0    38.9    35.5   40.7
    write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   27.7

Data structure read access:
    read_list                       24.2    24.5    20.8    20.8    19.0   21.1
    read_deque                      24.7    25.5    20.2    20.6    19.8   21.6
    read_dict                       24.3    25.7    22.3    23.0    21.0   22.5
    read_strdict                    22.6    24.3    19.5    21.2    18.9   21.6

Data structure write access:
    write_list                      27.1    28.5    22.5    21.6    20.0   21.6
    write_deque                     28.7    30.1    22.7    21.8    23.5   23.2
    write_dict                      31.4    33.3    29.3    29.2    24.7   27.8
    write_strdict                   28.4    29.9    27.5    25.2    23.1   29.8

Stack (or queue) operations:
    list_append_pop                 93.4   112.7    75.4    74.2    50.8   53.9
    deque_append_pop                43.5    57.0    49.4    49.2    42.5   45.5
    deque_append_popleft            43.7    57.3    49.7    49.7    42.8   45.5

Timing loop:
    loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3


Skrip pengujian menampilkan waktu dalam nanodetik. Pengujian dilakukan pada prosesor Intel Core i7-4960HQ . Kode tes dapat ditemukan dalam repositori di " Tools / scripts / var_access_benchmark.py " .



Terima kasih atas perhatian Anda.



Link ke pejabat Python 3,9 panduan .

Berhenti berlangganan di komentar jika Anda melewatkan sesuatu.



All Articles