Wydanie języka programowania Python 3.9

Po roku prac rozwojowych zaprezentowano znaczące wydanie języka programowania Python 3.9. Python 3.9 stał się pierwszym wydaniem po przejścia projekcie na nowy cykl przygotowania i wsparcia dla wydań. Nowe znaczące wydania będą teraz tworzone raz w roku, a poprawki wydawane co dwa miesiące. Każda znacząca gałąź będzie wspierana przez półtora roku, po czym jeszcze przez trzy i pół roku będą tworzone poprawki usuwające luki w zabezpieczeniach.

Prace nad nową gałęzią zaczynają się teraz pięć miesięcy przed wydaniem kolejnej gałęzi, tzn. równocześnie z wydaniem Python 3.9 zaczęło się testowanie alfa gałęzi Python 3.10. Gałąź Python 3.10 będzie na etapie wydań alfa przez siedem miesięcy, w tym czasie będą dodawane nowe możliwości i poprawiane błędy. Następnie przez trzy miesiące będzie prowadzone testowanie wersji beta, w czasie którego dodawanie nowych możliwości będzie zabronione, a cała uwaga skupi się na poprawie błędów. Ostatnie dwa miesiące przed wydaniem gałąź będzie na etapie kandydata do wydań, na którym dokonana zostanie finalna stabilizacja.

Wśród dodanych nowości w Python 3.9:

  • W słownikach, zdefiniowanych przy pomocy wbudowanej klasy dict, pojawiła się wsparcie dla operatorów scalania „|” i aktualizacji „|=”, które uzupełniają metody {**d1, **d2} oraz dict.update, wcześniej proponowane do łączenia słowników.

    >>> x = {„key1”: „value1 from x”, „key2”: „value2 from x”}
    >>> y = {„key2”: „value2 from y”, „key3”: „value3 from y”}

    >>> x | y
    {‘key1’: ‘value1 from x’, ‘key2’: ‘value2 from y’, ‘key3’: ‘value3 from y’}

    >>> y | x
    {‘key2’: ‘value2 from x’, ‘key3’: ‘value3 from y’, ‘key1’: ‘value1 from x’}

  • Do wbudowanej kolekcji typów włączone są list, dict i tuple, które można używać jako typy podstawowe bez importowania z modułu typing. Tzn. zamiast typing.List, typing.Dict i typing.Tuple można teraz wskazywać
    po prostu list, dict i tuple:

    def greet_all(names: list[str]) -> None:
    for name in names:
    print(„Hello”, name)

  • Dostarczono elastyczne narzędzia do adnotacji funkcji i zmiennych. Aby dołączyć adnotacje, do modułu typing dodano nowy typ Annotated, rozszerzający istniejące typy dodatkowymi metadanymi, które mogą być używane podczas analizy statycznej lub do optymalizacji w czasie wykonywania. Aby uzyskać dostęp do metadanych z kodu, do metody typing.get_type_hints() dodano parametr include_extras.

    charType = Annotated[int, ctype(„char”)]
    UnsignedShort = Annotated[int, struct2.ctype(‘H’)]

  • Złagodzone wymagania gramatyczne dotyczące dekoratorów — każda wyrażenie nadające się do stosowania w blokach if i while może teraz być użyte jako dekorator. Zmiana znacznie poprawiła czytelność kodu PyQt5 oraz uprościła utrzymanie tego modułu:

    Było:
    button_0 = buttons[0]
    @button_0.clicked.connect

    Teraz można pisać:
    @buttons[0].clicked.connect

  • Do standardowej biblioteki dodano moduł zoneinfo, w tym informacje z bazy stref czasowych IANA.

    >>> from zoneinfo import ZoneInfo
    >>> from datetime import datetime, timedelta
    >>> # Czas letni
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo(‘America/Los_Angeles’))
    >>> print(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    ‘PDT’

    >>> # Czas standardowy
    >>> dt += timedelta(days=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00

    >>> print(dt.tzname())
    PST

  • Dodano moduł graphlib, który zrealizowano wspiera topologiczną sortowanie grafów.
  • Zaproponowane nowe metody do usuwania prefiksów i zakończeń w łańcuchach — str.removeprefix(prefix) oraz str.removesuffix(suffix). Metody zostały dodane do obiektów str, bytes, bytearray i collections.UserString.

    >>> s = ‘FooBar’
    >>> s.removeprefix(‘Foo’)
    ‘Bar’

  • Wykorzystano nowy parser PEG (Parsing Expression Grammar), który zastąpił parser LL(1). Wprowadzenie nowego parsera pozwoliło pozbyć się niektórych „hacków”, używanych do obejścia ograniczeń w LL(1), i znacznie zmniejszyło nakłady pracy na utrzymanie parsera. Jeśli chodzi o wydajność, nowy parser znajduje się na podobnym poziomie co poprzedni, ale znacznie przeważa go pod względem elastyczności, co umożliwia większą swobodę w projektowaniu nowych możliwości języka. Kod starego parsera został nadal zachowany i może zostać przywrócony za pomocą flagi „-X oldparser” lub zmiennej środowiskowej „PYTHONOLDPARSER=1”, ale zostanie usunięty w wydaniu 3.10.
  • Dostarczono możliwość dostępu metod rozszerzeń C do stanu modułów, w których są zdefiniowane, za pomocą bezpośredniego dereferencjonowania wskaźników, zamiast wyszukiwania stanu modułu przy użyciu funkcji PyState_FindModule. Zmiana pozwala na poprawę wydajności modułów w C poprzez zmniejszenie lub całkowite wyeliminowanie kosztów związanych z weryfikowaniem stanu modułu. Do powiązania modułu z klasą zaproponowano funkcję C PyType_FromModuleAndSpec(), do uzyskania modułu i jego stanu funkcje C PyType_GetModule() i PyType_GetModuleState(), a do umożliwienia metodzie dostępu do klasy, w której została zdefiniowana, funkcja C PyCMethod oraz flaga METH_METHOD.
  • Garbage collector został uwolniony od zablokowania zbiorów zawierających reanimowane obiekty, które pozostają dostępne na zewnątrz po uruchomieniu finalizatora.
  • Dodano metodę os.pidfd_open, pozwalający na użycie podsystemu jądra Linux „pidfd” do przetwarzania sytuacji z ponownym użyciem PID (pidfd jest powiązany z konkretnym procesem i nie zmienia się, podczas gdy PID może być przypisany do innego procesu po zakończeniu bieżącego procesu, powiązanego z tym PID).
  • Wsparcie dla specyfikacji Unicode zostało zaktualizowane do wersji 13.0.0.
  • Usunięto wyciek pamięci przy ponownej inicjalizacji interpretera Pythona w jednym procesie.
  • Przeprowadzono optymalizację wydajności wbudowanych typów range, tuple, set, frozenset, list i dict, zrealizowaną dzięki zastosowaniu protokołu szybkiego wywołania Vectorcall do szybszego dostępu do obiektów napisanych w języku C.
  • Moduły _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time i _weakref zostały przeniesione na ładowanie z inicjalizacją w kilku etapach.
  • Moduły standardowej biblioteki audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios i zlib zostały przetłumaczone na użycie ograniczonego stabilnego ABI, który rozwiązuje problem działania zestawień modułów rozszerzeń dla różnych wersji Pythona (przy aktualizacji wersji nie trzeba ponownie kompilować modułów rozszerzeń, a moduły skompilowane dla 3.9 będą mogły działać w gałęzi 3.10).
  • W module asyncio z powodu potencjalnych problemów z bezpieczeństwem zaprzestano obsługi parametru reuse_address (użycie SO_REUSEADDR dla UDP w Linux pozwala różnym procesom przypinać nasłuchujące gniazda do portu UDP).
  • Dodano nowe optymalizacje, na przykład zwiększono wydajność obsługi sygnałów w aplikacjach wielowątkowych, przyspieszono działanie modułu subprocess w środowisku FreeBSD oraz przyspieszono przypisanie zmiennych czasowych (przypisanie zmiennej w wyrażeniu „for y in [expr]” teraz nie ustępuje wydajności wyrażeniu „y = expr”). Ogółem większość testów pokazują zmniejszenie wydajności w porównaniu z gałęzią 3.8 (przyspieszenie obserwuje się tylko w testach write_local i write_deque):

    Wersja Pythona 3.4 3.5 3.6 3.7 3.8 3.9
    ————— — — — — — —

    Dostęp do zmiennych i atrybutów:
    read_local 7.1 7.1 5.4 5.1 3.9 4.0
    read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8
    read_global 15.5 19.0 14.3 13.6 7.6 7.7
    read_builtin 21.1 21.6 18.5 19.0 7.5 7.7
    odczyt_classvar_z_klasy 25.6 26.5 20.7 19.5 18.4 18.6
    odczyt_classvar_z_instancji 22.8 23.5 18.8 17.1 16.4 20.1
    odczyt_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
    odczyt_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
    odczyt_namedtuple 73.8 57.5 45.0 46.8 18.4 23.2
    odczyt_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9

    Dostęp do zmiennych i atrybutów:
    zapis_lokalny 8.7 9.3 5.5 5.3 4.3 4.2
    zapis_nielokalny 10.5 11.1 5.6 5.5 4.7 4.9
    zapis_globalny 19.7 21.2 18.0 18.0 15.8 17.2
    zapis_classvar 92.9 96.0 104.6 102.1 39.2 43.2
    zapis_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
    zapis_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7

    Dostęp do struktury danych:
    odczyt_lista 24.2 24.5 20.8 20.8 19.0 21.1
    odczyt_deque 24.7 25.5 20.2 20.6 19.8 21.6
    odczyt_dict 24.3 25.7 22.3 23.0 21.0 22.5
    odczyt_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    Dostęp do zapisu w strukturze danych:
    zapis_lista 27.1 28.5 22.5 21.6 20.0 21.6
    zapis_deque 28.7 30.1 22.7 21.8 23.5 23.2
    zapis_dict 31.4 33.3 29.3 29.2 24.7 27.8
    zapis_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    Operacje na stosie (lub kolejce):
    dodaj_lista_pop 93.4 112.7 75.4 74.2 50.8 53.9
    dodaj_deque_pop 43.5 57.0 49.4 49.2 42.5 45.5
    dodaj_deque_popleft 43.7 57.3 49.7 49.7 42.8 45.5

    Czas wykonywania pętli:
    overhead_pętli 0.5 0.6 0.4 0.3 0.3 0.3

  • Usunięto wiele funkcji i metod Python 2.7, które wcześniej były oznaczone jako przestarzałe i w poprzednim wydaniu generowały ostrzeżenie DeprecationWarning, w tym metoda unescape() w html.parser.HTMLParser,
    tostring() i fromstring() w array.array, isAlive() w threading.Thread, getchildren() i getiterator() w ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() i base64.decodestring().

Ź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