Wydanie języka programowania Python 3.9

Po roku rozwoju przedstawione znaczące wydanie języka programowania Python 3.9. Python 3.9 był pierwszą wersją późniejszą przejście projekt włączony nowy cykl przygotowanie i wsparcie wydań. Nowe główne wydania będą teraz generowane raz w roku, a aktualizacje korygujące będą wydawane co dwa miesiące. Każda istotna gałąź będzie wspierana przez półtora roku, po czym zostaną opracowane kolejne trzy i pół roku w celu usunięcia luk w zabezpieczeniach.

Prace nad nową gałęzią rozpoczynają się teraz na pięć miesięcy przed wydaniem kolejnej gałęzi, tj. zbiegło się z wydaniem Pythona 3.9 Rozpoczęty testy alfa gałęzi Pythona 3.10. Gałąź Pythona 3.10 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. Ostatnie dwa miesiące przed wydaniem gałąź będzie na etapie Release Candidate, na którym zostanie przeprowadzona ostateczna stabilizacja.

Wśród dodany innowacje w Pythonie 3.9:

  • W słownikach zdefiniowanych przy użyciu wbudowanej klasy dict, pojawił się obsługa operatorów scalania „|” oraz "|=" aktualizacje, które uzupełniają metody {**d1, **d2} i dict.update zaproponowane wcześniej do łączenia słowników.

    >>> x = {"klucz1": "wartość1 z x", "klucz2": "wartość2 z x"}
    >>> y = {"klucz2": "wartość2 z y", "klucz3": "wartość3 z y"}

    >>> x | y
    {'klucz1': 'wartość1 z x', 'klucz2': 'wartość2 z y', 'klucz3': 'wartość3 z y'}

    >>> y | X
    {'klucz2': 'wartość2 z x', 'klucz3': 'wartość3 z y', 'klucz1': 'wartość1 z x'}

  • Wbudowana kolekcja typów obejmuje listę, dict i krotkę, których można używać jako typów podstawowych bez importowania z modułu wpisywania. Te. zamiast typing.List, typing.Dict i typing.Tuple możesz teraz określić
    po prostu wypisz, dyktuj i krotka:

    def greet_all(names: lista[str]) -> Brak:
    dla nazw w nazwach:
    print("Witam", imię)

  • Są zapewnione elastyczne narzędzia do opisywania funkcji i zmiennych. Do dołączania adnotacji do modułu wpisywania dodano nowy typ Annotated, rozszerzając istniejące typy o dodatkowe metadane, które można wykorzystać do analizy statycznej lub 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')]

  • Stonowana wymagania gramatyczne dla dekoratorów - dowolne wyrażenie odpowiednie do użycia w blokach if i while może być teraz używane jako dekorator. Zmiana znacząco poprawiła czytelność kodu PyQt5 i uprościła obsługę tego modułu:

    To było:
    przycisk_0 = przyciski[0] @button_0.clicked.connect

    Teraz możesz napisać:
    @buttons[0].kliknięty.połącz

  • Do standardowej biblioteki dodany moduł informacje o strefie, który zawiera informacje z bazy danych stref czasowych IANA.

    >>> z informacji o strefie zaimportuj ZoneInfo
    >>> z datetime import datetime, timedelta
    >>> # Czas letni
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("Ameryka/Los Angeles"))
    >>> drukuj(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    „PDT”

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

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

  • Dodano moduł graphlib, w którym wdrożone obsługa sortowania topologicznego grafów.
  • Zaproponowano nowe metody usuwania przedrostków i zakończeń linii - str.removeprefix(prefix) i str.removesuffix(suffix). Do obiektów str, bytes, bytearray icollections.UserString dodano metody.

    >>> s = "FooBar"
    >>> s.removeprefix("Foo")
    'Bar'

  • Zaangażowany nowy parser PEG (Parsing Expression Grammar), który zastąpił parser LL(1). Zastosowanie nowego parsera pozwoliło pozbyć się niektórych „hacków” używanych do ominięcia ograniczeń w LL(1) i znacznie obniżyło koszty pracy związanej z utrzymaniem parsera. Pod względem wydajności nowy parser stoi w przybliżeniu na tym samym poziomie co poprzedni, jednak znacznie go wyprzedza pod względem elastyczności, która pozwala czuć się bardziej swobodnie przy projektowaniu nowych funkcji językowych. Stary kod parsera jest na razie zachowywany i można go zwrócić przy użyciu flagi „-X oldparser” lub zmiennej środowiskowej „PYTHONOLDPARSER=1”, ale zostanie usunięty w wersji 3.10.
  • Pod warunkiem, że możliwość dostępu metod rozszerzenia C do stanu modułów, w których są zdefiniowane, przy użyciu bezpośredniego dereferencji wskaźnika zamiast wyszukiwania stanu modułu przy użyciu funkcji PyState_FindModule. Zmiana pozwala zwiększyć wydajność modułów C poprzez zmniejszenie lub całkowite wyeliminowanie narzutu związanego ze sprawdzaniem stanu modułu. Aby skojarzyć moduł z klasą, proponuje się funkcję C PyType_FromModuleAndSpec(), aby uzyskać moduł i jego stan, proponuje się funkcje C PyType_GetModule() i PyType_GetModuleState() oraz zapewnić metodę dostępu do klasy w którym jest ona zdefiniowana, zaproponowano funkcję C PyCMethod i flagę METH_METHOD.
  • Śmieciarz dostarczony z blokowania kolekcji zawierających ożywione obiekty, które pozostają dostępne z zewnątrz po uruchomieniu finalizatora.
  • Dodano metodę os.pidfd_open, który pozwala na użycie podsystemu jądra Linuksa „pidfd” do obsługi sytuacji ponownego wykorzystania PID (pidfd jest powiązany z konkretnym procesem i nie zmienia się, podczas gdy PID może być powiązany z innym procesem po zakończeniu bieżącego procesu powiązanego z tym PID ).
  • Obsługa specyfikacji Unicode została zaktualizowana do wersji 13.0.0.
  • Wyłączony wyciek pamięci podczas ponownej inicjalizacji interpretera Pythona w tym samym procesie.
  • Zoptymalizowano wydajność wbudowanych typów range, tuple, set, coldset, list i dict. wdrożony poprzez zastosowanie protokołu skrótu Vectorcall umożliwiającego szybszy dostęp 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 do ładowania z inicjalizacja w kilku etapach.
  • Standardowe moduły biblioteczne audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random,select, struct, termios i zlib zostały przekonwertowane tak, aby korzystały z ograniczonych stabilny ABI, co rozwiązuje problem funkcjonalności zestawów modułów rozszerzeń dla różnych wersji Pythona (w przypadku aktualizacji wersji nie ma potrzeby przebudowy modułów rozszerzeń, a moduły skompilowane dla wersji 3.9 będą mogły działać w gałęzi 3.10).
  • Moduł asyncio ma przestarzałą obsługę parametru reuse_address ze względu na potencjalne problemy z bezpieczeństwem (użycie SO_REUSEADDR dla UDP w systemie Linux umożliwia różnym procesom podłączanie gniazd nasłuchujących do portu UDP).
  • Dodano nowe optymalizacje, np. poprawiono wydajność procedur obsługi sygnałów w aplikacjach wielowątkowych, zwiększono prędkość modułu podprocesów w środowisku FreeBSD oraz szybsze przypisywanie zmiennych tymczasowych (przypisanie zmiennej w wyrażeniu „dla y w [wyraż ]” jest teraz tak samo wydajne, jak wyrażenie „y = wyrażenie” „). Ogólnie większość testów pokaż spadek wydajności w porównaniu do 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 odczytu zmiennych i atrybutów:
    odczyt_lokalny 7.1 7.1 5.4 5.1 3.9 4.0
    odczyt_nielokalny 7.1 8.1 5.8 5.4 4.4 4.8
    odczyt_globalny 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
    read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 18.6
    read_classvar_from_instance 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
    read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
    read_namedtuple 73.8 57.5 ​​45.0 46.8 18.4 23.2
    metoda_odczytu 37.6 37.9 29.6 26.9 27.7 45.9

    Dostęp do zapisu zmiennych i atrybutów:
    write_local 8.7 9.3 5.5 5.3 4.3 4.2
    write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9
    write_global 19.7 21.2 18.0 18.0 15.8 17.2
    zmienna_klasy zapisu 92.9 96.0 104.6 102.1 39.2 43.2
    write_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
    write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7

    Dostęp do odczytu struktury danych:
    lista_czytanych 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_dykt 24.3 25.7 22.3 23.0 21.0 22.5
    odczyt_strdykt 22.6 24.3 19.5 21.2 18.9 21.6

    Dostęp do zapisu struktury danych:
    lista_zapisów 27.1 28.5 22.5 21.6 20.0 21.6
    write_deque 28.7 30.1 22.7 21.8 23.5 23.2
    write_dict 31.4 33.3 29.3 29.2 24.7 27.8
    write_strdict 28.4 29.9 27.5 25.2 23.1 29.8

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

    Pętla czasowa:
    pętla_narzut 0.5 0.6 0.4 0.3 0.3 0.3

  • Usunięto wiele funkcji i metod języka Python 2.7, które były wcześniej przestarzałe i w poprzedniej wersji powodowały wyświetlenie ostrzeżenia DeprecationWarning, w tym metoda unescape() w pliku 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

Dodaj komentarz