Efter et års udvikling betydelig udgave af programmeringssproget . Python 3.9 blev den første udgave efter projektet om af forberedelse og vedligeholdelse af udgivelser. Betydelige udgivelser vil nu blive skabt én gang om året, mens korrigerende opdateringer vil blive frigivet hver anden måned. Hver væsentlig gren vil blive supporteret i halvandet år, hvorefter der i yderligere tre et halvt år vil blive skabt reparationer for at fjerne sårbarheder.
Arbejdet med en ny gren begynder nu fem måneder før udgivelsen af den næste gren, dvs. samtidig med udgivelsen af Python 3.9 alfa-testning af Python 3.10. Grenen Python 3.10 vil være i alfa-udgivelsesstadium i syv måneder, i løbet af hvilke nye funktioner vil blive tilføjet og fejl vil blive rettet. Derefter vil beta-testning finde sted i tre måneder, hvor tillægning af nye funktioner vil være forbudt, og al opmærksomhed vil blive rettet mod reparation af fejl. De sidste to måneder før udgivelsen vil grenen være i udgivelseskandidatstadiet, hvor den endelige stabilisering vil finde sted.
i Python 3.9:
- I ordbøger defineret ved hjælp af den indbyggede klasse dict, understøttelse af sammenslægningsoperatører «|» og opdateringsoperatører «|=», der supplerer metoderne {**d1, **d2} og dict.update, der tidligere blev foreslået til at kombinere ordbøger.
>>> 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"} - Den indbyggede typesamling inkluderer list, dict og tuple, som kan bruges som grundlæggende typer uden at importere fra typing-modulet. Dvs. i stedet for typing.List, typing.Dict og typing.Tuple kan man nu blot angive
list, dict og tuple:def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name) - fleksible værktøjer til annotering af funktioner og variabler. For at vedhæfte annotationer er der tilføjet en ny type Annotated i typing-modulet, der udvider eksisterende typer med yderligere metadata, som kan bruges ved statisk analyse eller til optimering under udførelse. For at få adgang til metadata fra koden er der tilføjet en parameter include_extras til metoden typing.get_type_hints().
charType = Annotated[int, ctype("char")]
UnsignedShort = Annotated[int, struct2.ctype(‘H’)] - dekoratorers grammatiske krav — enhver udtryk, der er egnet til brug i if- og while-blokke, kan nu bruges som dekorator. Ændringen har mærkbart forbedret læsbarheden af koden i PyQt5 og gjort vedligeholdelsen af dette modul lettere:
Tidligere:
button_0 = buttons[0]
@button_0.clicked.connectNu kan man skrive:
@buttons[0].clicked.connect - I standardbiblioteket modul , der inkluderer oplysninger fra IANA tidszone databasen.
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Sommer tid
>>> 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 tid
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00>>> print(dt.tzname())
PST - Modulet graphlib er tilføjet, som understøtter topologisk sortering af grafer.
- nye metoder til at fjerne præfikser og suffikser fra strenge — str.removeprefix(prefix) og str.removesuffix(suffix). Metoderne er tilføjet til objekterne str, bytes, bytearray og collections.UserString.
>>> s = «FooBar»
>>> s.removeprefix(«Foo»)
‘Bar’ - en ny parser (Parsing Expression Grammar), som er kommet i stedet for parseren . Anvendelsen af den nye parser har gjort det muligt at slippe af med nogle „hacks“, der blev brugt til at omgå begrænsningerne i LL(1), og har betydeligt reduceret vedligeholdelsesomkostningerne for parseren. I forhold til ydeevne ligger den nye parser omtrent på samme niveau som den tidligere, men overgår den betydeligt med hensyn til fleksibilitet, hvilket giver større frihed i designet af nye sprogfunktioner. Koden fra den gamle parser er fortsat gemt og kan aktiveres ved hjælp af flaget „-X oldparser“ eller miljøvariablen „PYTHONOLDPARSER=1“, men vil blive fjernet i version 3.10.
- muligheden for, at C-udvidelsers metoder kan få adgang til tilstanden af de moduler, hvori de er defineret, ved at anvende direkte dereferering af pointere i stedet for at finde modulens tilstand ved hjælp af funktionen PyState_FindModule. Ændringen muliggør en forbedring af ydeevnen for C-moduler ved at reducere eller helt fjerne overheadomkostningerne til at kontrollere modulens tilstand. For at associere et modul med en klasse foreslås C-funktionen PyType_FromModuleAndSpec(), for at hente modulet og dets tilstand C-funktionerne PyType_GetModule() og PyType_GetModuleState(), og for at give metoden adgang til klassen, hvori den er defineret, C-funktionen PyCMethod og flaget METH_METHOD.
- Skridtet til affaldsopsamleren fra blokeringen af samlinger, der indeholder reanimerede objekter, som forbliver tilgængelige udefra efter aktivationen af finalizeren.
- En metode er tilføjet , hvilket gør det muligt at bruge Linux-kernens "pidfd"-subsystem til at håndtere situationer med genbrug af PID (pidfd knytter sig til en specifik proces og ændres ikke, mens PID kan knyttes til en anden proces efter afslutningen af den nuværende proces, der er associeret med denne PID).
- Understøttelsen af Unicode-specifikationen er opdateret til version 13.0.0.
- , som gør det muligt at omgå beskyttelsen ved geninitialisering af Python-fortolkeren i én proces.
- Der er gennemført ydeevneoptimering for de indbyggede typer range, tuple, set, frozenset, list og dict, ved at anvende Vektorkald-protokollen til hurtigere adgang til objekter skrevet i C.
- Modulerne _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time og _weakref er blevet omkodet til at indlæses med .
- Standardbibliotekmodulerne audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios og zlib er blevet omkodet til at bruge en begrænset , som løser problemet med funktionaliteten ved at samle extensionsmoduler til forskellige versioner af Python (ved opgradering er det ikke nødvendigt at genkompilere extensionsmoduler, og moduler, der er bygget til 3.9, vil kunne arbejde i 3.10-grenen).
- I asyncio-modulet er understøttelsen af parameteren reuse_address ophævet på grund af potentielle sikkerhedsproblemer (brugen af SO_REUSEADDR for UDP i Linux tillader forskellige processer at knytte lytte-sockets til UDP-porten).
- Der er tilføjet nye optimeringer, f.eks. er ydeevnen for signalbehandlere i flertrådede applikationer forbedret, hastigheden for subprocess-modulet i FreeBSD-miljøet er øget, og tildelingen af midlertidige variable er blevet accelereret (tildelingen af en variabel i udtrykket "for y in [expr]" giver nu en ydeevne svarende til udtrykket "y = expr"). Generelt viser flertallet af testene et fald i ydeevnen sammenlignet med 3.8-grenen (accelerationen ses kun i write_local og write_deque-testene):
Python version 3.4 3.5 3.6 3.7 3.8 3.9
————— — — — — — —Variabel- og attributlæsning:
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.9Skriveadgang til variabler og attributter:
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.7Skriveadgang til datastrukturer:
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.6Skriveadgang til datastrukturer:
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.8Stak (eller kø) operationer:
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.5Timing loop:
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3 - mange funktioner og metoder i Python 2.7, som tidligere blev markeret som forældede og som i den tidligere version førte til en advarsel om DeprecationWarning, herunder metoden unescape() i html.parser.HTMLParser,
tostring() og fromstring() i array.array, isAlive() i threading.Thread, getchildren() og getiterator() i ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() og base64.decodestring.
Kilde: opennet.ru
