Co nowego w Pythonie 3.10
Po wielu miesiącach (projekt wystartował w maju 2020) i ciężkiej pracy community - mamy to! Oficjalna premiera Pythona 3.10 za nami. Ptaszki nam wyćwierkały, że docelowo ma otrzymywać aktualizacje zabezpieczeń (tylko w kodzie) do października 2026 r. Apetycznych kąsków jest sporo, dlatego możemy Cię zaprosić na prawdziwą ucztę — smacznego!
Przystawka, czyli rys historyczny
Python w tym roku obchodził 30. urodziny, a to wszystko dzięki twórcy Guido Van Rossum. Język ten nadal jest jednym z najpopularniejszych i był wykorzystany m.in. do rozwoju tak popularnych aplikacji jak Instagram czy Dropbox. Więcej znajdziesz w naszej laurce dla Pythona z lutego.
Danie główne, czyli co się właściwie zmieniło
Niczym koń na białym rycerzu spieszymy z podpowiedziami. co powinieneś wypróbować w Pythonie 3.10. Będzie jak przy szwedzkim stole — wybieraj i częstuj się tym, co Ci najbardziej smakuje :)
Python 3.10 wymaga co najmniej wersji 1.1.1 LTS biblioteki OpenSSL, oficjalnie kończąc wsparcie dla 1.0.2 LTS. Zalecamy też ostrożność, jeśli korzystasz z Ubuntu 18.04 LTS, Red Hat Enterprise Linux (RHEL) 7 lub CentOS 7. Tutaj doceniono wiedzę i doświadczenie programistów Pythona, co przełoży się na bezpieczeństwo języka i łatwiejsze utrzymaniu kodu. Więcej o tej zmianie dowiesz się z PEP 644. (Pssst — skoro Twoja wiedza będzie lepiej ceniona, może warto rozejrzeć się na rynku pracy ??)
Komunikaty o błędach stały się bardziej precyzyjne. Wreszcie zniknął tajemniczy EOL, a SyntaxError
wskazuje z większą dokładnością umiejscowienie błędu. Co ważniejsze, sugeruje również jego przyczynę w postaci np. zaginionego przecinka, klamry czy nawet atrybutu.
Zresztą sami zobaczcie, że zamiast:
>>> print("hello
File "<stdin>", line 1
print("hello
^
SyntaxError: EOL while scanning string literal
będzie:
>>> print("hello
SyntaxError: unterminated string literal (detected at line 1)
Pattern matching jest przydatnym do pracy dodatkiem do Pythona typu match ... case. Zamiast pisać ciągi if-elif-else w Pythonie 3.10 - możesz użyć składni podobnej do switch .. case z C++. Teraz dzięki ulepszeniom PEP 634-636, kod jest klarowniejszy i przyjemniejszy dla oka. Zobrazowaliśmy to w poniższym przykładzie:
class Point:
x: int
y: int
def location(point):
if not isinstance(point, Point):
print("Not a point")
return
if not (hasattr(point, 'x') and hasattr(point, 'y')):
print("The point is located somewhere else on the plane.")
return
if point.x == 0 and point.y == 0:
print("Origin is the point's location.")
elif point.x == 0:
print(f"Y={point.y} and the point is on the y-axis.")
elif point.y == 0:
print(f"X={point.x} and the point is on the x-axis.")
else:
print("The point is located somewhere else on the plane.")
z pattern matchingiem ten sam kod:
def location(point):
match point:
case Point(x=0, y=0):
print("Origin is the point's location.")
case Point(x=0, y=y):
print(f"Y={y} and the point is on the y-axis.")
case Point(x=x, y=0):
print(f"X={x} and the point is on the x-axis.")
case Point():
print("The point is located somewhere else on the plane.")
case _:
print("Not a point")
W praktyce może Ci pomóc przy wykrywaniu i dekonstruowaniu różnych struktur do przetwarzania licznych wersji tych samych danych. Znajdziesz też kilka rodzajów wzorców, które umożliwią mapowanie, przechwytywanie, grupowanie itd. Nie będziemy zabierać Ci zabawy odkrywania kolejnych! Podsumowując — ma ogromny potencjał umożliwiający dużą elastyczność przy pisaniu kodu.
Typy Hints
Wprowadzono czystszą i milszą dla oka składnię deklarowania unii typów w type hintach: X | Y (np. Union[float, int]
bardziej zwięzłym float | int
), dzięki czemu jest łatwiejsza do odczytania bez konieczności importowania z typing. Możesz to połączyć ze znaną z Pythona 3.9 List
zamiast typing.List
. Więcej w PEP 604.
Kolejną wartą uwagi nowością jest TypeAlias
. PEP 484 wdrożony w Pythonie 3.5 wprowadził możliwość tworzenia aliasów na podstawie istniejących typów (analogiczna funkcjonalność do using z C++)", niemniej istniejące type checkery nie zawsze sobie radzą z ich poprawną obsługą. TypeAlias
ma to rozwiązać, pozwalając na explicite deklarację, czy coś w kodzie ma być traktowane jako alias typu zmiennej. Więcej informacji na temat tego, jak pisać przejrzysty kod z jego pomocą, znajdziesz w PEPie 613.
Nowy typing TypeGuard
umożliwi łatwiejszą kontrolę nad działaniem kodu w zależności od typów obsługiwanych zmiennych - więcej o nim w PEP 647.
W nowym Pythonie uświadczymy również ułatwień do sprawdzania typów dla funkcji wyższego rzędu i dekoratorów. Uświadczymy tu np. ParamSpec
pozwalający na deklarowanie type hintów dla funkcji przyjmujących nieokreśloną ilość argumentów (znane wszystkim Pythonistom args i kwargs)" oraz typing.Concatenate
wprowadzający szczegółowe type hinty dla funkcji wyższego rzędu zmieniających parametry wejściowe danych funkcji na inne. Więcej szczegółów znajdziesz w PEP 612.
Do funkcji zip()
autorzy Pythona dodali nową opcjonalną flagę strict
wymuszającą sprawdzanie, czy wszystkie sekwencje wrzucane do funkcji mają tę samą długość — więcej szczegółów znajdziesz w PEP 618.
Deserek, czyli inne umilacze życia m.in. dla analityków
Przewidziano również coś dla fanów pand do analizy danych w postaci nowych funkcji do modułu statistics. Umożliwią Ci przeprowadzenie podstawowej analizy bez żmudnego wprowadzania zależności zewnętrznych. Poniżej świeżynki:
correlation()
, który pozwoli Ci obliczyć korelację Pearsona dla dwóch zmiennych,covariance()
, z pomocą której obliczysz kowariancję próbki dla dwóch zmiennychlinear_regression()
, do obliczania nachylenia i przecięcia w regresji liniowej.
Python 10 umożliwia też włączenie ostrzeżeń za pomocą warn_default_encoding
i locale.getpreferredencoding()
, które poinformują Cię o otwarciu pliku kodu bez określonego kodowania. Zastępuje to powołany UTF-8 mode. Więcej dowiesz się z PEP 597. A to tylko niektóre wybrane przez nas ciekawe kąski :)
Coś na lepsze trawienie o problemach z Pythonem 3.10
Przypominamy, że aktualizacje i nowe funkcjonalności tworzy community Pythona, które ma ograniczony czas działania. Mając to na uwadze, wypunktowaliśmy kilka argumentów, dlaczego warto jednak poczekać z instalacją Pythona 3.10:
- w dniu premiery nie było stosownego Dockera, natomiast mogliśmy skorzystać z kandydata 3.10-rc.
- brakuje wheelsów do PyPl, jak np. psycopg2-binary czy matplotlib - co jest tylko kwestią czasu. Z pewnością niebawem zostaną dostosowane.
- autoformatery, lintery i inne narzędzia muszą obsługiwać nową składnię i nie wszystkie są na to gotowe.
- przypominamy, że Conda-Forge rozpoczął pracę na starszej wersji i zanim ją przebudują i dostosują do wersji 3.10, upłynie dużo wody w Wiśle.
Rachuneczek proszę!
Znasz główne za i przeciw, ale ostateczną decyzję o korzystaniu z Pythona 3.10 musisz podjąć sam. Polecamy oczywiście korzystanie z niej dla własnego rozwoju i sprawdzenia nowinek, natomiast zanim użyjesz go na kodzie roboczym, powinieneś sprawdzić, czy jest na to gotowy. Najbezpieczniejszym rozwiązaniem będzie trzymanie na komputerze zarówno wersji 3.9, jak i 3.10, by w razie czego był jakiś punkt odniesienia.
Przypominamy, że wersja 3.6 będzie wspierana do końca tego roku, zatem jeśli współdzielisz kod z innymi, powinieneś się upewnić, że będą w stanie “obsłużyć” nowe funkcje z wersji 3.10.
Dlatego dla ułatwienia decyzji, czy instalować, czy nie — polecamy zadać sobie jedno bardzo proste pytanie:
“Co lubisz w życiu robić? A potem zacznij to robić” ;)
Daj znać w komentarzu, co myślisz o nowych funkcjach Pythona 3.10. Czekamy na Twoją opinię oraz info czy i kiedy wypróbujesz aktualizację :)