Python 3.10

Python 3.10.0 (wersja finalna) został wydany 4 października 2021 roku. Funkcje wprowadzone w wersji 3.10 są opisane w PEP 619, a szczegółowy opis zmian można znaleźć w What’s New in Python 3.10.

Nowe funkcje składniowe

Status

PEP 634

Strukturalne dopasowywanie wzorców: specyfikacja

[1]

PEP 635

Strukturalne dopasowywanie wzorców: motywacja i uzasadnienie

[1]

PEP 636

Strukturalne dopasowywanie wzorców: samouczek

[1]

bpo-12782

Menedżery kontekstu w nawiasach są teraz oficjalnie dozwolone

Nowe funkcje w bibliotece standardowej

PEP 618

Dodanie opcjonalnego sprawdzania długości do zip

Ulepszenia interpretera

PEP 626

Precyzyjne numery wierszy dla narzędzi do debugowania i innych narzędzi

Nowe funkcje typowania

PEP 604

Możliwość zapisywania typów unii jako X | Y

PEP 613

Jawne aliasy typów

PEP 612

Zmienne specyfikacji parametrów

Ważne wycofania, usunięcia lub ograniczenia

PEP 644

Wymaganie OpenSSL 1.1.1 lub nowszego

PEP 632

Wycofanie modułu distutils.

Nie dotyczy

PEP 623

Wycofanie i przygotowanie do usunięcia składowej wstr w PyUnicodeObject.

Nie dotyczy

PEP 624

Usunięcie interfejsów API koderów Py_UNICODE

Nie dotyczy

PEP 597

Dodanie opcjonalnego ostrzeżenia EncodingWarning

Inne zmiany w języku:

Typ int ma nową metodę int.bit_count(), która zwraca liczbę jedynek w binarnym rozwinięciu danej liczby całkowitej, znaną również jako liczba ustawionych bitów.

Widoki zwracane przez dict.keys(), dict.values() i dict.items() mają teraz atrybut mapping, który udostępnia obiekt types.MappingProxyType opakowujący oryginalny słownik.

PEP 618: Funkcja zip() ma teraz opcjonalną flagę strict, używaną do wymuszenia, aby wszystkie iterowalne obiekty miały jednakową długość.

Wbudowane i rozszerzające funkcje przyjmujące argumenty całkowite nie akceptują już obiektów Decimal, Fraction ani innych obiektów, które można przekonwertować na liczby całkowite tylko ze stratą (np. takich, które mają metodę __int__(), ale nie mają metody __index__()).

Jeśli object.__ipow__() zwraca NotImplemented, operator poprawnie powróci do object.__pow__() i object.__rpow__() zgodnie z oczekiwaniami.

Wyrażenia przypisania mogą być teraz używane bez nawiasów wewnątrz literałów zbiorów i wyrażeń składanych zbiorów, a także w indeksach sekwencji (ale nie w wycinkach).

Funkcje mają nowy atrybut __builtins__, który jest używany do wyszukiwania wbudowanych symboli podczas wykonywania funkcji, zamiast przeszukiwania __globals__['__builtins__']. Atrybut jest inicjalizowany z __globals__["__builtins__"], jeśli istnieje, w przeciwnym razie z bieżących wbudowanych symboli.

Dodano dwie nowe funkcje wbudowane – aiter() i anext() – które stanowią asynchroniczne odpowiedniki odpowiednio iter() i next().

Metody statyczne (@staticmethod) i metody klas (@classmethod) dziedziczą teraz atrybuty metody (__module__, __name__, __qualname__, __doc__, __annotations__) i mają nowy atrybut __wrapped__. Co więcej, metody statyczne można teraz wywoływać jak zwykłe funkcje.

Adnotacje dla celów złożonych (wszystkiego poza celami simple name zdefiniowanymi przez PEP 526) nie wywołują już żadnych efektów w czasie wykonania przy użyciu from __future__ import annotations.

Obiekty klas i modułów leniwie tworzą teraz puste słowniki adnotacji na żądanie. Słowniki adnotacji są przechowywane w __dict__ obiektu w celu zachowania zgodności wstecznej. Poprawia to najlepsze praktyki pracy z __annotations__.

Adnotacje składające się z yield, yield from, await lub nazwanych wyrażeń są teraz zabronione przy użyciu from __future__ import annotations ze względu na ich efekty uboczne.

Użycie niezwiązanych zmiennych, super() i innych wyrażeń, które mogłyby zmienić przetwarzanie tablicy symboli, jest teraz pozbawione efektu, gdy adnotacje są używane z from __future__ import annotations.

Wartości skrótu wartości NaN zarówno typu float, jak i typu decimal.Decimal zależą teraz od tożsamości obiektu. Wcześniej zawsze przyjmowały skrót 0, mimo że wartości NaN nie są sobie równe. Powodowało to potencjalnie kwadratowy czas wykonania z powodu nadmiernych kolizji skrótów podczas tworzenia słowników i zbiorów zawierających wiele wartości NaN.

Wyjątek SyntaxError (zamiast NameError) zostanie zgłoszony przy usuwaniu stałej __debug__.

Wyjątki SyntaxError mają teraz atrybuty end_lineno i end_offset. Będą one miały wartość None, jeśli nie zostaną ustalone.

Zmiany w modułach wbudowanych:

asyncio

Dodano brakującą metodę connect_accepted_socket().

array

Metoda index() klasy array.array ma teraz opcjonalne parametry start i stop.

gc

Dodano punkty zaczepienia audytu dla gc.get_objects(), gc.get_referrers() i gc.get_referents().

hashlib

Moduł hashlib wymaga OpenSSL 1.1.1 lub nowszego.

Moduł hashlib ma wstępne wsparcie dla OpenSSL 3.0.0.

Czysto Pythonowa implementacja zastępcza pbkdf2_hmac() jest wycofywana. W przyszłości PBKDF2-HMAC będzie dostępne tylko wtedy, gdy Python zostanie zbudowany ze wsparciem OpenSSL.

os

Dodano wsparcie os.cpu_count() dla systemu VxWorks RTOS.

Dodano nową funkcję os.eventfd() oraz powiązane pomocnicze funkcje opakowujące wywołanie systemowe eventfd2 w systemie Linux.

Dodano os.splice(), która umożliwia przenoszenie danych między dwoma deskryptorami plików bez kopiowania między przestrzenią adresową jądra a przestrzenią adresową użytkownika, gdzie jeden z deskryptorów plików musi odnosić się do potoku.

Dodano O_EVTONLY, O_FSYNC, O_SYMLINK i O_NOFOLLOW_ANY dla systemu macOS.

platform

Dodano platform.freedesktop_os_release(), która pobiera informacje identyfikacyjne systemu operacyjnego ze standardowego pliku freedesktop.org os-release.

socket

Wyjątek socket.timeout jest teraz aliasem TimeoutError.

Dodano opcję tworzenia gniazd MPTCP za pomocą IPPROTO_MPTCP.

Dodano opcję IP_RECVTOS do odbierania pól typu usługi (ToS) lub DSCP/ECN.

ssl

Moduł ssl wymaga OpenSSL 1.1.1 lub nowszego.

Moduł ssl ma wstępne wsparcie dla OpenSSL 3.0.0 oraz nową opcję OP_IGNORE_UNEXPECTED_EOF.

Wycofane funkcje oraz użycie wycofanych stałych skutkują teraz wyjątkiem DeprecationWarning. ssl.SSLContext.options ma domyślnie ustawione OP_NO_SSLv2 i OP_NO_SSLv3, dlatego nie może ostrzegać o ponownym ustawieniu tej flagi.

Moduł ssl ma teraz bezpieczniejsze ustawienia domyślne. Szyfry bez utajnienia z wyprzedzeniem lub z MAC opartym na SHA-1 są domyślnie wyłączone. Poziom bezpieczeństwa 2 zabrania słabych kluczy RSA, DH i ECC o mniej niż 112 bitach bezpieczeństwa. SSLContext domyślnie używa minimalnej wersji protokołu TLS 1.2. Ustawienia opierają się na badaniach Hynka Schlawacka.

Wycofane protokoły SSL 3.0, TLS 1.0 i TLS 1.1 nie są już oficjalnie obsługiwane. Python nie blokuje ich aktywnie. Jednak opcje kompilacji OpenSSL, konfiguracje dystrybucji, łatki dostawców oraz zestawy szyfrów mogą uniemożliwić pomyślne nawiązanie połączenia.

Dodano parametr timeout do funkcji ssl.get_server_certificate().

Moduł ssl używa typów alokowanych na stercie oraz wieloetapowej inicjalizacji.

Dodano nową flagę weryfikacji VERIFY_X509_PARTIAL_CHAIN.

sys

Dodano atrybut sys.orig_argv: listę oryginalnych argumentów wiersza poleceń przekazanych do pliku wykonywalnego Pythona.

Dodano sys.stdlib_module_names, zawierający listę nazw modułów biblioteki standardowej.

_thread

_thread.interrupt_main() przyjmuje teraz opcjonalny numer sygnału do zasymulowania (domyślnie nadal jest to signal.SIGINT).

Uwagi