Apa yang Baru Diharapkan dalam Python 3.9

Versi baru diharapkan hanya pada bulan Oktober, tetapi Anda sudah dapat membaca apa yang menunggu kami di dalamnya dan menguji rilis awal.
Dalam artikel ini, yang paling menarik, menurut saya, berubah.

Pertama, kami diingatkan bahwa lapisan yang mendukung kompatibilitas ke belakang dengan versi 2.7 perlahan-lahan dihapus dan diminta untuk memperhatikan DeprecationWarning dan menghilangkannya. Beberapa peringatan masih akan tetap di 3,9, tetapi lebih baik untuk menyingkirkannya.

Operator
Penggabungan Kamus ( PEP-584 ) Sampai sekarang, ada beberapa cara untuk menggabungkan kamus, namun, masing-masing memiliki kekurangan atau nuansa kecil.
Beberapa cara untuk menggabungkan kamus
1. update
d1 = {'one': 1}
d2 = {'two': 2}
#     ,..
d1.update(d2)
# ...  . 
united_dict = d1.copy()
united_dict.update(d2)

2.
united_dict = {**d1, **d2}

, , , .
3. dict(d1, **d2), . , d2 .
4. collections.ChainMap
.
, , .
from collections import ChainMap
d1 = {'one': 1}
d2 = {'two': 2}
united_dict = ChainMap(d1, d2)

, , , . , - .

Sekarang Anda dapat menulis secara sederhana
united_dict = d1 | d2
# ,        ,    update():
d1 |= d2

Jadi, kemungkinan baru untuk menggabungkan kamus dengan satu operator, saya pikir, akan menarik bagi banyak orang.

Penyederhanaan anotasi untuk wadah dan jenis lain yang dapat diparameterisasi ( PEP-0585 )
Inovasi berikut ini sangat berguna bagi mereka yang menggunakan anotasi jenis.
Sekarang menyederhanakan anotasi koleksi, seperti daftar dan dict, dan umumnya jenis parameter.

Untuk tipe-tipe ini, istilah Generic diperkenalkan - ini adalah tipe yang dapat diparameterisasi, biasanya sebuah wadah. Misalnya, dikt. Dan pertanyaannya adalah bagaimana menerjemahkannya dengan benar sehingga tidak patah gigi. Saya benar-benar tidak ingin menggunakan kata "generik". Jadi di komentar saya sangat menantikan saran lainnya. Mungkin di suatu tempat dalam terjemahan ada nama yang lebih baik?
Generalized parameterized: dict [str, int].

Jadi untuk jenis seperti itu, sekarang Anda tidak perlu mengimpor anotasi yang sesuai dari pengetikan, tetapi Anda bisa menggunakan nama jenis.
contohnya
# 
from typing import List
List[str]
# 
list[int]

.

:
# 
from typing import OrderedDict
OrderedDict[str, int]
# 
from collections import OrderedDict
OrderedDict[str, int]

tuple # typing.Tuple
list # typing.List
dict # typing.Dict
set # typing.Set
frozenset # typing.FrozenSet
type # typing.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


Metode removeeprefix () dan removeesuffix () ( PEP 616 ) telah muncul untuk string
. Semuanya sederhana di sini. Jika baris dimulai dengan awalan, maka baris tanpa awalan ini akan dikembalikan. Jika awalan diulang beberapa kali, maka hanya akan dihapus satu kali. Demikian pula dengan suffix:
some_str = 'prefix of some string and here suffix'
some_str.removeprefix('prefix')
>> ' of some string and here suffix'
some_str.removesuffix('suffix')
>> 'prefix of some string and here '

Alternatif saat ini
1. , , โ€” removeprefix.
def removeprefix(self: str, prefix: str, /) -> str:
    if self.startswith(prefix):
        return self[len(prefix):]
    else:
        return self[:]

2. lstrip, rstrip:
	'foobar'.lstrip(('foo',))

, , .

Beberapa perubahan pada modul matematika
Fungsi math.gcd () untuk menemukan pembagi umum terbesar sekarang menerima daftar bilangan bulat, sehingga Anda dapat menemukan pembagi umum dengan lebih dari satu angka dengan satu fungsi.
Ada fungsi untuk menentukan kelipatan umum terkecil dari math.lcm () , yang juga menerima bilangan bulat tak terbatas.
Dua fungsi berikut ini saling berhubungan.
math.nextafter (x, y) - menghitung angka floating-point terdekat dengan x jika bergerak ke arah y.
math.ulp (x)- singkatan dari "Unit di Tempat Terakhir" dan tergantung pada keakuratan perhitungan komputer Anda. Untuk angka positif, nilai terendah dari angka tersebut akan dikembalikan, sehingga ketika ditambahkan x + ulp (x), angka floating-point terdekat akan diperoleh.
import math

math.gcd(24, 36)
>> 12
math.lcm(12, 18)
>> 36
math.nextafter(3, -1)
>> 2.9999999999999996
3 - math.ulp(3)
>> 2.9999999999999996
math.nextafter(3, -1) + math.ulp(3)
>> 3.0 

Sekarang setiap ekspresi yang valid dapat menjadi dekorator ( PEP-0614 )
Pembatasan dihapus dari dekorator, yang menurutnya hanya nama yang dapat bertindak sebagai dekorator dan sintaksnya hanya diperbolehkan pemisahan oleh titik-titik.

Saya tidak berpikir bahwa banyak orang berpikir tentang adanya pembatasan seperti itu, tetapi deskripsi semangat memberi contoh ketika sebuah inovasi membuat kode lebih koheren. Dengan analogi, kita bisa mengutip
contoh disederhanakan dan buatan:
def a(func):
	def wrapper():
		print('a')
		func()
	return wrapper
	
def b(func):
	def wrapper():
		print('b')
		func()
	return wrapper
	
decorators = [a, b]

@decorators[0] #   3.8        
def some_func():
	print('original')
	
some_func()
>> a
>> original

Metode unparse ( bpo-38870 ) telah ditambahkan ke modul ast.
Seperti namanya, ia dapat mengkompilasi string sumber menggunakan objek ast.AST. Suatu kali, saya bahkan ingin menggunakan ini dan mengejutkan bahwa tidak ada metode seperti itu.
Contoh:
import ast
parsed = ast.parse('import pprint; pprint.pprint({"one":1, "two":2})')
unparsed_str = ast.unparse(parsed)
print(unparsed_str)
>> import pprint
>> pprint.pprint({'one': 1, 'two': 2})
exec(unparsed_str)
>> {'one': 1, 'two': 2}

Functools.TopologicalSorter kelas baru untuk penyortiran topologis dari grafik asiklik terarah ( bpo-17005 )
Grafik yang dilewatkan ke penyortir harus berupa kamus di mana kunci adalah simpul dari grafik, dan nilainya adalah objek yang dapat diulang dengan pendahulunya (simpul yang busurnya mengarah ke kunci). Sebagai kunci, seperti biasa, semua jenis hash cocok.
Contoh:
:

from functools import TopologicalSorter
graph = graph = {8: [3, 7], 11: [5, 7], 2: [11], 9: [8, 11], 10: [3, 11]}
t_sorter = TopologicalSorter(graph)
t_sorted_list = list(t_sorted_list.static_order()) #  ,    ,     static_order.
>> [3, 7, 5, 8, 11, 2, 9, 10]


, TopologicalSorter add. , , .

Status baru yang telah lama kami tunggu telah
ditambahkan ke http.HTTPStatus : 103 EARLY_HINTS
418 IM_A_TEAPOT
425 TOO_EARLY

Dan beberapa perubahan lagi:
  • Tipe bawaan (rentang, tupel, set, frozenset, daftar) dipercepat ( PEP-590 )
  • "" .replace ("", s, n) sekarang mengembalikan s, bukan string kosong, untuk semua bukan nol. Ini berlaku untuk byte dan byte.
  • ipaddress sekarang mendukung parsing alamat IPv6 dengan tujuan.

Karena versi 3.9 masih dalam pengembangan, dan mungkin lebih banyak perubahan akan ditambahkan, saya berencana untuk melengkapi artikel ini sebagaimana diperlukan.

Anda dapat membaca secara lebih detail:
docs.python.org/3.9/whatsnew/3.9.html
www.python.org/downloads/release/python-390a6
Secara umum, bukan untuk mengatakan bahwa perubahan di masa depan adalah apa yang ditunggu-tunggu semua orang untuk waktu yang lama dan tanpa itu tidak mungkin untuk bertahan, meskipun ada beberapa poin bagus. Dan apa yang menurut Anda paling menarik dalam versi baru?

UPD:
tautan yang diperbarui ke rilis terbaru,
menambahkan PEP-0585 tentang jenis anotasi

All Articles