Nowości w Pythonie 3.10



Można krzyczeć, można płakać, można nawet wyrażać głębokie zaniepokojenie, ale prawda jest taka, że jeżeli ktoś chce się zajmować profesjonalną analityką danych to musi programować w Pythonie. Chociaż istnieje co prawda język R dla statystyków, Matlab i SAS dla masochistów, a na horyzoncie nieśmiało wyłania się język Julia, tak dzisiaj, gdy myśli się o profesjonalnej analityce trzeba polubić się z Pythonem. Wraz z jego wszystkimi wadami i zaletami, a wad jest wciąż sporo. Na szczęście mimo swoich niedociągnięć Python charakteryzuje się ogromną społecznością – ludźmi, którzy corocznie szykują jego nową, ulepszoną wersję i dzięki nim, własnie dziś 4 października, ma swoją premierę najnowszy Python 3.10.


Ten krótki artykuł nie ma na celu wylistowanie wszystkich zmian jakie przynosi nowy numerek w nazwie, jako że tekst ten wtedy byłby kopią oficjalnej dokumentacji i pewnie mało kto dotarłby do jego końca. Zamiast tego skupię się na trzech najistotniejszych, moim zdaniem najciekawszych zmianach.


Structural Pattern Matching

Nie sposób nie rozpocząć merytorycznej części tego tekstu od najważniejszej zmiany, jaką przynosi nowa edycja języka. Zmiana ta, na którą czekała naprawdę duża rzesza programistów i analityków, to wprowadzenie tzw. structural pattern matching. Co kryje się pod tą dość długą i tajemniczą nazwą? Już spieszę z wyjaśnieniem. Dotychczasowo w przypadku, kiedy logika skryptu wymagała „rozgałęzienia” na kilka różnych opcji działania zależnych od warunku wejściowego wymagane było stworzenie odpowiednich komend „if … elif … else”. Chociaż spełniało to swoją funkcję, tak potrafiło sprawić, że kod był niepotrzebnie rozbudowany, a przez to nieczytelny – to czego brakowało dotychczas w Pythonie, to znanej z wielu innych języków programowania instrukcji wyboru „switch … case”.


W nowej wersji Pythona wprowadzone zostały dwa nowe słowa kluczowe – match oraz case, które odpowiadają za działanie instrukcji wyboru na zasadzie podobnej do wspomnianej alternatywy. Dociekliwy czytelnik może teraz zapytać dlaczego właściwie zdecydowano się na słowo „match” zamiast popularnego wśród innych języków standardowego słowa-klucz „switch”? Odpowiedź na to pytanie wiąże się z faktem, iż wprowadzona funkcja idzie o krok dalej. Zgodnie z tym co sugeruje sama nazwa funkcji, nowe wyrażanie „match … case” nie sprowadza się wyłącznie do sprawdzenia prostego warunku, a poszukiwania wzorca. Tłumacząc z języka technicznego na polski, oznacza to uproszczenie w badaniu przekazanej struktury zmiennej. Poniżej przedstawiono porównanie pomiędzy wykorzystaniem nowej struktury „match … case” z poprzednim „if … elif … else”.


Ten sam kod przyjmujący listę i wykonujący odpowiednie polecenie zależnie od zawartości listy – napisany w Pythonie 3.10 oraz w wersji 3.9.


Już na tym relatywnie prostym przykładzie można zobaczyć, że druga ze struktur robi się zdecydowanie bardziej rozbudowana i mniej czytelna w przypadku, kiedy zaczyna jednocześnie sprawdzać również strukturę (wzorzec) przekazanego argumentu. A nie trudno wyobrazić sobie zdecydowanie bardziej skomplikowane przykłady, oparte m.in. na rozbudowanych zmiennych typu JSON!


Usprawnienia w podpowiedziach

Python jest językiem programowania typowanym dynamicznie. W praktyce oznacza to, że raz zadeklarowana zmienna może z początku przechowywać liczbę całkowitą, później zmiennoprzecinkową, a jeszcze później, w ramach popołudniowego relaksu, zmienić się w zmienną tekstową. Chociaż pozwala to na bardzo dużą elastyczność w pisaniu programów i skryptów, to powiedzieć, że powoduje to spowolnienie działania języka to jak nic nie powiedzieć. Python wspiera swego rodzaju podpowiadanie typów zmiennych (z ang. type hinting). Chociaż nie wpływa to niestety na szybkość działania, to pomaga programiście w okiełznaniu typów i szybszym wyłapywaniu błędów. Samo wskazywanie typów zmiennych zaimplementowane dotychczas było dość uciążliwe w wykorzystaniu, szczególnie w przypadku bardziej skomplikowanych zmiennych. Jako przykład niech posłuży prosta funkcja, której zadaniem podniesienie liczby do kwadratu. Jeżeli liczba wejściowa może być zarówno całkowita jak i zmiennoprzecinkowa, to należy z oddzielnej biblioteki dokonać importu specjalnego operatora Union i za jego pomocą przekazywać podpowiedzi.


Funkcja podnosząca przekazaną liczbę do kwadratu napisana w Pythonie 3.9


Python w wersji 3.10 pozwala w większym stopniu uniezależnić się do biblioteki typing. Ten sam kod powyżej można zapisać w uproszczony sposób, zastępując Union poprzez specjalny znak „|”. Samych zmian w dziedzinie type hinting jest oczywiście znacznie więcej. Być może sprawi, że coraz więcej deweloperów będzie korzystać z funkcji podpowiedzi.


Funkcja podnosząca przekazaną liczbę do kwadratu napisana w Pythonie 3.10


Bardziej klarowne błędy

Nie zapominajmy jednak, że Python dzięki swojej prostocie uznawany jest za jeden z najlepszych języków do stawiania pierwszych kroków w dziedzinie programowania. Celowo wspominam tutaj o początkujących, jako że rozpoczęcie nauki wiąże się z występowaniem błędów w kodzie. Zwykle dużej liczby błędów. W ramach nowej wersji Python będzie zdecydowanie bardziej zrozumiale oznajmiał dlaczego napisany przez programistę kod nie chce działać. Dotychczasowe komunikaty błędów mogły oznaczać wiele rzeczy jednocześnie. Przykładowo, weźmy na warsztat słownik, którego programista przypadkowo zapomniał zamknąć z prawej strony.


Deklaracja dwuelementowego słownika z błędem – brak domknięcia słownika z prawej strony.


W starszych wersjach Pythona komunikat błędu w przypadku próby zadeklarowania takiej zmiennej będzie dość niejednoznaczny:

  • SyntaxError: unexpected EOF while parsing komunikat błędu w starszych wersjach

  • SyntaxError: ‘{‘ was never closed komunikat błędu w nowej wersji


W nowej wersji komunikat jest nie tylko jaśniejszy, ale także wskaże konkretne miejsce występowania błędu. Nie zrozumcie mnie źle! Oczywiście z tej funkcji skorzystają nie tylko początkujący, także doświadczonym deweloperom zdarzają się błędy! Początkujący zdecydowanie bardziej zyskają na nowych opisach i być może nie będą musieli aż tak często googlować każdej swojej pomyłki. A to sprawi, że nauka będzie przyjemniejsza i być może także szybsza.

Co dalej?

Podkreślę raz jeszcze, że opisane w tekście zmiany nie są jedynymi nowościami. Warto wspomnieć również o ułatwieniu jednoczesnego zdefiniowania wielu context menegerów za jednym razem. Pełna lista zmian dla dociekliwych znajduje się pod tym linkiem. Będą jednak pewnie i tacy, którzy stwierdzą, że nowa wersja nie przynosi aż tylu korzyści, by warto było się nią aż w takim stopniu ekscytować. Jeżeli drogi Czytelniku należysz do tego grona, to być może ucieszy Cię fakt, że główny twórca języka, Guido van Rossum w maju 2021 roku zapowiedział plany podwójnego przyspieszenia działania języka w ramach aktualizacji 3.11 – jest więc na co czekać!



Piotr Więckiewicz

Junior Machine Learning Developer

piotr.wieckiewicz@bitpeak.pl

285 wyświetleń

Ostatnie posty

Zobacz wszystkie