“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
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,
- The reuse_address parameter asyncio.loop.create_datagram_endpoint () adalah tidak lagi didukung karena masalah keamanan yang signifikan.
- 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
>>> 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.