Po półtora roku prac rozwojowych znacząca wersja języka programowania . Poprawki do gałęzi Python 3.8 będą wydawane przez 18 miesięcy. Krytyczne luki bezpieczeństwa będą naprawiane przez 5 lat do października 2024 roku. Poprawki dla gałęzi 3.8 będą wydawane co dwa miesiące, pierwsza poprawka do Python 3.8.1 zaplanowana jest na grudzień.
Wśród dodanych :
- operacji przypisania wewnątrz złożonych wyrażeń. Dzięki nowemu operatorowi „:=” można przeprowadzać operacje przypisania wartości wewnątrz innych wyrażeń, na przykład aby uniknąć podwójnego wywołania funkcji w instrukcjach warunkowych i przy definiowaniu pętli:
if (n := len(a)) > 10:
…while (block := f.read(256)) != '';
… - nowej składni definiowania argumentów funkcji. Podczas wymieniania argumentów przy definiowaniu funkcji teraz można wskazać znacznik „/”, który oddziela argumenty, którym można przypisać wartości wyłącznie na podstawie kolejności, w jakiej wartości są podawane podczas wywoływania funkcji, od argumentów, które mogą być przypisane w dowolnej kolejności (składnia „zmienna=wartość”). Z praktycznego punktu widzenia nowa funkcjonalność pozwala w funkcjach języka Python w pełni emulować zachowanie istniejących funkcji języka C, a także uniknąć powiązań z konkretnymi nazwami, na przykład, jeśli nazwa parametru ma się zmienić w przyszłości.
Flaga „/” uzupełnia wcześniej wprowadzony znacznik „*”, oddzielający zmienne, dla których zastosowanie ma tylko przypisanie w formie „zmienna=wartość”. Na przykład w funkcji „def f(a, b, /, c, d, *, e, f):” zmienne „a” i „b” mogą być przypisane tylko w kolejności wymieniania wartości,
zmienne „e” i „f”, tylko poprzez przypisanie „zmienna=wartość”, a zmienne „c” i „d” dowolnym z wymienionych sposobów:f(10, 20, 30, 40, e=50, f=60)
f(10, 20, c=30, d=40, e=50, f=60) - nowe API C
do konfiguracji parametrów inicjalizacji Pythona, pozwalające na pełną kontrolę nad wszystkim i oferujące rozszerzone możliwości obsługi błędów. Zaproponowane API upraszcza integrację funkcjonalności interpreterów Pythona w innych aplikacjach języka C; - nowy protokół Vectorcall do szybszego dostępu do obiektów napisanych w języku C. W CPython 3.8 dostęp do Vectorcall jest obecnie ograniczony do użytku wewnętrznego, a wprowadzenie go do publicznie dostępnych API planowane jest na CPython 3.9;
- wywołania Runtime Audit Hooks, które umożliwiają aplikacjom i frameworkom w języku Python dostęp do niskopoziomowych informacji o przebiegu wykonywania skryptu w celu audytu wykonywanych działań (na przykład można śledzić import modułów, otwieranie plików, korzystanie z trace, dostęp do gniazd sieciowych, uruchamianie kodu za pomocą exec, eval i run_mod);
- W module wsparcie dla protokołu Pickle 5, stosowanego do serializacji i deserializacji obiektów. Pickle umożliwia optymalizację przesyłania dużych ilości danych między procesami Python w konfiguracjach wielordzeniowych i wielowęzłowych, zmniejszając liczbę operacji kopiowania pamięci i stosując dodatkowe techniki optymalizacji, takie jak wykorzystanie specyficznych dla danych algorytmów kompresji. Piąta wersja protokołu wyróżnia się dodaniem trybu oddzielonego przesyłania (out-of-band), w którym dane mogą być przesyłane niezależnie od głównego strumienia pickle.
- Domyślnie aktywowana jest czwarta wersja protokołu Pickle, która w porównaniu do wcześniej oferowanej domyślnie trzeciej wersji umożliwia osiągnięcie wyższej wydajności i zmniejszenie rozmiaru przesyłanych danych;
- W module wprowadzono kilka nowych możliwości:
- Klasa dla tablic asocjacyjnych, w których dla powiązanych z kluczami danych jawnie określa się informacje o typie („TypedDict(‘Point2D’, x=int, y=int, label=str)”).
- Typ , umożliwiający ograniczenie parametru lub wartości zwracanej do kilku zdefiniowanych wartości („Literal[‘connected’, ‘disconnected’]”).
- Konstrukcja „„, dająca możliwość określenia wartości zmiennych, funkcji, metod i klas, które nie mogą być zmieniane ani przypisane na nowo („pi: Final[float] = 3.1415926536”).
- Dodano możliwość przypisania pamięci podręcznej dla skompilowanych plików z bajtkodem, przechowywanych w osobnym drzewie systemu plików i oddzielonych od katalogów z kodem. Ścieżka do zapisywania plików z bajtkodem jest określana za pomocą zmiennej lub opcji „-X pycache_prefix”;
- możliwość tworzenia pułapek debugowania Pythona, które używają identycznego ABI do wersji produkcyjnej, co pozwala na ładowanie w pułapkach debugowania rozszerzeń napisanych w C, skompilowanych dla stabilnych wydań;
- W f-stringach (literały formatowane z prefiksem 'f') wprowadzono wsparcie dla operatora '=' (na przykład 'f'{expr=}''), umożliwiającego konwersję wyrażenia na tekst w celu uproszczenia debugowania. Na przykład:
››› user = 'eric_idle'
››› member_since = date(1975, 7, 31)
››› f'{user=} {member_since=}'
«user='eric_idle' member_since=datetime.date(1975, 7, 31)» - Wyrażenie «» można używać wewnątrz bloku ;
- Dodano nowy moduł , umożliwiającym korzystanie z segmentów współdzielonej pamięci w konfiguracjach wieloprocesowych;
- Na platformie Windows implementacja asyncio została przekształcona na użycie klasy ;
- Wydajność instrukcji LOAD_GLOBAL zwiększyła się o około 40% dzięki zastosowaniu nowego mechanizmu cache’owania kodu obiektowego.
Źródło: opennet.ru
