Po roce vývoje významné vydání programovacího jazyka . Python 3.9 se stal prvním vydáním po projektu na přípravy a podpory verzí. Nové významné verze nyní budou vytvářeny jednou ročně a opravy budou vydávány každé dva měsíce. Každá významná větev bude podporována po dobu jeden a půl roku, po kterém bude po dobu dalších tří a půl let poskytováno opravy pro odstranění zranitelností.
Práce na nové větvi nyní začíná pět měsíců před vydáním další větve, tj. současně s vydáním Python 3.9 alfa-testování větve Python 3.10. Větev Python 3.10 bude v alfa-vydáních po dobu sedmi měsíců, během kterých budou přidávány nové funkce a prováděny opravy chyb. Poté během tří měsíců proběhne beta-testování, během kterého bude přidávání nových funkcí zakázáno a veškerá pozornost bude věnována opravám chyb. Poslední dva měsíce před uvolněním bude větev v kandidátní verzi, kde proběhne konečná stabilizace.
v Python 3.9:
- Ve slovech definovaných pomocí vestavěné třídy dict, podpora operátorů sloučení „|“ a aktualizace „|=“, které doplňují metody {**d1, **d2} a dict.update, které byly dříve navrženy pro spojování slovníků.
>>> 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’} - Mezi vestavěné sbírky typů patří list, dict a tuple, které lze používat jako základní typy bez importu z modulu typing. Tj. místo typing.List, typing.Dict a typing.Tuple je nyní možné uvádět
prostě list, dict a tuple:def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name) - flexibilní prostředky pro anotaci funkcí a proměnných. Pro připojení anotací byl do modulu typing přidán nový typ Annotated, který rozšiřuje stávající typy o další metadata, která mohou být použita při statické analýze nebo pro optimalizace během běhu. Pro přístup k metadatům z kódu byla do metody typing.get_type_hints() přidána volba include_extras.
charType = Annotated[int, ctype("char")]
UnsignedShort = Annotated[int, struct2.ctype('H')] - gramatické požadavky na dekorátory — jakýkoli výraz vhodný pro použití v blocích if a while lze nyní použít jako dekorátor. Tato změna výrazně zlepšila čitelnost kódu PyQt5 a zjednodušila údržbu tohoto modulu:
Bylo:
button_0 = buttons[0]
@button_0.clicked.connectNyní je možné psát:
@buttons[0].clicked.connect - Do standardní knihovny modul , zahrnující informace z databáze časových pásem IANA.
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Letní čas
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo('America/Los_Angeles'))
>>> print(dt)
2020-10-31 12:00:00-07:00>>> dt.tzname()
'PDT'>>> # Standardní čas
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00>>> print(dt.tzname())
PST - Byl přidán modul graphlib, který obsahuje podporu topologického třídění grafů.
- nové metody pro odstraňování prefixů a postfixů řetězců — str.removeprefix(prefix) a str.removesuffix(suffix). Metody byly přidány do objektů str, bytes, bytearray a collections.UserString.
>>> s = 'FooBar'
>>> s.removeprefix('Foo')
'Bar' - nový parser (Parsing Expression Grammar), který nahradil parser Použití nového parseru umožnilo zbavit se některých 'hacků', které byly používány k obcházení omezení v LL(1), a výrazně snížilo náklady na údržbu parseru. Z hlediska výkonu je nový parser přibližně na stejné úrovni jako minulý, ale výrazně ho předčí co do flexibility, což umožňuje větší volnost při navrhování nových funkcionalit jazyka. Kód starého parseru je prozatím uchován a může být obnoven pomocí příznaku '-X oldparser' nebo proměnné prostředí 'PYTHONOLDPARSER=1', ale bude odstraněn ve verzi 3.10.
- možnost přístupu metod C-rozšíření k stavu modulů, v nichž jsou definovány, pomocí přímého dereference ukazatelů místo vyhledávání stavu modulu pomocí funkce PyState_FindModule. Změna umožňuje zvýšení výkonu modulů psaných v C snížením nebo úplným vyloučením režijních nákladů na kontrolu stavu modulu. Pro asociaci modulu s třídou byla navržena C-funkce PyType_FromModuleAndSpec(), pro získání modulu a jeho stavu C-funkce PyType_GetModule() a PyType_GetModuleState(), a pro poskytnutí přístupu metodě ke třídě, ve které je definována, existuje C-funkce PyCMethod a příznak METH_METHOD.
- Sběrač odpadu od blokování kolekcí zahrnujících znovu aktivované objekty, které zůstávají přístupné zvenčí po spuštění finalizátoru.
- Byla přidána metoda , což umožňuje využít subsystém jádra Linux „pidfd“ pro řešení situace s opětovným použitím PID (pidfd je svázán s konkrétním procesem a nemění se, zatímco PID může být přiřazen jinému procesu po dokončení aktuálního procesu přidruženého k tomuto PID).
- Podpora specifikace Unicode byla aktualizována na verzi 13.0.0.
- Odstraněna při opětovné inicializaci interpretátoru Python v jednom procesu.
- Byla provedena optimalizace výkonu vestavěných typů range, tuple, set, frozenset, list a dict, díky aplikaci protokolu rychlého volání Vectorcall pro rychlejší přístup k objektům napsaným v jazyce C.
- Moduly _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time a _weakref byly převezeny na načítání s .
- Moduly standardní knihovny audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios a zlib byly převedeny na používání omezeného , který řeší problém funkčnosti sestavení modulů rozšíření pro různé verze Pythonu (při aktualizaci verze není třeba znovu sestavovat moduly rozšíření a moduly sestavené pro 3.9 budou fungovat v větvi 3.10).
- V modulu asyncio byla z důvodu potenciálních bezpečnostních problémů ukončena podpora parametru reuse_address (použití SO_REUSEADDR pro UDP v Linuxu umožňuje různým procesům připojit naslouchající sokety k UDP portu).
- Byly přidány nové optimalizace, například byla zvýšena výkonnost obslužných rutin signálů v vícero procesních aplikacích, zvýšena rychlost modulu subprocess v prostředí FreeBSD a urychleno přiřazení dočasných proměnných (přiřazení proměnné ve výrazu „for y in [expr]“ nyní neustupuje rychlostí expresi „y = expr“). Celkově většina testů snižuje výkon ve srovnání s větví 3.8 (zrychlení je pozorováno pouze v testech write_local a write_deque):
Verze Python 3.4 3.5 3.6 3.7 3.8 3.9
————— — — — — — —Přístup k proměnným a atributům:
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
číst_classvar_z_class 25.6 26.5 20.7 19.5 18.4 18.6
číst_classvar_z_instance 22.8 23.5 18.8 17.1 16.4 20.1
číst_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
číst_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
číst_namedtuple 73.8 57.5 45.0 46.8 18.4 23.2
číst_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9Přístup k proměnným a atributům pro zápis:
zapsat_local 8.7 9.3 5.5 5.3 4.3 4.2
zapsat_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9
zapsat_global 19.7 21.2 18.0 18.0 15.8 17.2
zapsat_classvar 92.9 96.0 104.6 102.1 39.2 43.2
zapsat_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
zapsat_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7Přístup k datovým strukturám:
číst_list 24.2 24.5 20.8 20.8 19.0 21.1
číst_deque 24.7 25.5 20.2 20.6 19.8 21.6
číst_dict 24.3 25.7 22.3 23.0 21.0 22.5
číst_strdict 22.6 24.3 19.5 21.2 18.9 21.6Přístup k zápisu do datových struktur:
zapsat_list 27.1 28.5 22.5 21.6 20.0 21.6
zapsat_deque 28.7 30.1 22.7 21.8 23.5 23.2
zapsat_dict 31.4 33.3 29.3 29.2 24.7 27.8
zapsat_strdict 28.4 29.9 27.5 25.2 23.1 29.8Operace se zásobníky (nebo frontami):
list_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Časování smyčky:
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3 - mnoho funkcí a metod Pythonu 2.7, které byly dříve označeny jako zastaralé a v minulém vydání vyvolávaly varování DeprecationWarning, včetně metody unescape() v html.parser.HTMLParser,
tostring() a fromstring() v array.array, isAlive() v threading.Thread, getchildren() a getiterator() v ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() a base64.decodestring().
Zdroj: opennet.ru
