Wydanie języka programowania Python 3.11

Po roku prac opublikowano znaczącą wersję języka programowania Python 3.11. 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.12 (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.12 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.11 obejmują:

  • Włożono wiele pracy w optymalizację wydajności. Nowa gałąź zawiera zmiany związane z akceleracją i wdrażaniem inline wywołań funkcji, wykorzystaniem szybkich interpreterów standardowych operacji (x+x, x*x, xx, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq), a także optymalizacje przygotowane przez projekty Cinder i HotPy. W zależności od rodzaju obciążenia następuje wzrost szybkości wykonywania kodu o 10-60%. Wydajność zestawu testów py Performance wzrosła średnio o 25%.

    Przeprojektowano mechanizm buforowania kodu bajtowego, co skróciło czas uruchamiania interpretera o 10-15%. Obiekty z kodem i kodem bajtowym są teraz przydzielane statycznie przez interpreter, co pozwoliło wyeliminować etapy unmarshallingu kodu bajtowego wydobytego z pamięci podręcznej i konwersji obiektów z kodem do umieszczenia w pamięci dynamicznej.

  • Podczas wyświetlania śladów połączeń w komunikatach diagnostycznych możliwe jest teraz wyświetlenie informacji o wyrażeniu, które spowodowało błąd (poprzednio podświetlana była tylko linia bez wyszczególniania, która część linii spowodowała błąd). Rozszerzone informacje o śledzeniu można również uzyskać za pośrednictwem interfejsu API i wykorzystać do mapowania poszczególnych instrukcji kodu bajtowego na określoną pozycję w kodzie źródłowym przy użyciu metody codeobject.co_positions() lub funkcji C API PyCode_Addr2Location(). Ta zmiana znacznie ułatwia debugowanie problemów z zagnieżdżonymi obiektami słownikowymi, wieloma wywołaniami funkcji i złożonymi wyrażeniami arytmetycznymi. Traceback (ostatnie ostatnie wywołanie): Plik „calculation.py”, linia 54, wynik = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: dzielenie przez zero
  • Dodano obsługę grup wyjątków, dając programowi możliwość generowania i przetwarzania kilku różnych wyjątków jednocześnie. Aby zgrupować wiele wyjątków i wywołać je razem, zaproponowano nowe typy wyjątków „ExceptionGroup” i „BaseExceptionGroup” oraz dodano wyrażenie „except*” w celu wyróżnienia poszczególnych wyjątków z grupy.
  • Do klasy BaseException dodana została metoda add_note(), która umożliwia dołączenie do wyjątku notatki tekstowej, np. dodanie informacji kontekstowej, która nie jest dostępna w momencie zgłoszenia wyjątku.
  • Dodano specjalny typ Self, który reprezentuje bieżącą klasę prywatną. Self może służyć do opisywania metod zwracających instancję swojej klasy w prostszy sposób niż przy użyciu TypeVar. klasa MyLock: def __enter__(self) -> Self: self.lock() zwróć self
  • Dodano specjalny typ LiteralString, który może zawierać tylko literały łańcuchowe zgodne z typem LiteralString (tj. ciągi nagie i LiteralString, ale nie dowolne lub połączone ciągi str). Typ LiteralString można wykorzystać do ograniczenia przekazywania argumentów string do funkcji, dowolnego podstawienia części ciągów, w czym może to prowadzić do podatności np. przy generowaniu ciągów dla zapytań SQL czy poleceń powłoki. def run_query(sql: LiteralString) -> ... ... def caller( arbitrary_string: str, query_string: LiteralString, nazwa_tabeli: LiteralString, ) -> Brak: run_query("WYBIERZ * OD uczniów") # ok run_query(literal_string) # ok run_query( "WYBIERZ * Z" + literał_string) # ok run_query(arbitrary_string) # Błąd run_query( # Błąd f"WYBIERZ * OD uczniów GDZIE nazwa = {arbitrary_string}" )
  • Dodano typ TypeVarTuple, umożliwiający użycie zmiennych ogólnych, w przeciwieństwie do TypeVar, który obejmuje nie jeden typ, ale dowolną liczbę typów.
  • Biblioteka standardowa zawiera moduł tomllib z funkcjami do analizowania formatu TOML.
  • Istnieje możliwość oznaczenia poszczególnych elementów słowników typowanych (TypedDict) etykietami Required i NotRequired w celu określenia pól wymaganych i opcjonalnych (domyślnie wszystkie zadeklarowane pola są wymagane, jeżeli parametr total nie jest ustawiony na False). klasa Film(TypedDict): tytuł: str rok: NotRequired[int] m1: Film = {"title": "Czarna Pantera", "rok": 2018} # OK m2: Film = {"title": "Gwiezdne Wojny" } # OK (pole roku jest opcjonalne) m3: Film = {„rok”: 2022} # Błąd, wymagane pole tytułu nie zostało wypełnione)
  • Do modułu asyncio dodana została klasa TaskGroup z implementacją asynchronicznego menedżera kontekstu oczekującego na wykonanie grupy zadań. Dodawanie zadań do grupy odbywa się za pomocą metody create_task(). async def main(): async z asyncio.TaskGroup() as tg: zadanie1 = tg.create_task(some_coro(...)) zadanie2 = tg.create_task(another_coro(...)) print("Oba zadania zostały już zakończone .")
  • Dodano dekorator @dataclass_transform dla klas, metod i funkcji, jeśli jest określony, statyczny system sprawdzania typu traktuje obiekt tak, jakby używał dekoratora @dataclasses.dataclass. W poniższym przykładzie klasa CustomerModel przy sprawdzaniu typów będzie przetwarzana podobnie jak klasa z dekoratorem @dataclasses.dataclass, czyli: jako posiadające metodę __init__, która akceptuje zmienne id i name. @dataclass_transform() klasa ModelBase: … klasa CustomerModel(ModelBase): id: int nazwa: str
  • W wyrażeniach regularnych dodano możliwość stosowania grupowania atomowego ((?>...)) i kwantyfikatorów dzierżawczych (*+, ++, ?+, {m,n}+).
  • Dodano opcję wiersza poleceń „-P” i zmienną środowiskową PYTHONSAFEPATH, aby wyłączyć automatyczne dołączanie potencjalnie niebezpiecznych ścieżek plików do sys.path.
  • Narzędzie py.exe dla platformy Windows zostało znacznie ulepszone, dodając obsługę składni „-V:”. / „oprócz” – . "
  • Wiele makr w interfejsie API języka C jest konwertowanych na zwykłe lub statyczne funkcje wbudowane.
  • Moduły uu, cgi, potoki, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev i sunau są przestarzałe i zostaną usunięte w Pythonie Wersja 3.13. Usunięto funkcje PyUnicode_Encode*.

Źródło: opennet.ru

Dodaj komentarz