Wydanie języka programowania Python 3.10

Po roku rozwoju zaprezentowano znaczącą wersję języka programowania Python 3.10. Nowy oddział będzie wspierany przez półtora roku, po czym przez kolejne trzy i pół roku będą dla niego generowane poprawki eliminujące luki.

Jednocześnie rozpoczęły się testy alfa gałęzi Python 3.11 (zgodnie z nowym harmonogramem rozwoju prace nad nową gałęzią rozpoczynają się na pięć miesięcy przed wydaniem poprzedniej gałęzi i osiągają fazę testów alfa w momencie wydania kolejnej wersji ). Gałąź Pythona 3.11 będzie w wersji alfa przez siedem miesięcy, podczas której zostaną dodane nowe funkcje i naprawione błędy. Następnie wersje beta będą testowane przez trzy miesiące, podczas których dodawanie nowych funkcji będzie zabronione, a cała uwaga zostanie skupiona na naprawianiu błędów. Przez ostatnie dwa miesiące przed wydaniem gałąź będzie na etapie Release Candidate, na którym zostanie przeprowadzona ostateczna stabilizacja.

Nowe dodatki do Pythona 3.10 obejmują:

  • Zaimplementowano operatory „dopasuj” i „przypadek” do dopasowywania wzorców, które poprawiają czytelność kodu, upraszczają dopasowywanie dowolnych obiektów Pythona i zwiększają niezawodność kodu dzięki zaawansowanemu statycznemu sprawdzaniu typów. Implementacja przypomina operator „dopasuj” dostępny w językach Scala, Rust i F#, który porównuje wynik określonego wyrażenia z listą wzorców wymienionych w blokach na podstawie operatora „case”.

    def http_error(status): status dopasowania: case 400: zwróć „Złe żądanie” case 401|403|404: zwróć „Niedozwolone” case 418: zwróć „Jestem czajnikiem” case _: zwróć „Coś innego”

    Możesz rozpakowywać obiekty, krotki, listy i dowolne sekwencje, aby powiązać zmienne w oparciu o istniejące wartości. Dopuszczalne jest definiowanie szablonów zagnieżdżonych, stosowanie w szablonie dodatkowych warunków „if”, stosowanie masek („[x, y, *rest]”), mapowań klucz/wartość (np. {„bandwidth”: b, „latency ”: l}, aby wyodrębnić ze słownika wartości „przepustowości” i „opóźnienia”, wyodrębnić podszablony (operator:="), użyć nazwanych stałych w szablonie. Na zajęciach można dostosować zachowanie dopasowywania za pomocą metody „__match__()”.

    z klas danych import dataclass @dataclass class Punkt: x: int y: int def Whereis(point): punkt dopasowania: case Point(0, 0): print("Origin") case Point(0, y): print(f" Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("Gdzie indziej") case _: print("Nie ma punktu") dopasowanie punkt: przypadek Punkt(x, y) if x == y: print(f"Y=X at {x}") przypadek Punkt(x, y): print(f"Nie po przekątnej") CZERWONY, ZIELONY, NIEBIESKI = 0, 1, 2 dopasuj kolor: case RED: print(“Widzę czerwień!”) case ZIELONY: print(“Trawa jest zielona”) case NIEBIESKI: print(“Czuję smutek :(“)

  • Obecnie w instrukcji with można używać nawiasów, aby podzielić definicję zbioru menedżerów kontekstu na wiele wierszy. Dopuszczalne jest także pozostawienie przecinka po ostatnim menedżerze kontekstu w grupie: with ( CtxManager1() jako przykład1, CtxManager2() jako przykład2, CtxManager3() jako przykład3, ): ...
  • Ulepszone raportowanie lokalizacji kodu błędów związanych z niezamkniętymi nawiasami klamrowymi i cudzysłowami w literałach łańcuchowych. Na przykład, jeśli występuje niezamknięty nawias klamrowy, zamiast zgłaszać błąd składniowy w poniższej konstrukcji, wskaźnik podświetla teraz nawias otwierający i wskazuje, że nie ma bloku zamykającego. Plik „example.py”, oczekiwano wiersza 1 = {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError: '{' nigdy nie był zamknięty

    Dodano dodatkowe komunikaty o błędach składniowych: brak symbolu „:” przed blokiem i w słownikach, brak oddzielania krotki nawiasami, brak przecinka na listach, określenie bloku „spróbuj” bez „z wyjątkiem” i „w końcu”, użycie „=” " zamiast "= =" w porównaniach, określając *-wyrażenia w ciągach f. Ponadto zapewnia podkreślenie całego problematycznego wyrażenia, a nie tylko jego początku, oraz bardziej jednoznaczną informację o kontekście błędów związanych z nieprawidłowym wcięciem. >>> def foo(): … if lel: … x = 2 Plik „”, linia 3 x = 2 ^ IndentationError: oczekiwano bloku z wcięciem po instrukcji „if” w linii 2

    W przypadku błędów spowodowanych literówkami w nazwach atrybutów i zmiennych w funkcji wyświetlana jest rekomendacja z poprawną nazwą. >>> Kolekcje.namedtoplo Traceback (ostatnie ostatnie wywołanie): Plik "", linia 1, w AttributeError: moduł 'collections' nie ma atrybutu 'namedtoplo'. Czy chodziło Ci o: nametuple

  • W przypadku narzędzi do debugowania i profilerów zdarzenia śledzenia są dostarczane z dokładnymi numerami linii wykonanego kodu.
  • Dodano ustawienie sys.flags.warn_default_encoding, aby wyświetlać ostrzeżenie o potencjalnych błędach związanych z przetwarzaniem plików zakodowanych w UTF-8 przez TextIOWrapper i open() bez wyraźnego określenia opcji „encoding=»utf-8″” (domyślnie używane jest kodowanie ASCII). Nowa wersja zapewnia także możliwość określenia wartości „encoding="locale" w celu ustawienia kodowania na podstawie bieżących ustawień regionalnych.
  • Do modułu typowania dodano nowy operator, który udostępnia narzędzia do określania adnotacji typu, umożliwiając wykorzystanie składni „X | Y”, aby wybrać jeden z typów (typ X lub typ Y). def kwadrat(liczba: int | float) -> int | float: numer zwrotu ** 2 jest odpowiednikiem poprzednio obsługiwanej konstrukcji: def kwadrat(liczba: Union[int, float]) -> Union[int, float]: numer zwrotu ** 2
  • Do modułu typowania dodano operator Concatenate i zmienną ParamSpec, które umożliwiają przekazywanie dodatkowych informacji do statycznego sprawdzania typu podczas korzystania z Callable. Moduł typowania dodaje także specjalne wartości TypeGuard do opisywania funkcji ochrony typu oraz TypeAlias ​​do jawnego definiowania aliasu typu. StrCache: TypeAlias ​​​​= „Cache[str]” # alias typu
  • Funkcja zip() implementuje opcjonalną flagę „strict”, która, jeśli jest określona, ​​sprawdza, czy iterowane argumenty mają tę samą długość. >>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True)) [('a', 1), ('b', 2) , ('c', 3)] >>> list(zip(range(3), ['opłata', 'fi', 'fo', 'fum'], strict=True)) Traceback (ostatnie połączenie ostatnie ): … ValueError: argument zip() 2 jest dłuższy niż argument 1
  • Zaproponowano nowe wbudowane funkcje aiter() i anext() z implementacją asynchronicznych odpowiedników funkcji iter() i next().
  • Praca konstruktorów str(), bytes() i bytearray() podczas pracy z małymi obiektami została przyspieszona o 30-40%.
  • Zmniejszono liczbę operacji importu w module runpy. Polecenie „python3 -m nazwa_modułu” działa teraz średnio 1.4 razy szybciej ze względu na redukcję importowanych modułów z 69 do 51.
  • Instrukcja LOAD_ATTR wykorzystuje mechanizm buforowania poszczególnych rozkazów, co pozwoliło przyspieszyć pracę z atrybutami zwykłymi nawet o 36%, a ze slotami nawet o 44%.
  • Podczas budowania Pythona z opcją „--enable-optimizations” włączony jest teraz tryb „-fno-semantic-interposition”, który pozwala przyspieszyć interpreter nawet o 30% w porównaniu do budowania z opcją „--enable-shared " opcja.
  • Moduły hashlib i ssl dodały obsługę OpenSSL 3.0.0 i przestały obsługiwać wersje OpenSSL starsze niż 1.1.1.
  • Stary parser został usunięty, który w poprzedniej gałęzi został zastąpiony przez parser PEG (Parsing Expression Grammar). Moduł formatyzatora został usunięty. Parametr pętli został usunięty z interfejsu API asyncio. Metody, które były wcześniej przestarzałe, zostały usunięte. Funkcje Py_UNICODE_str* służące do manipulacji ciągami znaków Py_UNICODE* zostały usunięte.
  • Moduł distutils jest przestarzały i ma zostać usunięty w Pythonie 3.12. Zamiast distutils zaleca się użycie modułów setuptools, package, platform, shutil, subprocess i sysconfig. Struktura wstr w PyUnicodeObject została przestarzała i zaplanowana do usunięcia.

Źródło: opennet.ru

Dodaj komentarz