Egy év fejlesztés után jelentős programozási nyelv kiadás . A Python 3.9 lett az első kiadás a projekt után kiadások előkészítésére és támogatására. Az új jelentős kiadások mostantól évente fognak megjelenni, míg a javító frissítések kétévente. Minden jelentős ágat másfél évig támogatunk, amelyet további három és fél évig fognak a biztonsági hibák kijavításának érdekében karbantartani.
A munka az új ágon mostantól öt hónappal a következő ág kiadása előtt kezdődik, vagyis egyszerre a Python 3.9-es kiadással alpha tesztelés a Python 3.10 ágban. A Python 3.10 ág hét hónapig lesz alpha kiadási állapotban, amely idő alatt új funkciók kerülnek hozzáadásra és hibák javítása történik. Ezt követően három hónapig bétatesztelés zajlik, amely idő alatt új funkciók hozzáadása tilos, és a figyelem kizárólag a hibák javítására összpontosít. A kiadás előtti utolsó két hónapban az ág a kiadási jelöltek állapotában lesz, ahol a végső stabilizálást végzik.
a Python 3.9-ben:
- A beépített dict osztály segítségével definiált szótárakban támogatást kaptak a «|» egyesítő és a «|=» frissítő operátorok, amelyek kiegészítik a {**d1, **d2} és a dict.update metódusokat, amelyek korábban a szótárak egyesítésére javasoltak.
>>> 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’} - A beépített típuskészlet tartalmazza a list, dict és tuple típusokat, amelyeket alapvető típusokként lehet használni anélkül, hogy importálnánk a typing modulból. Azaz a typing.List, typing.Dict és typing.Tuple helyett most megadható
egyszerűen list, dict és tuple:def greet_all(names: list[str]) -> None:
for name in names:
print(«Hello», name) - rugalmas eszközök a függvények és változók annotálásához. Az annotációk hozzárendelésére a typing modulhoz új Annotated típus került hozzáadásra, amely kiterjeszti a meglévő típusokat további metaadatokkal, amelyeket statikus elemzéshez vagy futási optimalizáláshoz lehet használni. A kódon belüli metaadatok eléréséhez a typing.get_type_hints() metódushoz új paraméter, az include_extras került bevezetésre.
charType = Annotated[int, ctype(«char»)]
UnsignedShort = Annotated[int, struct2.ctype('H')] - A dekorátorok grammatikai követelményei - bármely kifejezés, amely megfelel az if és while blokkok használatának, most már dekorátorként is felhasználható. A változtatás jelentősen javította a PyQt5 kód olvashatóságát és egyszerűsítette a modul karbantartását:
Régebben:
button_0 = buttons[0]
@button_0.clicked.connectMost már így lehet írni:
@buttons[0].clicked.connect - A standard könyvtárban modul , amely tartalmazza az IANA időzónainformációit.
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Nyári időszámítás
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo('America/Los_Angeles'))
>>> print(dt)
2020-10-31 12:00:00-07:00>>> dt.tzname()
'PDT'>>> # Standard idő
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00>>> print(dt.tzname())
PST - Új graphlib modul került bevezetésre, amelyben támogatás a gráfok topológiai rendezéséhez.
- új módszerek a prefixek és suffixek eltávolítására — str.removeprefix(prefix) és str.removesuffix(suffix). A módszerek a str, bytes, bytearray és collections.UserString objektumokhoz lettek hozzáadva.
>>> s = 'FooBar'
>>> s.removeprefix('Foo')
'Bar' - új parser (Parsing Expression Grammar), amely felváltotta az parser használatát. Az új parser alkalmazása lehetővé tette néhány 'hack' eltávolítását, amelyeket az LL(1) korlátozások kijátszására használtak, és jelentősen csökkentette a parser karbantartásához szükséges munka mennyiségét. Teljesítmény szempontjából az új parser körülbelül azonos szinten van a korábbival, de jelentősen megelőzi azt a rugalmasság terén, amely lehetővé teszi, hogy szabadabban érezzük magunkat az új nyelvi funkciók tervezésekor. A régi parser kódja egyelőre megmaradt, és visszaállítható a '-X oldparser' kapcsolóval vagy a 'PYTHONOLDPARSER=1' környezeti változóval, de a 3.10-es kiadásban el fog kerülni.
- a C-kiterjesztések módszerei hozzáférhetnek ahhoz az állapothoz, amelyben definiálva vannak, közvetlen pointerdereferálás segítségével, ahelyett, hogy a PyState_FindModule funkcióval keresnék meg a modul állapotát. A változtatás javítja a C modulok teljesítményét azáltal, hogy csökkenti vagy teljesen kizárja a modul állapotának ellenőrzésével járó költségeket. A modul és annak állapotának társítására C-funkciót, a PyType_FromModuleAndSpec()-t, a modul és az állapotának lekérdezésére a PyType_GetModule() és a PyType_GetModuleState() funkciókat, míg a módszer osztályhoz való hozzáférésének biztosítására C-funkciót és METH_METHOD flaget kínál.
- A szemétgyűjtő a gyűjtések blokkolásából, amelyek újraélesztett objektumokat tartalmaznak, amelyek a végrehajtó elindítása után kívülről is elérhetők.
- Hozzáadva a módszert , lehetővé téve a Linux kernel 'pidfd' alrendszerének használatát a PID (pidfd egy specifikus folyamathoz kapcsolódik és nem változik, míg a PID egy másik folyamathoz köthető a folyamat befejezése után) újrahasználatának kezelésére.
- A Unicode specifikáció támogatása frissítve lett a 13.0.0 verzióra.
- a a Python interpreter újrainitializálása során ugyanabban a folyamatban.
- A beépített tipikus range, tuple, set, frozenset, list és dict teljesítményoptimalizálását elvégezték, a C nyelven írt objektumokhoz való gyorsabb hozzáférés érdekében a Vectorcall gyors hívás protokoll alkalmazásával.
- A _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time és _weakref modulok több szakaszos inicializálással lett átállítva a betöltésre. .
- Az audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios és zlib standard könyvtári modulok átálltak egy korlátozott , amely megoldja a különböző Python verziókhoz készült bővítmény modulok működési problémáját (az új verzióra való frissítéskor nem szükséges az bővítmény modulokat újraépíteni, és a 3.9-re épített modulok működni fognak a 3.10-es ágban).
- Az asyncio modulban a biztonsági problémák miatt megszűnt a reuse_address paraméter támogatása (Linux alatt az SO_REUSEADDR használata UDP esetén lehetővé teszi, hogy különböző folyamatok hallgató socketeket kapcsoljanak UDP porthoz).
- Új optimalizálások kerültek bevezetésre, például a jelek kezelése teljesítményének javítása több szálas alkalmazásokban, a subprocess modul sebességének növelése FreeBSD környezetben, valamint a változók közötti időátadás (a 'for y in [expr]' kifejezésben való változóhozzárendelés most már a 'y = expr' kifejezés teljesítményével vetekszik). Összességében a legtöbb teszt teljesítménycsökkenést mutat a 3.8-as ághoz képest (gyorsulás csak a write_local és write_deque tesztekben figyelhető meg):
Python verzió 3.4 3.5 3.6 3.7 3.8 3.9
————— — — — — — —Változó- és attribútum olvasási hozzáférés:
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
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
read_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
read_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9Változók és attribútumok írási hozzáférés:
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
write_classvar 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.7Adatstruktúrák olvasási hozzáférése:
read_list 24.2 24.5 20.8 20.8 19.0 21.1
read_deque 24.7 25.5 20.2 20.6 19.8 21.6
read_dict 24.3 25.7 22.3 23.0 21.0 22.5
read_strdict 22.6 24.3 19.5 21.2 18.9 21.6Adatstruktúrák írási hozzáférése:
write_list 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.8Verem (vagy sor) műveletek:
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.5Időzítés ciklus:
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3 - sok Python 2.7-es funkció és metódus, amelyeket korábban elavultnak jelöltek és a korábbi kiadás figyelmeztetést adott, beleértve az unescape() metódust a html.parser.HTMLParser-ben,
tostring() és fromstring() az array.array-ban, isAlive() a threading.Thread-ben, getchildren() és getiterator() az ElementTree-ban, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() és base64.decodestring.
Forrás: opennet.ru
