Po roku prac rozwojowych znaczące wydanie języka programowania . Python 3.9 stał się pierwszym wydaniem po projekcie na 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 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 Python 3.9:
- W słownikach, zdefiniowanych przy pomocy wbudowanej klasy dict, 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) - 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’)] - 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.connectTeraz można pisać:
@buttons[0].clicked.connect - Do standardowej biblioteki moduł , 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 wspiera topologiczną sortowanie grafów.
- 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’ - nowy parser (Parsing Expression Grammar), który zastąpił parser . 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.
- 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 od zablokowania zbiorów zawierających reanimowane obiekty, które pozostają dostępne na zewnątrz po uruchomieniu finalizatora.
- Dodano metodę , 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 przy ponownej inicjalizacji interpretera Pythona w jednym procesie.
- Przeprowadzono optymalizację wydajności wbudowanych typów range, tuple, set, frozenset, list i dict, 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 .
- Moduły standardowej biblioteki audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios i zlib zostały przetłumaczone na użycie ograniczonego , 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 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.9Dostę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.7Dostę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.6Dostę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.8Operacje 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.5Czas wykonywania pętli:
overhead_pętli 0.5 0.6 0.4 0.3 0.3 0.3 - 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
