Sytuacja kobiet w IT w 2024 roku
7.10.20216 min
Justyna Szatan

Justyna SzatanRedakcja Bulldogjob

Co nowego w Pythonie 3.10

Poznaj wady i zalety najnowszego wydania Pythona w wersji 3.10.

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. ParamSpecpozwalają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ę strictwymuszają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 zmiennych
  • linear_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ę :)

<p>Loading...</p>