Bulldogjob
Bulldogjob

Python 3.12 - kolejne dobre wydanie!

Poznaj nowości składniowe i usprawnienia Pythona 3.12. Premiera nowej wersji przynosi dużo dobrego dla Python Developerów.
2.10.20233 min
Python 3.12 - kolejne dobre wydanie!

Właśnie dostaliśmy naszą coroczną dawkę usprawnień Pythona. Wersja 3.12 ma dziś premierę. W tym artykule przyjrzymy się najważniejszym nowościom w Pythonie 3.12, odkrywając, jakie zmiany czekają na programistów tego języka. Jest kilka ciekawych nowości, które pokazują, w którą stronę idzie rozwój języka.

Nowości składniowe w Pythonie 3.12

Sporego uproszczenia doczekała się składnia do deklarowania klas, funkcji i typów generycznych. Do tej pory deklarowanie klasy generycznej wyglądało tak:

from typing import Generic, TypeVar

_T_co = TypeVar("_T_co", covariant=True, bound=str)

class ClassA(Generic[_T_co]):
    def method1(self) -> _T_co:


Natomiast teraz:

class ClassA[T: str]:
    def method1(self) -> T:


Wygląda to o wiele lepiej i w końcu nie wygląda jak coś pospiesznie doklejonego do języka, a jak integralna jego część. Podobnie wyglądają uproszczenia dla funkcji i typów.

F-strings doczekały się poprawek i teraz mają większe możliwości. Do tej pory f-strings narzucały pewne ograniczenia na to, co mogło się znaleźć wewnątrz wyrażeń, użytych w takim ciągu. Teraz już nie ma takich ograniczeń i można wstawiać tam cokolwiek, co jest prawidłowym kodem w języku Python. Nawet inne f-strings:

f"""{f'''{f'{f"{1+1}"}'}'''}"""


W Pythonie 3.12 poprawiono obsługę typów dla **kwargs. Teraz takie argumenty można opisać używając właśnie TypedDict i “rozpakować” je używając Unpack, przez co mamy kontrolę nad typami poszczególnych argumentów. Przykład:

class Movie(TypedDict):
    name: str
    year: int

def foo(**kwargs: Movie) -> None:


Nowe wydanie to też nowy dekorator @override, który pozwala na ozaczenie, że dana metoda powinna nadpisywać metodę w klasie, z której dziedziczy. Jeżeli tak się nie dzieje, to dzięki użyciu tego dekoratora dostaniemy błąd.

Szybki Python

Python 3.12 to kilka usprawnień poprawiających wydajność, która, jak wiemy, jest pewnym wyzwaniem dla Pythona.

Pierwsze z tych usprawnień sprawia, że wyrażenia listowe czy słownikowe (dictionary, list, set comprehension) będą teraz wbudowane inline. Nie będą jak do tej pory tworzyć nowej, jednorazowej funkcji dla każdego wykonania. To przyspiesza je mniej więcej dwukrotnie.

W nowym Pythonie można też stworzyć nieśmiertelny obiekt - czyli taki, w którym nie zmienia się licznik referencji.

Python 3.12 wprowadza też możliwość posiadania osobnego GIL dla każdego podinterpretera, co umożliwia wykorzystanie wszystkich rdzeni współczesnych procesorów. Niestety nowe API jest dostępne tylko z poziomu C. API dla Pythona powinno być gotowe w przyszłym roku w wersji 3.13.

asyncio doczekał się wielu usprawnień nakierowanych na wydajność. Niektóre benchmarki pokazują nawet 75%-owe przyspieszenie wykonania.

Jest jeszcze jedna nowość, która pomoże, ale…  w szybszym kodowaniu. Chodzi o opisy błędów. Tu twórcy Pythona kontynuują dobrą robotę wykonaną w poprzednich wersjach i dodali kilka nowych wskazówek w stylu: “NameError: name 'sys' is not defined. Did you forget to import 'sys'?

Podsumowanie wydania 3.12

Oto najważniejsze nowości w nowej wersji. Jeżeli chcesz wiedzieć więcej, to zawsze warto przeczytać bardziej szczegółowe podsumowanie w oficjalnej dokumentacji Pythona.

Python w tym wydaniu został nieco uproszczony i uspójniony, szczególnie jeżeli chodzi o obsługę typów. Widać, że zespół Pythona dąży do tego, żeby jak najłatwiej było ich używać. Bardzo dużo pracy zostało też wykonane na polu wydajności. Na ten moment nie są to zmiany, które nagle uczynią z Pythona demona szybkości, ale zapowiadają kierunek, w którym zdąża język.

Prędkość wykonania i sposób, w jaki Python adresuje współbieżność, stanowią problem w wielu współczesnych zastosowaniach Pythona. Chodzi tu przede wszystkim o GIL, który stanowi spore ograniczenie nawet, jeżeli większość faktycznej pracy jest wykonywana w C (przynajmniej według ludzi od AI). Usprawnienia dokonane w Pythonie 3.12 to dopiero przedsmak tego, co przyniesie na tym polu przyszłoroczna wersja 3.13. Czekamy!

<p>Loading...</p>