Wydanie języka programowania Python 3.11

Po roku prac nad rozwojem opublikowano znaczące wydanie języka programowania Python 3.11. Nowa gałąź będzie wspierana przez półtora roku, po czym przez kolejne trzy i pół roku będą tworzone poprawki usuwające luki w zabezpieczeniach.

Jednocześnie rozpoczęto testy alfa gałęzi Python 3.12 (zgodnie z nowym harmonogramem rozwoju prace nad nową gałęzią zaczynają się pięć miesięcy przed wydaniem poprzedniej gałęzi i w momencie kolejnego wydania osiągają etap testów alfa). Gałąź Python 3.12 będzie znajdować się w fazie wydań alfa przez siedem miesięcy, podczas których będą dodawane nowe możliwości i będą wprowadzane poprawki. Następnie przez trzy miesiące będzie trwało testowanie wersji beta, podczas którego dodawanie nowych funkcji będzie zabronione, a cała uwaga skupi się na naprawie błędów. Ostatnie dwa miesiące przed wydaniem gałąź będzie w fazie kandydatów do wydań, podczas której zostanie przeprowadzona finalna stabilizacja.

Wśród nowości dodanych do Pythona 3.11 znajdują się:

  • Wykonano znaczne prace nad optymalizacją wydajności. Nowa gałąź zawiera zmiany związane z przyspieszeniem i inline-rozwińniających wywołania funkcji, stosowaniem szybkich interpreterów operacji typowych (x+x, x*x, x-x, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq), a także optymalizacjami przygotowanymi przez projekty Cinder i HotPy. W zależności od rodzaju obciążenia obserwuje się wzrost prędkości wykonania kodu o 10-60%. Średnio wydajność podczas przechodzenia przez zestaw testów pyperformance wzrosła o 25%.

    Przeprojektowano mechanizm cache'owania bajtkodów, co pozwoliło skrócić czas uruchamiania interpretera o 10-15%. Obiekty z kodem i bajtkodem są teraz statycznie rozlokowywane przez interpreter, co umożliwiło wyeliminowanie etapów demarshalizowania wyciągniętego z cache bajtkodu oraz przekształcania obiektów z kodem do umieszczania w pamięci dynamicznej.

  • Podczas wyświetlania śladu wywołania w komunikatach diagnostycznych zapewniono wyjście informacji o wyrażeniu, które spowodowało błąd (wcześniej wyróżniana była tylko linia bez szczegółów, która część linii była przyczyną błędu). Rozszerzone informacje o śladzie można również uzyskać za pomocą API i wykorzystać do mapowania poszczególnych instrukcji bajtkodu na konkretną pozycję w kodzie źródłowym, korzystając z metody codeobject.co_positions() lub funkcji C API PyCode_Addr2Location(). Zmiana ta znacznie upraszcza debugowanie problemów związanych z zagnieżdżonymi obiektami słowników, wieloma wywołaniami funkcji i skomplikowanymi wyrażeniami arytmetycznymi. Traceback (most recent call last): File "calculation.py", line 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division by zero
  • Dodano wsparcie dla grup wyjątków, umożliwiające programowi generowanie i obsługę kilku różnych wyjątków jednocześnie. Do grupowania kilku wyjątków i ich wspólnego wywoływania wprowadzono nowe typy wyjątków ExceptionGroup i BaseExceptionGroup, a do wyodrębniania poszczególnych wyjątków z grupy dodano wyrażenie „except*”.
  • Do klasy BaseException dodano metodę add_note(), pozwalającą na dołączenie tekstowej notatki do wyjątku, na przykład dodanie informacji kontekstowej, niedostępnej w czasie generowania wyjątku.
  • Dodano specjalny typ Self, reprezentujący bieżącą zamkniętą klasę. Self może być stosowane do adnotowania metod, które zwracają instancję swojej klasy, w prostszy sposób niż przy użyciu TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
  • Dodano specjalny typ LiteralString, który może zawierać tylko literały tekstowe zgodne z typem LiteralString (tj. gołe ciągi i ciągi z typem LiteralString, ale nie dowolne i nie mieszane ciągi z typem str). Typ LiteralString można stosować do ograniczenia przekazywania argumentów tekstowych funkcjom, gdzie dowolne wstawianie części ciągów może prowadzić do luk, na przykład podczas budowania ciągów dla zapytań SQL lub poleceń shell. def run_query(sql: LiteralString) -> … … def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query("SELECT * FROM students") # ok run_query(literal_string) # ok run_query("SELECT * FROM " + literal_string) # ok run_query(arbitrary_string) # Błąd run_query( # Błąd f"SELECT * FROM students WHERE name = {arbitrary_string}" )
  • Wprowadzono typ TypeVarTuple, który umożliwia korzystanie z wariantowych typów generycznych, w przeciwieństwie do TypeVar obejmującego nie jeden typ, a dowolną liczbę typów.
  • Do standardowej biblioteki dodano moduł tomllib z funkcjami do analizy formatu TOML.
  • Umożliwiono oznaczanie poszczególnych elementów typizowanych słowników (TypedDict) etykietami Required i NotRequired w celu określenia pól obowiązkowych i nieobowiązkowych (domyślnie wszystkie zadeklarowane pola są obowiązkowe, chyba że parametr total zostanie ustawiony na wartość False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars"} # OK (pole year jest nieobowiązkowe) m3: Movie = {"year": 2022} # Błąd, nie wypełnione obowiązkowe pole title)
  • Do modułu asyncio dodano klasę TaskGroup z implementacją asynchronicznego menedżera kontekstowego, który oczekuje na ukończenie grupy zadań. Dodawanie zadań do grupy odbywa się za pomocą metody create_task(). async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("Oba zadania zostały teraz ukończone.")
  • Dodano dekorator klas, metod i funkcji @dataclass_transform, przy użyciu którego system sprawdzania typów statycznych traktuje obiekt tak, jak przy zastosowaniu dekoratora @dataclasses.dataclass. W poniższym przykładzie klasa CustomerModel przy sprawdzaniu typów będzie przetwarzana analogicznie do klasy z dekoratorem @dataclasses.dataclass, tj. jako posiadająca metodę __init__, akceptującą parametry id i name. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
  • W wyrażeniach regularnych dodano możliwość używania grup atomowych ((?>…)) oraz zachłannych kwantyfikatorów (*+, ++, ?+, {m,n}+).
  • Dodano opcję wiersza poleceń „-P” oraz zmienną środowiskową PYTHONSAFEPATH do wyłączenia automatycznego dołączania potencjalnie niebezpiecznych ścieżek plików do sys.path.
  • Znacznie poprawiono narzędzie py.exe dla platformy Windows, w którym dodano obsługę składni „-V:<company>/<tag>” oprócz „-<major>.<minor>”.
  • Wiele makr w interfejsie C API zostało przekształconych w standardowe lub statyczne funkcje inline.
  • Ogłoszono ostatecznie przestarzałymi i będą usunięte w wersji Python 3.13 moduły uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev i sunau. Usunięto funkcje PyUnicode_Encode*.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster