Vad är nytt i Python 3.11¶
- Redigerare:
Pablo Galindo Salgado
I den här artikeln förklaras de nya funktionerna i Python 3.11 jämfört med 3.10. Python 3.11 släpptes den 24 oktober 2022. För fullständig information, se changelog.
Sammanfattning – Release highlights¶
Python 3.11 är mellan 10-60% fsnabbare än Python 3.10. I genomsnitt uppmätte vi en 1,25x snabbare hastighet på standard benchmark svit. Se Snabbare CPython för detaljer.
Nya syntaxfunktioner:
Nya inbyggda funktioner:
Nya standardmoduler för bibliotek:
Förbättringar av tolkar:
Ny kommandoradsoption
-P
och miljövariabelPYTHONSAFEPATH
för att inaktivera automatisk prependling av potentiellt osäkra sökvägar tillsys.path
Nya funktioner för skrivning:
Viktiga avskrivningar, borttagningar och begränsningar:
PEP 594: Många äldre standardbiblioteksmoduler har utrangerats och kommer att tas bort i Python 3.13
PEP 670: Makron konverterade till statiska inline-funktioner
Nya funktioner¶
PEP 657: Finkorniga felplaceringar i spårningar¶
Vid utskrift av spårningar kommer tolken nu att peka på det exakta uttryck som orsakade felet, istället för bara raden. Till exempel
Traceback (senaste anropet senast):
Fil "distance.py", rad 11, i <module>
print(manhattan_distance(p1, p2))
^^^^^^^^^^^^^^^^^^^^^^^^^^
Fil "distance.py", rad 6, i manhattan_distance
return abs(punkt_1.x - punkt_2.x) + abs(punkt_1.y - punkt_2.y)
^^^^^^^^^
AttributeError: Objektet 'NoneType' har inget attribut 'x'
Tidigare versioner av tolken pekade bara på raden, vilket gjorde det tvetydigt vilket objekt som var None
. Dessa förbättrade fel kan också vara till hjälp när man har att göra med djupt nästlade dict
-objekt och flera funktionsanrop:
Traceback (senaste anropet senast):
Fil "query.py", rad 37, i <module>
magic_aritmetic('foo')
Fil "query.py", rad 18, i magic_arithmetic
returnera add_counts(x) / 25
^^^^^^^^^^^^^
Fil "query.py", rad 24, i add_counts
return 25 + query_user(user1) + query_user(user2)
^^^^^^^^^^^^^^^^^
Fil "query.py", rad 32, i query_user
return 1 + query_count(db, svar['a']['b']['c']['user'], retry=True)
~~~~~~~~~~~~~~~~~~^^^^^
TypeError: Objektet 'NoneType' är inte subskriberbart
Samt komplexa aritmetiska uttryck:
Traceback (senaste anropet senast):
Fil "calculation.py", rad 54, i <module>
resultat = (x / y / z) * (a / b / c)
~~~~~~^~~
ZeroDivisionError: division med noll
Dessutom görs den information som används av den förbättrade spårningsfunktionen tillgänglig via ett allmänt API, som kan användas för att korrelera bytecode instructions med källkodens plats. Denna information kan hämtas med hjälp av:
Metoden
codeobject.co_positions()
i Python.Funktionen
PyCode_Addr2Location()
i C API.
Se PEP 657 för mer information. (Bidrag från Pablo Galindo, Batuhan Taskaya och Ammar Askar i bpo-43950.)
Anteckning
Denna funktion kräver lagring av kolumnpositioner i Kodobjekt, vilket kan resultera i en liten ökning av minnesanvändningen i tolken och diskanvändningen för kompilerade Python-filer. För att undvika att lagra den extra informationen och avaktivera utskrift av extra spårningsinformation, använd kommandoradsalternativet -X no_debug_ranges
eller miljövariabeln PYTHONNODEBUGRANGES
.
PEP 654: Undantagsgrupper och except*
¶
PEP 654 introducerar språkfunktioner som gör det möjligt för ett program att skapa och hantera flera orelaterade undantag samtidigt. De inbyggda typerna ExceptionGroup
och BaseExceptionGroup
gör det möjligt att gruppera undantag och aktivera dem tillsammans, och den nya syntaxen except*
generaliserar except
så att den passar undergrupper av undantagsgrupper.
Se PEP 654 för mer information.
(Bidrag från Irit Katriel i bpo-45292. PEP skriven av Irit Katriel, Yury Selivanov och Guido van Rossum.)
PEP 678: Undantag kan kompletteras med anteckningar¶
Metoden add_note()
har lagts till i BaseException
. Den kan användas för att berika undantag med kontextinformation som inte är tillgänglig vid den tidpunkt då undantaget uppstår. De tillagda anteckningarna visas i standardspårningen.
Se PEP 678 för mer information.
(Bidrag från Irit Katriel i bpo-45607. PEP skriven av Zac Hatfield-Dodds.)
Förbättringar av startprogrammet py.exe
i Windows¶
Den kopia av Pythons installationshanterare som ingår i Python 3.11 har uppdaterats avsevärt. Den stöder nu företags-/taggsyntax enligt definitionen i PEP 514 och använder argumentet -V:<company>/<tag>
istället för det begränsade -<major>.<minor>
. Detta gör det möjligt att starta andra distributioner än PythonCore
, den som finns på python.org.
När du använder -V:
-väljare kan antingen företag eller tagg utelämnas, men alla installationer kommer att sökas. Till exempel kommer -V:OtherPython/
att välja den ”bästa” taggen som är registrerad för OtherPython
, medan -V:3.11
eller -V:/3.11
kommer att välja den ”bästa” distributionen med taggen 3.11
.
När du använder de äldre argumenten -<major>
, -<major>.<minor>
, -<major>-<bitness>
eller -<major>.<minor>-<bitness>
, bör allt befintligt beteende bevaras från tidigare versioner, och endast utgåvor från PythonCore
kommer att väljas. Suffixet -64
innebär dock nu ”inte 32-bitars” (inte nödvändigtvis x86-64), eftersom det finns flera 64-bitars plattformar som stöds. 32-bitars körtider upptäcks genom att kontrollera om körtidens tagg innehåller suffixet -32
. Alla utgåvor av Python sedan 3.5 har inkluderat detta i sina 32-bitarsbyggen.
Andra språkliga förändringar¶
Stjärnmärkta uppackningsuttryck kan nu användas i
for
-satser. (Se bpo-46725 för mer information)Asynkrona förståelser är nu tillåtna inom förståelser i asynkrona funktioner. Yttre förståelser blir implicit asynkrona i det här fallet. (Bidrag från Serhiy Storchaka i bpo-33346.)
Ett
TypeError
tas nu upp istället för ettAttributeError
iwith
-satser ochcontextlib.ExitStack.enter_context()
för objekt som inte stöder protokollet context manager, och iasync with
-satser ochcontextlib.AsyncExitStack.enter_async_context()
för objekt som inte stöder protokollet asynchronous context manager. (Bidrag från Serhiy Storchaka i bpo-12022 och bpo-44471.)Lagt till
object.__getstate__()
, som ger standardimplementeringen av metoden__getstate__()
.copy
ing ochpickle
ing av instanser av underklasser av inbyggda typerbytearray
,set
,frozenset
,collections.OrderedDict
,collections.deque
,weakref.WeakSet
, ochdatetime.tzinfo
nu kopior och pickles av instansattribut implementerade som slots. Denna ändring har en oavsiktlig bieffekt: Den ställer till det för en liten minoritet av befintliga Python-projekt som inte förväntar sig attobject.__getstate__()
ska existera. Se de senare kommentarerna till gh-70766 för diskussioner om vilka lösningar sådan kod kan behöva. (Bidrag från Serhiy Storchaka i bpo-26579.)
Lade till ett kommandoradsalternativ
-P
och en miljövariabelPYTHONSAFEPATH
, som inaktiverar det automatiska tillägget tillsys.path
av skriptets katalog när ett skript körs, eller den aktuella katalogen när-c
och-m
används. Detta säkerställer att endast stdlib och installerade moduler hämtas avimport
och undviker oavsiktlig eller illvillig skuggning av moduler med dem i en lokal (och vanligtvis användbar) katalog. (Bidrag från Victor Stinner i gh-57684.)Ett
"z"
-alternativ lades till i Formatspecifikation Mini-språk som omvandlar negativa till positiva nollor efter avrundning till formatets precision. Se PEP 682 för mer information. (Bidrag från John Belmonte i gh-90153.)Bytes accepteras inte längre på
sys.path
. Stödet upphörde någon gång mellan Python 3.2 och 3.6, utan att någon märkte det förrän efter att Python 3.10.0 släpptes. Dessutom skulle det vara problematiskt att återinföra stöd på grund av interaktioner mellan-b
ochsys.path_importer_cache
när det finns en blandning avstr
ochbytes
nycklar. (Bidrag från Thomas Grainger i gh-91181.)
Andra ändringar i implementeringen av CPython¶
Specialmetoderna
__complex__()
förcomplex
och__bytes__()
förbytes
är implementerade för att stödja protokollentyping.SupportsComplex
ochtyping.SupportsBytes
. (Bidrag från Mark Dickinson och Donghee Na i bpo-24234.)siphash13
har lagts till som en ny intern hashingalgoritm. Den har liknande säkerhetsegenskaper somsiphash24
, men den är något snabbare för långa inmatningar.str
,bytes
, och några andra typer använder den nu som standardalgoritm förhash()
. PEP 552 hash-baserade .pyc-filer använder nusiphash13
också. (Bidrag från Inada Naoki i bpo-29410.)När ett aktivt undantag återaktiveras med en
raise
-sats utan parametrar, är nu spårningen som är kopplad till detta undantag alltidsys.exc_info()[1].__traceback__
. Detta innebär att ändringar som görs i spårningen i den aktuellaexcept
-satsen återspeglas i det återaktiverade undantaget. (Bidrag från Irit Katriel i bpo-45711.)Tolkstatens representation av hanterade undantag (aka
exc_info
eller_PyErr_StackItem
) har nu bara fältetexc_value
;exc_type
ochexc_traceback
har tagits bort, eftersom de kan härledas frånexc_value
. (Bidrag från Irit Katriel i bpo-45711.)Ett nytt kommandoradsalternativ,
AppendPath
, har lagts till för Windows-installationsprogrammet. Det fungerar på samma sätt somPrependPath
, men lägger till install- och skriptkatalogerna istället för att lägga till dem först. (Bidrag från Bastian Neuburger i bpo-44934.)Fältet
PyConfig.module_search_paths_set
måste nu vara inställt på1
för att initieringen ska användaPyConfig.module_search_paths
för att initierasys.path
. Annars kommer initieringen att räkna om sökvägen och ersätta alla värden som lagts till imodule_search_paths
.Utdata från alternativet
--help
ryms nu på 50 rader/80 kolumner. Information om Python-miljövariabler och-X
-alternativ finns nu tillgänglig med respektive--help-env
och--help-xoptions
-flaggor, och med det nya--help-all
. (Bidrag från Éric Araujo i bpo-46142.)Konvertering mellan
int
ochstr
i andra baser än 2 (binär), 4, 8 (oktal), 16 (hexadecimal) eller 32 såsom bas 10 (decimal) ger nu upphov till ettValueError
om antalet siffror i strängform är över en gräns för att undvika potentiella överbelastningsattacker på grund av den algoritmiska komplexiteten. Detta är en begränsning av CVE 2020-10735. Den här gränsen kan konfigureras eller inaktiveras med hjälp av en miljövariabel, kommandoradsflagga ellersys
API:er. Se dokumentationen Längdsbegränsning för konvertering av heltalssträngar. Standardgränsen är 4300 siffror i strängform.
Nya moduler¶
Förbättrade moduler¶
asyncio¶
Lade till
TaskGroup
-klassen, en asynkron kontexthanterare som håller en grupp uppgifter som väntar på dem alla vid avslut. För ny kod rekommenderas detta framför att användacreate_task()
ochgather()
direkt. (Bidrag från Yury Selivanov och andra i gh-90908.)Lagt till
timeout()
, en asynkron kontexthanterare för att ställa in en timeout för asynkrona operationer. För ny kod rekommenderas detta framför att användawait_for()
direkt. (Bidrag från Andrew Svetlov i gh-90927.)Lagt till klassen
Runner
, som exponerar maskineriet som används avrun()
. (Bidrag från Andrew Svetlov i gh-91218.)Lade till klassen
Barrier
till synkroniseringsprimitiven i asynciobiblioteket, och det relaterade undantagetBrokenBarrierError
. (Bidrag från Yves Duprat och Andrew Svetlov i gh-87518.)Lade till nyckelordsargumentet all_errors till
asyncio.loop.create_connection()
så att flera anslutningsfel kan tas upp som enExceptionGroup
.Lagt till
asyncio.StreamWriter.start_tls()
-metoden för att uppgradera befintliga strömbaserade anslutningar till TLS. (Bidrag från Ian Good i bpo-34975.)Lagt till raw datagram socket funktioner till eventloopen:
sock_sendto()
,sock_recvfrom()
ochsock_recvfrom_into()
. Dessa har implementeringar iSelectorEventLoop
ochProactorEventLoop
. (Bidrag från Alex Grönholm i bpo-46805.)Lagt till
cancelling()
ochuncancel()
metoder tillTask
. Dessa är främst avsedda för intern användning, särskilt avTaskGroup
.
contextlib¶
dataklasser¶
datatid¶
Lägg till
datetime.UTC
, ett bekvämt alias fördatetime.timezone.utc
. (Bidrag från Kabir Kwatra i gh-91973.)datetime.date.fromisoformat()
,datetime.time.fromisoformat()
ochdatetime.datetime.fromisoformat()
kan nu användas för att tolka de flesta ISO 8601-format (utom de som stöder bråkdelar av timmar och minuter). (Bidrag från Paul Ganssle i gh-80010.)
enum¶
Bytte namn på
EnumMeta
tillEnumType
(EnumMeta
behölls som ett alias).Lagt till
StrEnum
, med medlemmar som kan användas som (och måste vara) strängar.Lade till
ReprEnum
, som endast modifierar__repr__()
av medlemmar medan den returnerar deras bokstavliga värden (snarare än namn) för__str__()
och__format__()
(används avstr()
,format()
och f-strings).Ändrat
Enum.__format__()
(standard förformat()
,str.format()
och f-strings) så att det alltid ger samma resultat somEnum.__str__()
: för enumer som ärver frånReprEnum
kommer det att vara medlemmens värde; för alla andra enumer kommer det att vara enum- och medlemsnamnet (t.ex.Color.RED
).En ny klass-parameter boundary har lagts till i enum
Flag
och enumFlagBoundary
med dess alternativ, för att styra hur flaggvärden utanför intervallet ska hanteras.Lade till
verify()
enum-dekoratorn ochEnumCheck
enum med dess alternativ, för att kontrollera enumklasser mot flera specifika begränsningar.Lade till dekoratorerna
member()
ochnonmember()
för att säkerställa att det dekorerade objektet konverteras/inte konverteras till en enum-medlem.Lade till
property()
dekoratorn, som fungerar somproperty()
förutom för enum. Använd denna istället förtypes.DynamicClassAttribute()
.Lade till enumdekoratorn
global_enum()
, som justerar__repr__()
och__str__()
så att värden visas som medlemmar i deras modul i stället för i enumklassen. Till exempel're.ASCII'
förASCII
-medlemmen ire.RegexFlag
i stället för'RegexFlag.ASCII'
.Förbättrade
Flag
för att stödjalen()
, iteration ochin
/not in
på dess medlemmar. Till exempel fungerar följande nu:len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)
Ändrade
Enum
ochFlag
så att medlemmar nu definieras innan__init_subclass__()
anropas;dir()
inkluderar nu metoder etc. från mixade datatyper.Ändrad
Flag
för att endast betrakta primära värden (potens av två) som kanoniska medan sammansatta värden (3
,6
,10
, etc.) betraktas som alias; inverterade flaggor tvingas till sin positiva motsvarighet.
fcntl¶
På FreeBSD stöds flaggorna
F_DUP2FD
respektiveF_DUP2FD_CLOEXEC
, den förra motsvarardup2
-användning medan den senare dessutom sätter flagganFD_CLOEXEC
.
fraktioner¶
functools¶
functools.singledispatch()
stöder nutypes.UnionType
ochtyping.Union
som annotationer till dispatch-argumentet.:>>> from functools import singledispatch >>> @singledispatch ... def fun(arg, verbose=False): ... if verbose: ... print("Let me just say,", end=" ") ... print(arg) ... >>> @fun.register ... def _(arg: int | float, verbose=False): ... if verbose: ... print("Strength in numbers, eh?", end=" ") ... print(arg) ... >>> from typing import Union >>> @fun.register ... def _(arg: Union[list, set], verbose=False): ... if verbose: ... print("Enumerate this:") ... for i, elem in enumerate(arg): ... print(i, elem) ...
(Bidrag från Yurii Karabas i bpo-46014.)
gzip¶
Funktionen
gzip.compress()
är nu snabbare när den används med argumentet mtime=0 eftersom den delegerar komprimeringen helt till en endazlib.compress()
-operation. Det finns en bieffekt av denna förändring: Filhuvudet för gzip innehåller en ”OS”-byte i sitt huvud. Den sattes traditionellt alltid till ett värde av 255 som representerar ”unknown” av modulengzip
. Nu, när du användercompress()
med mtime=0, kan det sättas till ett annat värde av det underliggande zlib C-biblioteket som Python länkades mot. (Se gh-112346 för detaljer om bieffekten)
hashlib¶
hashlib.blake2b()
ochhashlib.blake2s()
föredrar nu libb2 framför Pythons vendored copy. (Bidrag från Christian Heimes i bpo-47095.)Den interna modulen
_sha3
med SHA3- och SHAKE-algoritmer använder nu tiny_sha3 i stället för Keccak Code Package för att minska storleken på kod och binärfiler. Modulenhashlib
föredrar optimerade SHA3- och SHAKE-implementeringar från OpenSSL. Ändringen påverkar endast installationer utan OpenSSL-stöd. (Bidrag från Christian Heimes i bpo-47098.)Lägg till
hashlib.file_digest()
, en hjälpfunktion för effektiv hashing av filer eller filliknande objekt. (Bidrag från Christian Heimes i gh-89313.)
IDLE och idlelib¶
inspektera¶
Lägg till
getmembers_static()
för att returnera alla medlemmar utan att utlösa dynamisk uppslagning via descriptor-protokollet. (Bidrag från Weipeng Hong i bpo-30533.)Lägg till
ismethodwrapper()
för att kontrollera om typen av ett objekt är enMethodWrapperType
. (Bidrag från Hakan Çelik i bpo-29418.)Ändra de ramrelaterade funktionerna i modulen
inspect
så att de returnerar nyaFrameInfo
- ochTraceback
-klassinstanser (bakåtkompatibla med de tidigare named tuple-liknande gränssnitten) som innehåller den utökade PEP 657-positionsinformationen (slutradnummer, kolumn och slutkolumn). De funktioner som påverkas är:(Bidrag från Pablo Galindo i gh-88116.)
lokal¶
Lägg till
locale.getencoding()
för att hämta den aktuella locale-kodningen. Det liknarlocale.getpreferredencoding(False)
men ignorerar Python UTF-8 Mode.
loggning¶
Lade till
getLevelNamesMapping()
för att returnera en mappning från namn på loggningsnivåer (t.ex.'CRITICAL'
) till värdena för motsvarande Loggningsnivåer (t.ex.50
, som standard). (Bidrag från Andrei Kulakovin i gh-88024.)Lagt till en
createSocket()
-metod tillSysLogHandler
för att matchaSocketHandler.createSocket()
. Den anropas automatiskt under initialiseringen av handlaren och när en händelse skickas ut, om det inte finns någon aktiv socket. (Bidrag från Kirill Pinchuk i gh-88457.)
matematik¶
Lägg till
math.exp2()
: returnera 2 upphöjt till x. (Bidrag från Gideon Mitchell i bpo-45917.)Lägg till
math.cbrt()
: returnera kubikroten av x. (Bidrag från Ajith Ramachandran i bpo-44357.)Beteendet för två
math.pow()
-hörnfall har ändrats för att överensstämma med IEEE 754-specifikationen. Operationernamath.pow(0.0, -math.inf)
ochmath.pow(-0.0, -math.inf)
returnerar nuinf
. Tidigare gav deValueError
. (Bidrag från Mark Dickinson i bpo-44339.)Värdet
math.nan
är nu alltid tillgängligt. (Bidrag från Victor Stinner i bpo-46917.)
operator¶
En ny funktion
operator.call
har lagts till, så attoperator.call(obj, *args, **kwargs) == obj(*args, **kwargs)
. (Bidrag från Antony Lee i bpo-44019.)
os¶
På Windows använder
os.urandom()
nuBCryptGenRandom()
, istället förCryptGenRandom()
som är föråldrad. (Bidrag från Donghee Na i bpo-44611.)
sökväg¶
re¶
Atomgruppering (
(?>...)
) och possessiva kvantifierare (*+
,++
,?+
,{m,n}+
) stöds nu i reguljära uttryck. (Bidrag från Jeffrey C. Jacobs och Serhiy Storchaka i bpo-433030.)
shutil¶
Lägg till valfri parameter dir_fd i
shutil.rmtree()
. (Bidrag från Serhiy Storchaka i bpo-46245.)
kortplats¶
Lägg till stöd för CAN Socket för NetBSD. (Bidrag från Thomas Klausner i bpo-30512.)
create_connection()
har ett alternativ för att, i händelse av misslyckad anslutning, skapa enExceptionGroup
som innehåller alla fel istället för att bara skapa det sista felet. (Bidrag från Irit Katriel i bpo-29980.)
sqlite3¶
Du kan nu inaktivera authorizer genom att skicka
None
tillset_authorizer()
. (Bidrag från Erlend E. Aasland i bpo-44491.)Samlingsnamnet
create_collation()
kan nu innehålla alla Unicode-tecken. Samlingsnamn med ogiltiga tecken ger nu upphov tillUnicodeEncodeError
istället försqlite3.ProgrammingError
. (Bidrag från Erlend E. Aasland i bpo-44688.)sqlite3
undantag inkluderar nu SQLites utökade felkod somsqlite_errorcode
och SQLites felnamn somsqlite_errorname
. (Bidrag från Aviv Palivoda, Daniel Shahaf och Erlend E. Aasland i bpo-16379 och bpo-24139.)Lägg till
setlimit()
ochgetlimit()
tillsqlite3.Connection
för att ställa in och hämta SQLite-gränser per anslutning. (Bidrag från Erlend E. Aasland i bpo-45243.)sqlite3
ställer nu insqlite3.threadsafety
baserat på det standardiserade trådningsläget som det underliggande SQLite-biblioteket har kompilerats med. (Bidrag från Erlend E. Aasland i bpo-45613.)sqlite3
C-anrop använder nu unraisable undantag om callback-tracebacks är aktiverade. Användare kan nu registrera enunraisable hook handler
för att förbättra sin felsökningsupplevelse. (Bidrag från Erlend E. Aasland i bpo-45828.)Fetch across rollback ger inte längre upphov till
InterfaceError
. Istället överlåter vi till SQLite-biblioteket att hantera dessa fall. (Bidrag från Erlend E. Aasland i bpo-44092.)Lägg till
serialize()
ochdeserialize()
tillsqlite3.Connection
för serialisering och deserialisering av databaser. (Bidrag från Erlend E. Aasland i bpo-41930.)Lägg till
create_window_function()
tillsqlite3.Connection
för att skapa aggregerade fönsterfunktioner. (Bidrag från Erlend E. Aasland i bpo-34916.)Lägg till
blobopen()
tillsqlite3.Connection
.sqlite3.Blob
tillåter inkrementella I/O-operationer på blobbar. (Bidrag från Aviv Palivoda och Erlend E. Aasland i bpo-24905.)
sträng¶
Lägg till
get_identifiers()
ochis_valid()
tillstring.Template
, som returnerar alla giltiga platshållare respektive om några ogiltiga platshållare finns. (Bidrag från Ben Kehoe i gh-90465.)
system¶
sys.exc_info()
härleder nu fältentype
ochtraceback
frånvalue
(undantagsinstansen), så när ett undantag ändras medan det hanteras, återspeglas ändringarna i resultaten av efterföljande anrop tillexc_info()
. (Bidrag från Irit Katriel i bpo-45711.)Lägg till
sys.exception()
som returnerar den aktiva undantagsinstansen (motsvarandesys.exc_info()[1]
). (Bidrag från Irit Katriel i bpo-46328.)Lägg till flaggan
sys.flags.safe_path
. (Bidrag från Victor Stinner i gh-57684.)
sysconfig¶
Tre nya installationsscheman (posix_venv, nt_venv och venv) har lagts till och används när Python skapar nya virtuella miljöer eller när den körs från en virtuell miljö. De två första schemana (posix_venv och nt_venv) är OS-specifika för icke-Windows och Windows, venv är i huvudsak ett alias till ett av dem beroende på vilket OS Python körs på. Detta är användbart för nedströmsdistributörer som ändrar
sysconfig.get_preferred_scheme()
. Tredjepartskod som skapar nya virtuella miljöer bör använda det nya venv-installationsschemat för att bestämma sökvägarna, precis somvenv
. (Bidrag från Miro Hrončok i bpo-45413.)
tempfil¶
SpooledTemporaryFile
-objekt implementerar nu fullt ut metoderna iio.BufferedIOBase
ellerio.TextIOBase
(beroende på filläge). Detta gör att de fungerar korrekt med API:er som förväntar sig filliknande objekt, t.ex. komprimeringsmoduler. (Bidrag från Carey Metcalfe i gh-70363.)
gängning¶
På Unix, om funktionen
sem_clockwait()
finns tillgänglig i C-biblioteket (glibc 2.30 och senare), använder nu metodenthreading.Lock.acquire()
den monotona klockan (time.CLOCK_MONOTONIC
) för timeout, istället för att använda systemklockan (time.CLOCK_REALTIME
), för att inte påverkas av ändringar i systemklockan. (Bidrag från Victor Stinner i bpo-41710.)
tid¶
På Unix använder
time.sleep()
nu funktionenclock_nanosleep()
ellernanosleep()
, om den finns tillgänglig, som har en upplösning på 1 nanosekund (10-9 sekunder), i stället för att användaselect()
som har en upplösning på 1 mikrosekund (10-6 sekunder). (Bidrag från Benjamin Szőke och Victor Stinner i bpo-21302.)I Windows 8.1 och senare använder
time.sleep()
nu en väntande timer baserad på högupplösta timers som har en upplösning på 100 nanosekunder (10-7 sekunder). Tidigare hade den en upplösning på 1 millisekund (10-3 sekunder). (Bidrag från Benjamin Szőke, Donghee Na, Eryk Sun och Victor Stinner i bpo-21302 och bpo-45429.)
tkinter¶
Lagt till metoden
info_patchlevel()
som returnerar den exakta versionen av Tcl-biblioteket som en namngiven tupel liknandesys.version_info
. (Bidrag från Serhiy Storchaka i gh-91827.)
spårning¶
Lägg till
traceback.StackSummary.format_frame_summary()
för att tillåta användare att åsidosätta vilka ramar som visas i traceback, och hur de formateras. (Bidrag från Ammar Askar i bpo-44569.)Lägg till
traceback.TracebackException.print()
, som skriver ut den formateradeTracebackException
-instansen till en fil. (Bidrag från Irit Katriel i bpo-33809.)
typing¶
För större ändringar, se Nya funktioner relaterade till typtips.
Lägg till
typing.assert_never()
ochtyping.Never
.typing.assert_never()
är användbart för att be en typkontroll att bekräfta att en kodrad inte är nåbar. Vid körning ger det upphov till ettAssertionError
. (Bidrag från Jelle Zijlstra i gh-90633.)Lägg till
typing.reveal_type()
. Detta är användbart för att fråga en typkontrollant vilken typ den har härlett för ett givet uttryck. Vid körning skriver den ut typen för det mottagna värdet. (Bidrag från Jelle Zijlstra i gh-90572.)Lägg till
typing.assert_type()
. Detta är användbart för att be en typkontrollör att bekräfta att den typ som den har härlett för ett visst uttryck matchar den angivna typen. Vid körning returnerar den helt enkelt det mottagna värdet. (Bidrag från Jelle Zijlstra i gh-90638.)typing.TypedDict
-typer kan nu vara generiska. (Bidrag från Samodya Abeysiriwardane i gh-89026.)NamedTuple
-typer kan nu vara generiska. (Bidrag från Serhiy Storchaka i bpo-43923.)Tillåt subklassning av
typing.Any
. Detta är användbart för att undvika typkontrollfel relaterade till mycket dynamiska klasser, t.ex. mocks. (Bidrag från Shantanu Jain i gh-91154.)Dekoratorn
typing.final()
sätter nu attributet__final__
på det dekorerade objektet. (Bidrag från Jelle Zijlstra i gh-90500.)Funktionen
typing.get_overloads()
kan användas för att introspektera överbelastningar av en funktion.typing.clear_overloads()
kan användas för att rensa alla registrerade överbelastningar av en funktion. (Bidrag från Jelle Zijlstra i gh-89263.)Metoden
__init__()
förProtocol
-underklasser bevaras nu. (Bidrag från Adrian Garcia Badarasco i gh-88970.)Representationen av tomma tupeltyper (
Tuple[()]
) har förenklats. Detta påverkar introspektion, t.ex.get_args(Tuple[()])
utvärderas nu till()
istället för((),)
. (Bidrag från Serhiy Storchaka i gh-91137.)Lättar på körtidskraven för typannoteringar genom att ta bort den anropbara kontrollen i den privata funktionen
typing._type_check
. (Bidrag från Gregory Beauregard i gh-90802.)typing.get_type_hints()
stöder nu utvärdering av strängar som framåtriktade referenser i PEP 585 generiska alias. (Bidrag från Niklas Rosenstein i gh-85542.)typing.get_type_hints()
lägger inte längre tillOptional
till parametrar medNone
som standard. (Bidrag från Nikita Sobolev i gh-90353.)typing.get_type_hints()
stöder nu utvärdering av nakna strängadeClassVar
-annoteringar. (Bidrag från Gregory Beauregard i gh-90711.)typing.no_type_check()
modifierar inte längre externa klasser och funktioner. Den markerar nu också korrekt att klassmetoder inte ska typkontrolleras. (Bidrag från Nikita Sobolev i gh-90729.)
unicodedata¶
Unicode-databasen har uppdaterats till version 14.0.0. (Bidrag från Benjamin Peterson i bpo-45190).
unittest¶
Lagt till metoderna
enterContext()
ochenterClassContext()
för klassenTestCase
, metodenenterAsyncContext()
för klassenIsolatedAsyncioTestCase
och funktionenunittest.enterModuleContext()
. (Bidrag från Serhiy Storchaka i bpo-45046.)
ven¶
När nya virtuella Python-miljöer skapas används venv sysconfig-installationsschemat för att bestämma sökvägarna i miljön. När Python körs i en virtuell miljö är samma installationsschema standard. Det innebär att nedströmsdistributörer kan ändra standardinstallationsschemat för sysconfig utan att ändra beteendet i virtuella miljöer. Tredjepartskod som också skapar nya virtuella miljöer bör göra detsamma. (Bidrag från Miro Hrončok i bpo-45413.)
varningar¶
warnings.catch_warnings()
accepterar nu argument förwarnings.simplefilter()
, vilket ger ett mer koncist sätt att lokalt ignorera varningar eller konvertera dem till fel. (Bidrag från Zac Hatfield-Dodds i bpo-47074.)
zip-fil¶
Lagt till stöd för att ange kodning av medlemsnamn för läsning av metadata i en
ZipFile
katalog och filhuvuden. (Bidrag från Stephen J. Turnbull och Serhiy Storchaka i bpo-28080.)Lagt till
ZipFile.mkdir()
för att skapa nya kataloger inuti ZIP-arkiv. (Bidrag från Sam Ezeh i gh-49083.)Lade till
stem
,suffix
ochsuffixes
tillzipfile.Path
. (Bidrag från Miguel Brito i gh-88261.)
Optimeringar¶
Detta avsnitt behandlar specifika optimeringar oberoende av Snabbare CPython-projektet, som behandlas i ett eget avsnitt.
Kompilatorn optimerar nu enkel printf-style % formatting på strängliteraler som endast innehåller formatkoderna
%s
,%r
och%a
och gör det lika snabbt som ett motsvarande f-string -uttryck. (Bidrag från Serhiy Storchaka i bpo-28307.)Integer division (
//
) är bättre anpassad för optimering av kompilatorer. Det är nu runt 20% faster på x86-64 när man delar enint
med ett värde som är mindre än2**30
. (Bidrag från Gregory P. Smith och Tim Peters i gh-90564.)sum()
är nu nästan 30% faster för heltal mindre än2**30
. (Bidrag från Stefan Behnel i gh-68264.)Att ändra storlek på listor är strömlinjeformat för vanliga fall, vilket påskyndar
list.append()
med ≈15% aoch enkla list comprehension med upp till 20-30% (Bidrag från Dennis Sweeney i gh-91165.)Dictionaries lagrar inte hash-värden när alla nycklar är Unicode-objekt, vilket minskar
dict
-storleken. Till exempel minskassys.getsizeof(dict.fromkeys("abcdefg"))
från 352 byte till 272 byte (23% smaller) på 64-bitars plattformar. (Bidrag från Inada Naoki i bpo-46845.)Att använda
asyncio.DatagramProtocol
är nu flera storleksordningar snabbare vid överföring av stora filer över UDP, med hastigheter över 100 gånger högre för en fil på ≈60 MiB. (Bidrag från msoxzw i gh-91487.)math
-funktionernacomb()
ochperm()
är nu ≈10 gånger snabbare för stora argument (med en större ökning för större k). (Bidrag från Serhiy Storchaka i bpo-37295.)Funktionerna
statistics
mean()
,variance()
ochstdev()
använder nu iteratorer i ett svep i stället för att först konvertera dem till enlist
. Detta är dubbelt så snabbt och kan spara mycket minne. (Bidrag från Raymond Hettinger i gh-90415.)unicodedata.normalize()
normaliserar nu rena ASCII-strängar i konstant tid. (Bidrag från Donghee Na i bpo-44987.)
Snabbare CPython¶
CPython 3.11 är i genomsnitt 25% faster snabbare än CPython 3.10 mätt med pyperformance benchmark suite, när det kompileras med GCC på Ubuntu Linux. Beroende på din arbetsbelastning kan den totala hastighetsökningen vara 10-60%.
Det här projektet fokuserar på två stora områden i Python: Snabbare uppstart och Snabbare körtid. Optimeringar som inte täcks av detta projekt listas separat under Optimeringar.
Snabbare uppstart¶
Fryst import / Statiska kodobjekt¶
Python cachelagrar bytecode i __pycache__ katalogen för att påskynda laddning av moduler.
Tidigare i 3.10 såg exekveringen av Python-moduler ut så här:
Läs __pycache__ -> Unmarshal -> Heap-allokerat kodobjekt -> Utvärdera
I Python 3.11 är de kärnmoduler som är nödvändiga för Python-start ”frysta”. Detta innebär att deras Kodobjekt (och bytekoder) allokeras statiskt av tolken. Detta reducerar stegen i modulens exekveringsprocess till:
Statiskt allokerat kodobjekt -> Utvärdera
Interpreterstart är nu 10-15% faster i Python 3.11. Detta har stor inverkan på kortlivade program som använder Python.
(Bidrag från Eric Snow, Guido van Rossum och Kumar Aditya i många utgåvor)
Snabbare körtid¶
Billigare, latare Python-ramar¶
Python-ramar, som innehåller exekveringsinformation, skapas varje gång Python anropar en Python-funktion. Följande är nya optimeringar av ramar:
Effektiviserad process för att skapa ramar.
Undviker minnesallokering genom att generöst återanvända ramutrymme på C-stacken.
Effektiviserat den interna ramstrukturen till att endast innehålla väsentlig information. Frames innehöll tidigare extra felsöknings- och minneshanteringsinformation.
Den gamla stilen frame objects skapas nu endast på begäran av debuggar eller av Pythons introspektionsfunktioner som sys._getframe()
och inspect.currentframe()
. För de flesta användarkoder skapas inga frame-objekt alls. Som ett resultat av detta har nästan alla anrop av Python-funktioner blivit betydligt snabbare. Vi uppmätte en 3-7% speedup i pyperformance.
(Bidrag från Mark Shannon i bpo-44590.)
Anrop av Python-funktioner¶
Under ett Python-funktionsanrop kommer Python att anropa en utvärderande C-funktion för att tolka den funktionens kod. Detta begränsar effektivt ren Python-rekursion till vad som är säkert för C-stacken.
I 3.11, när CPython upptäcker att Python-kod anropar en annan Python-funktion, skapar CPython en ny ram och ”hoppar” till den nya koden i den nya ramen. På så sätt undviker man att anropa C-tolkningsfunktionen helt och hållet.
De flesta Python-funktionsanrop förbrukar nu inget C-stackutrymme, vilket snabbar upp dem. I enkla rekursiva funktioner som fibonacci eller factorial observerade vi en 1,7-faldig hastighet. Detta innebär också att rekursiva funktioner kan rekursera betydligt djupare (om användaren ökar rekursionsgränsen med sys.setrecursionlimit()
). Vi uppmätte en 1-3% im förbättring av pyperformance.
(Bidrag från Pablo Galindo och Mark Shannon i bpo-45256.)
PEP 659: Specialisering av adaptiv tolk¶
PEP 659 är en av de viktigaste delarna i Faster CPython-projektet. Den allmänna idén är att även om Python är ett dynamiskt språk, har de flesta koder regioner där objekt och typer sällan ändras. Detta koncept är känt som typstabilitet.
Vid körning försöker Python leta efter vanliga mönster och typstabilitet i den exekverande koden. Python ersätter sedan den aktuella operationen med en mer specialiserad. Denna specialiserade operation använder snabba vägar som endast är tillgängliga för dessa användningsfall/typer, som i allmänhet överträffar sina generiska motsvarigheter. Detta medför också ett annat koncept som kallas inline caching, där Python cachelagrar resultaten av dyra operationer direkt i bytecode.
Specialiseraren kombinerar också vissa vanliga instruktionspar till en superinstruktion, vilket minskar overheaden under exekveringen.
Python kommer bara att specialisera sig när det ser kod som är ”het” (exekveras flera gånger). Detta förhindrar att Python slösar tid på kod som bara körs en gång. Python kan också avspecialisera när koden är för dynamisk eller när användningen ändras. Specialiseringsförsök görs med jämna mellanrum och specialiseringsförsöken är inte alltför dyra, vilket gör att specialiseringen kan anpassas till nya omständigheter.
(PEP skriven av Mark Shannon, med idéer inspirerade av Stefan Brunthaler. Se PEP 659 för mer information. Implementering av Mark Shannon och Brandt Bucher, med ytterligare hjälp från Irit Katriel och Dennis Sweeney)
Operation |
Formulär |
Specialisering |
Snabbare drift (upp till) |
Medverkande(n) |
---|---|---|---|---|
Binära operationer |
|
Binär addition, multiplikation och subtraktion för vanliga typer som |
10% |
Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney |
Nedsänkt |
|
Subscripterande containertyper som Subscripting custom |
10-25% |
Irit Katriel, Mark Shannon |
Lagra index |
|
På samma sätt som för specialisering av subskription ovan. |
10-25% |
Dennis Sweeney |
Calls |
|
Anrop till vanliga inbyggda (C) funktioner och typer som |
20% |
Mark Shannon, Ken Jin |
Ladda global variabel |
|
Objektets index i namnrymdens globals/builtins är cachat. Inläsning av globaler och builtins kräver inga namnrymdsuppslagningar. |
Mark Shannon |
|
Ladda attribut |
|
På samma sätt som vid laddning av globala variabler. Attributets index i klassens/objektets namnrymd cachelagras. I de flesta fall kräver attributladdning inga namnrymdsuppslagningar. |
Mark Shannon |
|
Ladda metoder för anrop |
|
Den faktiska adressen till metoden cachelagras. Metodladdning har nu inga namnrymdsuppslagningar - inte ens för klasser med långa arvskedjor. |
10-20% |
Ken Jin, Mark Shannon |
Butikens attribut |
|
Liknar optimering av lastattribut. |
2% in pyperformance |
Mark Shannon |
Sekvens för uppackning |
|
Specialiserad för vanliga behållare som |
8% |
Brandt Bucher |
Övrigt¶
Objekt kräver nu mindre minne tack vare att namnrymder för objekt skapas på ett lättsamt sätt. Deras namnrymdsordböcker delar nu också nycklar mer fritt. (Bidrag från Mark Shannon i bpo-45340 och bpo-40116.)
”Zero-cost”-undantag implementeras, vilket eliminerar kostnaden för
try
-satser när inget undantag uppstår. (Bidrag från Mark Shannon i bpo-40222.)En mer kortfattad representation av undantag i tolken minskade den tid som krävs för att fånga ett undantag med cirka 10%. (Bidrag från Irit Katriel i bpo-45711.)
re
:s matchningsmotor för reguljära uttryck har delvis omarbetats och använder nu beräknade gotos (eller ”trådad kod”) på plattformar som stöds. Som ett resultat exekverar Python 3.11 pyperformance regular expression benchmarks upp till 10% faster än Python 3.10. (Bidrag från Brandt Bucher i gh-91404.)
FAQ¶
Hur ska jag skriva min kod för att utnyttja dessa hastighetsökningar?¶
Skriv Pythonic-kod som följer vanliga bästa praxis; du behöver inte ändra din kod. Faster CPython-projektet optimerar för vanliga kodmönster som vi observerar.
Kommer CPython 3.11 att använda mer minne?¶
Kanske inte; vi förväntar oss inte att minnesanvändningen kommer att överstiga 20% hig mer än 3.10. Detta kompenseras av minnesoptimeringar för ramobjekt och objektordböcker som nämnts ovan.
Jag ser inte några hastighetsökningar i min arbetsbelastning. Varför inte?¶
Viss kod kommer inte att ha märkbara fördelar. Om din kod tillbringar större delen av sin tid på I/O-operationer eller redan gör större delen av sin beräkning i ett C-tilläggsbibliotek som NumPy, kommer det inte att finnas några betydande hastigheter. Detta projekt gynnar för närvarande rena Python-arbetsbelastningar mest.
Siffrorna för pyperformance är dessutom ett geometriskt medelvärde. Även inom pyperformance-riktmärkena har vissa riktmärken saktat ned något, medan andra har snabbats upp med nästan 2x!
Finns det en JIT-kompilator?¶
Nej, vi undersöker fortfarande andra optimeringar.
Om¶
Faster CPython utforskar optimeringar för CPython. Huvudteamet finansieras av Microsoft för att arbeta med detta på heltid. Pablo Galindo Salgado är också finansierad av Bloomberg LP för att arbeta med projektet på deltid. Slutligen är många bidragsgivare frivilliga från gemenskapen.
CPython bytecode-ändringar¶
Bytekoden innehåller nu inline-cacheposter i form av de nytillkomna instruktionerna CACHE
. Många opkoder förväntar sig att följas av ett exakt antal cacher och instruerar tolken att hoppa över dem vid körning. Fyllda cacher kan se ut som godtyckliga instruktioner, så stor försiktighet bör iakttas när man läser eller modifierar rå, adaptiv bytecode som innehåller quickened-data.
Nya opkoder¶
ASYNC_GEN_WRAP
,RETURN_GENERATOR
ochSEND
, används i generatorer och co-rutiner.COPY_FREE_VARS
, vilket gör att det inte behövs någon speciell kod på anropssidan för closures.JUMP_BACKWARD_NO_INTERRUPT
, för användning i vissa loopar där hantering av avbrott inte är önskvärt.MAKE_CELL
, för att skapa Cellobjekt.CHECK_EG_MATCH
ochPREP_RERAISE_STAR
, för att hantera nya undantagsgrupper och except* ` som lagts till i PEP 654.PUSH_EXC_INFO
, för användning i undantagshanterare.RESUME
, en no-op, för intern spårning, felsökning och optimeringskontroller.
Ersatta opkoder¶
Ersatt Opcode(s) |
Ny(a) operationskod(er) |
Anteckningar |
---|---|---|
BINARY_* INPLACE_* |
Ersatte alla numeriska binära/in-place-operationskoder med en enda operationskod |
|
CALL_FUNCTION CALL_FUNCTION_KW CALL_METHOD |
Kopplar bort argumentväxling för metoder från hantering av nyckelordsargument; möjliggör bättre specialisering av anrop |
|
DUP_TOP DUP_TOP_TWO ROT_TWO ROT_THREE ROT_FOUR ROT_N |
Instruktioner för manipulering av stapeln |
|
JUMP_IF_NOT_EXC_MATCH |
Utför nu kontroll men hoppar inte |
|
JUMP_ABSOLUTE` POP_JUMP_IF_FALSE POP_JUMP_IF_TRUE |
Se [3]; varianterna |
|
SETUP_WITH SETUP_ASYNC_WITH |
|
|
Alla opkoder för hopp är nu relativa, inklusive de befintliga JUMP_IF_TRUE_OR_POP
och JUMP_IF_FALSE_OR_POP
. Argumentet är nu en offset från den aktuella instruktionen snarare än en absolut plats.
Ändrade/ borttagna opkoder¶
Ändrad
MATCH_CLASS
ochMATCH_KEYS
för att inte längre skicka ett ytterligare booleskt värde för att indikera framgång/misslyckande. Istället skickasNone
vid misslyckande i stället för tupeln av extraherade värden.Ändrade opkoder som arbetar med undantag för att återspegla att de nu representeras som ett objekt på stacken istället för tre (se gh-89874).
Tog bort
COPY_DICT_WITHOUT_KEYS
,GEN_START
,POP_BLOCK
,SETUP_FINALLY
ochYIELD_FROM
.
Föråldrat¶
I detta avsnitt listas Python API:er som har utgått i Python 3.11.
Föråldrade C API:er är listade separat.
Språk/Builtins¶
Chaining
classmethod
descriptors (introducerad i bpo-19072) är nu avförd. Den kan inte längre användas för att omsluta andra deskriptorer såsomproperty
. Grunddesignen för denna funktion var bristfällig och orsakade ett antal problem i efterhand. För att ”pass-through” enclassmethod
, överväg att använda attributet__wrapped__
som lades till i Python 3.10. (Bidrag från Raymond Hettinger i gh-89519.)Oktala escapes i sträng- och byteslitteraler med värden större än
0o377
(255 i decimal) ger nu enDeprecationWarning
. I en framtida Python-version kommer de att ge upphov till enSyntaxWarning
och så småningom enSyntaxError
. (Bidrag från Serhiy Storchaka i gh-81548.)Delegeringen av
int()
till__trunc__()
är nu föråldrad. Anrop avint(a)
närtype(a)
implementerar__trunc__()
men inte__int__()
eller__index__()
ger nu upphov till enDeprecationWarning
. (Bidrag från Zackery Spytz i bpo-44977.)
Moduler¶
PEP 594 ledde till att följande moduler togs bort i Python 3.13:
aifc
chunk
msilib
pipes
telnetlib
audioop
crypt
nis
sndhdr
uu
cgi
imghdr
nntplib
spwd
xdrlib
cgitb
mailcap
ossaudiodev
sunau
(Bidrag från Brett Cannon i bpo-47061 och Victor Stinner i gh-68966.)
Modulerna
asynchat
,asyncore
ochsmtpd
har varit föråldrade sedan åtminstone Python 3.6. Deras dokumentation och varningar om utfasning har nu uppdaterats för att notera att de kommer att tas bort i Python 3.12. (Bidrag från Hugo van Kemenade i bpo-47022.)Paketet
lib2to3
och verktyget2to3
är nu föråldrade och kanske inte kan parsa Python 3.10 eller nyare. Se PEP 617, som introducerar den nya PEG-parsern, för mer information. (Bidrag från Victor Stinner i bpo-40360.)De odokumenterade modulerna
sre_compile
,sre_constants
ochsre_parse
är nu föråldrade. (Bidrag från Serhiy Storchaka i bpo-47152.)
Standardbibliotek¶
Följande har utgått i
configparser
sedan Python 3.2. Deras varningar om utfasning har nu uppdaterats för att notera att de kommer att tas bort i Python 3.12:klassen
configparser.SafeConfigParser
egenskapen
configparser.ParsingError.filename
configparser.RawConfigParser.readfp()
-metoden
(Bidrag från Hugo van Kemenade i bpo-45173.)
configparser.LegacyInterpolation
har varit utfasad i dokumentationen sedan Python 3.2, och är inte listad iconfigparser
dokumentationen. Den avger nu enDeprecationWarning
och kommer att tas bort i Python 3.13. Användconfigparser.BasicInterpolation
ellerconfigparser.ExtendedInterpolation
istället. (Bidrag från Hugo van Kemenade i bpo-46607.)Den äldre uppsättningen
importlib.resources
-funktioner utrangerades till förmån för de ersättningar som lades till i Python 3.9 och kommer att tas bort i en framtida Python-version, på grund av att de inte stöder resurser som finns i paketunderkataloger:importlib.resources.contents()
importlib.resources.is_resource()
importlib.resources.open_binary()
importlib.resources.open_text()
importlib.resources.read_binary()
importlib.resources.read_text()
importlib.resources.path()
Funktionen
locale.getdefaultlocale()
är föråldrad och kommer att tas bort i Python 3.15. Använd istället funktionernalocale.setlocale()
,locale.getpreferredencoding(False)
ochlocale.getlocale()
. (Bidrag från Victor Stinner i gh-90817.)Funktionen
locale.resetlocale()
är föråldrad och kommer att tas bort i Python 3.13. Användlocale.setlocale(locale.LC_ALL, "")
istället. (Bidrag från Victor Stinner i gh-90817.)Strängare regler kommer nu att tillämpas för numeriska gruppreferenser och gruppnamn i regular expressions. Endast sekvenser av ASCII-siffror accepteras nu som en numerisk referens, och gruppnamnet i
bytes
-mönster och ersättningssträngar får endast innehålla ASCII-bokstäver, siffror och understreck. För närvarande utfärdas en varning för syntax som bryter mot dessa regler. (Bidrag från Serhiy Storchaka i gh-91760.)I modulen
re
är funktionenre.template()
och motsvarande flaggorre.TEMPLATE
ochre.T
avförda, eftersom de var odokumenterade och saknade ett uppenbart syfte. De kommer att tas bort i Python 3.13. (Bidrag från Serhiy Storchaka och Miro Hrončok i gh-92728.)turtle.settiltangle()
har varit föråldrad sedan Python 3.1; den avger nu en föråldringsvarning och kommer att tas bort i Python 3.13. Användturtle.tiltangle()
istället (det var tidigare felaktigt markerat som föråldrat, och dess docstring är nu korrigerad). (Bidrag från Hugo van Kemenade i bpo-45837.)typing.Text
, som existerar enbart för att ge kompatibilitetsstöd mellan Python 2 och Python 3-kod, är nu föråldrad. Dess borttagning är för närvarande inte planerad, men användare uppmuntras att användastr
istället när det är möjligt. (Bidrag från Alex Waygood i gh-92332.)Syntaxen för nyckelordsargument för konstruktion av
typing.TypedDict
-typer är nu föråldrad. Stödet kommer att tas bort i Python 3.13. (Bidrag från Jingchen Ye i gh-90224.)webbrowser.MacOSX
är föråldrad och kommer att tas bort i Python 3.13. Den är otestad, odokumenterad och används inte avwebbrowser
själv. (Bidrag från Donghee Na i bpo-42255.)Beteendet att returnera ett värde från testmetoderna
TestCase
ochIsolatedAsyncioTestCase
(annat än standardvärdetNone
) är nu föråldrat.Följande icke-formellt dokumenterade
unittest
-funktioner har utgått och kommer att tas bort i Python 3.13:unittest.findTestCases()
unittest.makeSuite()
unittest.getTestCaseNames()
Använd istället
TestLoader
-metoder:(Bidrag från Erlend E. Aasland i bpo-5846.)
unittest.TestProgram.usageExit()
är markerad som föråldrad och kommer att tas bort i 3.13. (Bidrag från Carlos Damázio i gh-67048.)
Väntar på borttagning i Python 3.12¶
Följande Python API:er har utgått i tidigare Python-utgåvor och kommer att tas bort i Python 3.12.
C API:er som väntar på att tas bort är listade separat.
Modulen
asynchat
Modulen
asyncore
Paketet entire distutils
Modulen
imp
Namnrymden
typing.io
Namnrymden
typing.re
cgi.log()
importlib.find_loader()
importlib.abc.Loader.module_repr()
importlib.abc.MetaPathFinder.find_module()
importlib.abc.PathEntryFinder.find_loader()
importlib.abc.PathEntryFinder.find_module()
importlib.machinery.BuiltinImporter.find_module()
importlib.machinery.BuiltinLoader.module_repr()
importlib.machinery.FileFinder.find_loader()
importlib.machinery.FileFinder.find_module()
importlib.machinery.FrozenImporter.find_module()
importlib.machinery.FrozenLoader.module_repr()
importlib.machinery.PathFinder.find_module()
importlib.machinery.WindowsRegistryFinder.find_module()
importlib.util.module_for_loader()
importlib.util.set_loader_wrapper()
importlib.util.set_package_wrapper()
pkgutil.ImpImporter
pkgutil.ImpLoader
pathlib.Path.link_to()
sqlite3.enable_shared_cache()
sqlite3.OptimizedUnicode()
PYTHONTHREADDEBUG
miljövariabelFöljande föråldrade alias i
unittest
:Föråldrat alias
Metod Namn
Avskrivna i
failUnless
3.1
failIf
3.1
failUnlessEqual
3.1
failIfEqual
3.1
”misslyckas utan undantag nästan lika
3.1
failIfAlmostEqual
3.1
failUnlessRaises
3.1
assert_
3.2
assertEquals
3.2
assertNotEquals
3.2
assertAlmostEquals
3.2
assertNotAlmostEquals
3.2
assertRegexpMatches
3.2
assertRaisesRegexp
3.2
assertNotRegexpMatches
3.5
Borttagen¶
I detta avsnitt listas Python API:er som har tagits bort i Python 3.11.
Borttagna C API:er är listade separat.
Tog bort
@asyncio.coroutine()
decorator som gör det möjligt för äldre generatorbaserade coroutines att vara kompatibla medasync
/await
-kod. Funktionen har varit föråldrad sedan Python 3.8 och borttagningen var ursprungligen planerad till Python 3.10. Användasync def
istället. (Bidrag från Illia Volochii i bpo-43216.)Tog bort
asyncio.coroutines.CoroWrapper
som används för att paketera äldre generatorbaserade coroutine-objekt i felsökningsläget. (Bidrag från Illia Volochii i bpo-43216.)På grund av betydande säkerhetsproblem är parametern reuse_address i
asyncio.loop.create_datagram_endpoint()
, som inaktiverades i Python 3.9, nu helt borttagen. Detta beror på beteendet hos socket-alternativetSO_REUSEADDR
i UDP. (Bidrag från Hugo van Kemenade i bpo-45129.)Tog bort modulen
binhex
, föråldrad i Python 3.9. Tog även bort de relaterade, likaledes föråldradebinascii
-funktionerna:binascii.a2b_hqx()
binascii.b2a_hqx()
binascii.rlecode_hqx()
binascii.rldecode_hqx()
Funktionen
binascii.crc_hqx()
är fortfarande tillgänglig.(Bidrag från Victor Stinner i bpo-45085.)
Tog bort kommandot
distutils
bdist_msi
som är föråldrat i Python 3.9. Användbdist_wheel
(wheel-paket) istället. (Bidrag från Hugo van Kemenade i bpo-45124.)Tog bort
__getitem__()
-metoderna förxml.dom.pulldom.DOMEventStream
,wsgiref.util.FileWrapper
ochfileinput.FileInput
, föråldrade sedan Python 3.9. (Bidrag från Hugo van Kemenade i bpo-45132.)Tog bort de föråldrade
gettext
-funktionernalgettext()
,ldgettext()
,lngettext()
ochldngettext()
. Tog även bort funktionenbind_textdomain_codeset()
, metodernaNullTranslations.output_charset()
ochNullTranslations.set_output_charset()
, samt parametern codeset itranslation()
ochinstall()
, eftersom de endast används för funktionernal*gettext()
. (Bidrag från Donghee Na och Serhiy Storchaka i bpo-44235.)Borttagen från modulen
inspect
:Funktionen
getargspec()
, föråldrad sedan Python 3.0; användinspect.signature()
ellerinspect.getfullargspec()
istället.Funktionen
formatargspec()
, föråldrad sedan Python 3.5; använd funktioneninspect.signature()
eller objektetinspect.Signature
direkt.De odokumenterade metoderna
Signature.from_builtin()
ochSignature.from_function()
, föråldrade sedan Python 3.5; använd istället metodenSignature.from_callable()
.
(Bidrag från Hugo van Kemenade i bpo-45320.)
Tog bort metoden
__class_getitem__()
frånpathlib.PurePath
, eftersom den inte användes och lades till av misstag i tidigare versioner. (Bidrag från Nikita Sobolev i bpo-46483.)Tog bort klassen
MailmanProxy
i modulensmtpd
, eftersom den är oanvändbar utan det externa paketetmailman
. (Bidrag från Donghee Na i bpo-35800.)Tog bort den föråldrade
split()
-metoden i_tkinter.TkappType
. (Bidrag från Erlend E. Aasland i bpo-38371.)Tog bort stöd för namnrymdspaket från
unittest
-upptäckt. Det introducerades i Python 3.4 men har varit trasigt sedan Python 3.7. (Bidrag från Inada Naoki i bpo-23882.)Tog bort den odokumenterade privata metoden
float.__set_format__()
, tidigare känd somfloat.__setformat__()
i Python 3.7. Dess docstring sa: ”Du vill förmodligen inte använda den här funktionen. Den existerar främst för att användas i Pythons testsvit.” (Bidrag från Victor Stinner i bpo-46852.)Konfigurationsflaggan
--experimental-isolated-subinterpreters
(och motsvarande makroEXPERIMENTAL_ISOLATED_SUBINTERPRETERS
) har tagits bort.Pynche — The Pythonically Natural Color and Hue Editor — har flyttats från
Tools/scripts
och utvecklas nu oberoende från Pythons källkodsträd.
Portning till Python 3.11¶
I det här avsnittet listas tidigare beskrivna ändringar och andra buggfixar i Python API som kan kräva ändringar i din Python-kod.
Anteckningar om portning av C API finns listade separat.
open()
,io.open()
,codecs.open()
ochfileinput.FileInput
accepterar inte längre'U'
(”universal newline”) i filläget. I Python 3 används ”universal newline”-läget som standard när en fil öppnas i textläge, och flaggan'U'
har utgått sedan Python 3.3. Parametern newline till dessa funktioner kontrollerar hur universella nya rader fungerar. (Bidrag från Victor Stinner i bpo-37330.)ast.AST
nodpositioner valideras nu när de anges tillcompile()
och andra relaterade funktioner. Om ogiltiga positioner upptäcks kommer ettValueError
att visas. (Bidrag från Pablo Galindo i gh-93351)Förbjöd att skicka non-
concurrent.futures.ThreadPoolExecutor
-exekutorer tillasyncio.loop.set_default_executor()
efter en deprecation i Python 3.8. (Bidrag från Illia Volochii i bpo-43234.)calendar
: Klassernacalendar.LocaleTextCalendar
ochcalendar.LocaleHTMLCalendar
använder nulocale.getlocale()
, istället för att användalocale.getdefaultlocale()
, om ingen locale är specificerad. (Bidrag från Victor Stinner i bpo-46659.)Modulen
pdb
läser nu konfigurationsfilen.pdbrc
med kodningen'UTF-8'
. (Bidrag från Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) i bpo-41137.)Parametern population i
random.sample()
måste vara en sekvens, och automatisk konvertering avset
tilllist
stöds inte längre. Om urvalsstorleken är större än populationsstorleken uppstår dessutom ettValueError
. (Bidrag från Raymond Hettinger i bpo-40465.)Den valfria parametern random i
random.shuffle()
togs bort. Tidigare var det en godtycklig slumpfunktion som användes för blandningen; nu kommerrandom.random()
(dess tidigare standard) alltid att användas.I
re
Syntax för reguljära uttryck kan globala inline-flaggor (t.ex.(?i)
) nu bara användas i början av reguljära uttryck. Att använda dem på andra ställen har varit förbjudet sedan Python 3.6. (Bidrag från Serhiy Storchaka i bpo-47066.)I modulen
re
har flera gamla buggar åtgärdats som i sällsynta fall kunde leda till att fångstgrupper fick fel resultat. Därför kan detta ändra den fångade utdata i dessa fall. (Bidrag från Ma Lin i bpo-35859.)
Förändringar i byggning¶
CPython har nu PEP 11 Tier 3 support för korskompilering till WebAssembly plattformarna Emscripten (
wasm32-unknown-emscripten
, dvs Python i webbläsaren) och WebAssembly System Interface (WASI) (wasm32-unknown-wasi
). Ansträngningen är inspirerad av tidigare arbete som Pyodide. Dessa plattformar tillhandahåller en begränsad delmängd av POSIX API:er; Pythons standardbiblioteksfunktioner och moduler relaterade till nätverk, processer, trådning, signaler, mmap och användare/grupper är inte tillgängliga eller fungerar inte. (Emscripten bidragit med av Christian Heimes och Ethan Smith i gh-84461 och WASI bidragit med av Christian Heimes i gh-90473; plattformar marknadsförda i gh-95085)Att bygga CPython kräver nu:
Makrot
Py_NO_NAN
har tagits bort. Eftersom CPython nu kräver IEEE 754-flottor är NaN-värden alltid tillgängliga. (Bidrag från Victor Stinner i bpo-46656.)Paketet
tkinter
kräver nu Tcl/Tk version 8.5.12 eller nyare. (Bidrag från Serhiy Storchaka i bpo-46996.)Byggberoenden, kompilatorflaggor och länkarflaggor för de flesta stdlib-tilläggsmoduler upptäcks nu av configure. libffi, libnsl, libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk och uuid-flaggor upptäcks av pkg-config (när tillgängligt).
tkinter
kräver nu ett pkg-config-kommando för att upptäcka utvecklingsinställningar för Tcl/Tk-huvuden och bibliotek. (Bidrag från Christian Heimes och Erlend Egeberg Aasland i bpo-45847, bpo-45747, och bpo-45763.)libpython är inte längre länkat mot libcrypt. (Bidrag från Mike Gilbert i bpo-45433.)
CPython kan nu byggas med alternativet ThinLTO genom att skicka
thin
till--with-lto
, dvs.--with-lto=thin
. (Bidrag från Donghee Na och Brett Holman i bpo-44340.)Freelists för objektstrukturer kan nu inaktiveras. Ett nytt configure-alternativ
--without-freelists
kan användas för att inaktivera alla frilistor utom tom tuple singleton. (Bidrag från Christian Heimes i bpo-45522.)Modules/Setup
ochModules/makesetup
har förbättrats och knutits samman. Tilläggsmoduler kan nu byggas genommakesetup
. Alla utom vissa testmoduler kan länkas statiskt till en huvudbinärfil eller ett huvudbibliotek. (Bidrag från Brett Cannon och Christian Heimes i bpo-45548, bpo-45570, bpo-45571, och bpo-43974.)Anteckning
Använd miljövariablerna
TCLTK_CFLAGS
ochTCLTK_LIBS
för att manuellt ange platsen för Tcl/Tk-huvuden och -bibliotek. Alternativen configure--with-tcltk-includes
och--with-tcltk-libs
har tagits bort.På RHEL 7 och CentOS 7 tillhandahåller inte utvecklingspaketen
tcl.pc
ochtk.pc
; användTCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5"
. KatalogenMisc/rhel7
innehåller.pc
-filer och instruktioner om hur man bygger Python med RHEL 7:s och CentOS 7:s Tcl/Tk och OpenSSL.CPython kommer nu att använda 30-bitars siffror som standard för Python
int
-implementationen. Tidigare var standardinställningen att använda 30-bitars siffror på plattformar medSIZEOF_VOID_P >= 8
, och 15-bitars siffror annars. Det är fortfarande möjligt att uttryckligen begära användning av 15-bitars siffror via antingen--enable-big-digits
-alternativet till configure-skriptet eller (för Windows) variabelnPYLONG_BITS_IN_DIGIT
iPC/pyconfig.h
, men detta alternativ kan komma att tas bort någon gång i framtiden. (Bidrag från Mark Dickinson i bpo-45569.)
Ändringar i C API¶
Nya funktioner¶
Lägg till en ny
PyType_GetName()
-funktion för att hämta typens korta namn. (Bidrag från Hai Shi i bpo-42035.)Lägg till en ny
PyType_GetQualName()
-funktion för att hämta typens kvalificerade namn. (Bidrag från Hai Shi i bpo-42035.)Lägg till nya
PyThreadState_EnterTracing()
ochPyThreadState_LeaveTracing()
funktioner till det begränsade C API:et för att avbryta och återuppta spårning och profilering. (Bidrag från Victor Stinner i bpo-43760.)Lagt till
Py_Version
-konstanten som har samma värde somPY_VERSION_HEX
. (Bidrag från Gabriele N. Tornetta i bpo-43931.)Py_buffer
och API:er är nu en del av det begränsade API:et och det stabila ABI:et:bf_getbuffer
ochbf_releasebuffer
typ slots
(Bidrag från Christian Heimes i bpo-45459.)
Lade till funktionen
PyType_GetModuleByDef()
, som används för att hämta modulen i vilken en metod definierades, i de fall då denna information inte är tillgänglig direkt (viaPyCMethod
). (Bidrag från Petr Viktorin i bpo-46613.)Lägg till nya funktioner för att packa och packa upp C double (serialize och deserialize):
PyFloat_Pack2()
,PyFloat_Pack4()
,PyFloat_Pack8()
,PyFloat_Unpack2()
,PyFloat_Unpack4()
ochPyFloat_Unpack8()
. (Bidrag från Victor Stinner i bpo-46906.)Lägg till nya funktioner för att hämta attribut för ramobjekt:
PyFrame_GetBuiltins()
,PyFrame_GetGenerator()
,PyFrame_GetGlobals()
,PyFrame_GetLasti()
.Lade till två nya funktioner för att hämta och ställa in den aktiva undantagsinstansen:
PyErr_GetHandledException()
ochPyErr_SetHandledException()
. Dessa är alternativ tillPyErr_SetExcInfo()
ochPyErr_GetExcInfo()
som arbetar med den äldre 3-tupel-representationen av undantag. (Bidrag från Irit Katriel i bpo-46343.)Lagt till
PyConfig.safe_path
-medlemmen. (Bidrag från Victor Stinner i gh-57684.)
Portning till Python 3.11¶
Vissa makron har konverterats till statiska inline-funktioner för att undvika makrofällor. Förändringen bör vara mestadels transparent för användarna, eftersom ersättningsfunktionerna kommer att kasta sina argument till de förväntade typerna för att undvika kompilatorvarningar på grund av statiska typkontroller. När det begränsade C API:et är inställt på >=3.11 görs dock inte dessa kast och anropare måste kasta argumenten till deras förväntade typer. Se PEP 670 för mer information. (Bidrag från Victor Stinner och Erlend E. Aasland i gh-89653.)
PyErr_SetExcInfo()
använder inte längre argumententype
ochtraceback
, tolken härleder nu dessa värden från undantagsinstansen (argumentetvalue
). Funktionen stjäl fortfarande referenser till alla tre argumenten. (Bidrag från Irit Katriel i bpo-45711.)PyErr_GetExcInfo()
härleder nu fältentype
ochtraceback
i resultatet från undantagsinstansen (fältetvalue
). (Bidrag från Irit Katriel i bpo-45711.)_frozen
har fått ett nytt fältis_package
som anger om den frysta modulen är ett paket eller inte. Tidigare var ett negativt värde i fältetsize
indikatorn. Nu kan endast icke-negativa värden användas försize
. (Bidrag från Kumar Aditya i bpo-46608.)_PyFrameEvalFunction()
tar nu_PyInterpreterFrame*
som sin andra parameter, istället förPyFrameObject*
. Se PEP 523 för mer information om hur man använder denna funktionspekartyp.PyCode_New()
ochPyCode_NewWithPosOnlyArgs()
tar nu ett ytterligareexception_table
argument. Användning av dessa funktioner bör undvikas om det är möjligt. För att få ett anpassat kodobjekt: skapa ett kodobjekt med hjälp av kompilatorn och få sedan en modifierad version med metodenreplace
.PyCodeObject
har inte längre fältenco_code
,co_varnames
,co_cellvars
ochco_freevars
. Använd iställetPyCode_GetCode()
,PyCode_GetVarnames()
,PyCode_GetCellvars()
respektivePyCode_GetFreevars()
för att komma åt dem via C API. (Bidrag från Brandt Bucher i bpo-46841 och Ken Jin i gh-92154 och gh-94936.)De gamla trashcan-makrot (
Py_TRASHCAN_SAFE_BEGIN
/Py_TRASHCAN_SAFE_END
) är nu föråldrade. De bör ersättas av de nya makronaPy_TRASHCAN_BEGIN
ochPy_TRASHCAN_END
.En tp_dealloc-funktion som har de gamla makron, till exempel:
statiskt void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_SAFE_BEGIN(p); ... Py_TRASHCAN_SAFE_END }
bör övergå till de nya makron enligt följande:
statiskt void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_BEGIN(p, mytype_dealloc) ... Py_TRASHCAN_END }
Observera att
Py_TRASHCAN_BEGIN
har ett andra argument som bör vara den deallokeringsfunktion som den ingår i.För att stödja äldre Python-versioner i samma kodbas kan du definiera följande makron och använda dem i hela koden (källa: dessa har kopierats från kodbasen
mypy
):#if PY_VERSION_HEX >= 0x03080000 # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc) # define CPy_TRASHCAN_END(op) Py_TRASHCAN_END #else # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op) # define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op) #endif
Funktionen
PyType_Ready()
ger nu upphov till ett fel om en typ definieras med flagganPy_TPFLAGS_HAVE_GC
inställd men inte har någon traversefunktion (PyTypeObject.tp_traverse
). (Bidrag från Victor Stinner i bpo-44263.)Heap-typer med
Py_TPFLAGS_IMMUTABLETYPE
flaggan kan nu ärva PEP 590 vectorcall protokollet. Tidigare var detta endast möjligt för static types. (Bidrag från Erlend E. Aasland i bpo-43908)Eftersom
Py_TYPE()
har ändrats till en statisk inline-funktion, måstePy_TYPE(obj) = new_type
ersättas medPy_SET_TYPE(obj, new_type)
: se funktionenPy_SET_TYPE()
(tillgänglig sedan Python 3.9). För bakåtkompatibilitet kan detta makro användas:#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE) statisk inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { ob->ob_type = typ; } #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type) #endif
(Bidrag från Victor Stinner i bpo-39573.)
Eftersom
Py_SIZE()
har ändrats till en statisk inline-funktion, måstePy_SIZE(obj) = new_size
ersättas medPy_SET_SIZE(obj, new_size)
: se funktionenPy_SET_SIZE()
(tillgänglig sedan Python 3.9). För bakåtkompatibilitet kan detta makro användas:#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE) statisk inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) { ob->ob_size = size; } #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size) #endif
(Bidrag från Victor Stinner i bpo-39573.)
<Python.h>
inkluderar inte längre huvudfilerna<stdlib.h>
,<stdio.h>
,<errno.h>
och<string.h>
när makrotPy_LIMITED_API
är inställt på0x030b0000
(Python 3.11) eller högre. C-tillägg bör uttryckligen inkludera huvudfilerna efter#include <Python.h>
. (Bidrag från Victor Stinner i bpo-45434.)De icke-begränsade API-filerna
cellobject.h
,classobject.h
,code.h
,context.h
,funcobject.h
,genobject.h
ochlongintrepr.h
har flyttats till katalogenInclude/cpython
. Dessutom har huvudfileneval.h
tagits bort. Dessa filer får inte inkluderas direkt, eftersom de redan finns iPython.h
: Include Files. Om de har inkluderats direkt, överväg att inkluderaPython.h
istället. (Bidrag från Victor Stinner i bpo-35134.)Makrot
PyUnicode_CHECK_INTERNED()
har uteslutits från det begränsade C API:et. Det var aldrig användbart där, eftersom det använde interna strukturer som inte är tillgängliga i det begränsade C API:et. (Bidrag från Victor Stinner i bpo-46007.)Följande ramfunktioner och -typer är nu direkt tillgängliga med
#include <Python.h>
, det är inte längre nödvändigt att lägga till#include <frameobject.h>
:(Bidrag från Victor Stinner i gh-93937.)
Strukturmedlemmarna
PyFrameObject
har tagits bort från det publika C API:et.Även om det i dokumentationen anges att fälten
PyFrameObject
kan ändras när som helst, har de varit stabila under lång tid och använts i flera populära tillägg.I Python 3.11 omorganiserades ramstrukturen för att möjliggöra prestandaoptimeringar. Vissa fält togs bort helt och hållet, eftersom de var detaljer i den gamla implementeringen.
PyFrameObject
-fält :f_back
: användPyFrame_GetBack()
.f_blockstack
: borttagen.f_builtins
: användPyFrame_GetBuiltins()
.f_code
: användPyFrame_GetCode()
.f_gen
: användPyFrame_GetGenerator()
.f_globals
: användPyFrame_GetGlobals()
.f_iblock
: borttagen.f_lasti
: användPyFrame_GetLasti()
. Kod som använderf_lasti
medPyCode_Addr2Line()
bör användaPyFrame_GetLineNumber()
istället; det kan vara snabbare.f_lineno
: användPyFrame_GetLineNumber()
f_locals
: användPyFrame_GetLocals()
.f_stackdepth
: borttagen.f_state
: Inget offentligt API (bytt namn tillf_frame.f_state
).f_trace
: Inget offentligt API.f_trace_lines
: användPyObject_GetAttrString((PyObject*)frame, "f_trace_lines")
.f_trace_opcodes
: användPyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes")
.f_localsplus
: Inget offentligt API (bytt namn tillf_frame.localsplus
).f_valuestack
: borttagen.
Python frame-objektet skapas nu på ett lättsamt sätt. En bieffekt är att medlemmen
f_back
inte får nås direkt, eftersom dess värde nu också beräknas på ett slött sätt. FunktionenPyFrame_GetBack()
måste anropas istället.Avläsningsprogram som använde
f_locals
direkt måste anropaPyFrame_GetLocals()
istället. De behöver inte längre anropaPyFrame_FastToLocalsWithError()
ellerPyFrame_LocalsToFast()
, i själva verket bör de inte anropa dessa funktioner. Den nödvändiga uppdateringen av ramen hanteras nu av den virtuella maskinen.Kod som definierar
PyFrame_GetCode()
på Python 3.8 och äldre:#if PY_VERSION_HEX < 0x030900B1 static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame) { Py_INCREF(frame->f_code); returnera frame->f_code; } #endif
Kod som definierar
PyFrame_GetBack()
på Python 3.8 och äldre:#if PY_VERSION_HEX < 0x030900B1 static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame) { Py_XINCREF(ram->f_back); returnera frame->f_back; } #endif
Eller använd pythoncapi_compat-projektet för att få dessa två funktioner på äldre Python-versioner.
Ändringar av strukturmedlemmarna i
PyThreadState
:frame
: borttagen, användPyThreadState_GetFrame()
(funktion tillagd till Python 3.9 av bpo-40429). Varning: funktionen returnerar en strong reference, måste anropaPy_XDECREF()
.tracing
: ändrat, användPyThreadState_EnterTracing()
ochPyThreadState_LeaveTracing()
(funktioner tillagda i Python 3.11 av bpo-43760).recursion_depth
: borttagen, använd(tstate->recursion_limit - tstate->recursion_remaining)
istället.stackcheck_counter
: borttagen.
Kod som definierar
PyThreadState_GetFrame()
på Python 3.8 och äldre:#if PY_VERSION_HEX < 0x030900B1 static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate) { Py_XINCREF(tstate->frame); return tstate->frame; } #endif
Kod som definierar
PyThreadState_EnterTracing()
ochPyThreadState_LeaveTracing()
på Python 3.10 och äldre:#if PY_VERSION_HEX < 0x030B00A2 static inline void PyThreadState_EnterTracing(PyThreadState *tstate) { tstate->tracing++; #if PY_VERSION_HEX >= 0x030A00A1 tstate->cframe->use_tracing = 0; #else tstate->use_tracing = 0; #endif } static inline void PyThreadState_LeaveTracing(PyThreadState *tstate) { int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL); tstate->tracing--; #if PY_VERSION_HEX >= 0x030A00A1 tstate->cframe->use_tracing = use_tracing; #else tstate->use_tracing = use_tracing; #endif } #endif
Eller använd the pythoncapi-compat project för att få dessa funktioner på gamla Python-funktioner.
Distributörer uppmuntras att bygga Python med det optimerade Blake2-biblioteket libb2.
Fältet
PyConfig.module_search_paths_set
måste nu vara satt till 1 för att initieringen ska användaPyConfig.module_search_paths
för att initierasys.path
. Annars kommer initieringen att räkna om sökvägen och ersätta alla värden som lagts till imodule_search_paths
.PyConfig_Read()
beräknar inte längre den första sökvägen och fyller inte i några värden iPyConfig.module_search_paths
. För att beräkna standardsökvägar och sedan ändra dem, avsluta initialiseringen och användPySys_GetObject()
för att hämtasys.path
som ett Python-listobjekt och ändra det direkt.
Föråldrat¶
Avveckla följande funktioner för att konfigurera Python-initialiseringen:
PySys_AddWarnOptionUnicode()
PySys_AddWarnOption()
PySys_AddXOption()
PySys_HasWarnOptions()
PySys_SetArgvEx()
PySys_SetArgv()
PySys_SetPath()
Py_SetPath()
Py_SetProgramName()
Py_SetPythonHome()
Py_SetStandardStreamEncoding()
_Py_SetProgramFullPath()
Använd det nya
PyConfig
API:et i Python Initialization Configuration istället (PEP 587). (Bidrag från Victor Stinner i gh-88279.)Avveckla
ob_shash
-medlemmen iPyBytesObject
. AnvändPyObject_Hash()
istället. (Bidrag från Inada Naoki i bpo-46864.)
Väntar på borttagning i Python 3.12¶
Följande C API:er har utgått i tidigare Python-utgåvor och kommer att tas bort i Python 3.12.
PyUnicode_AS_DATA()
PyUnicode_AS_UNICODE()
PyUnicode_AsUnicodeAndSize()
PyUnicode_AsUnicode()
PyUnicode_FromUnicode()
PyUnicode_GET_DATA_SIZE()
PyUnicode_GET_SIZE()
PyUnicode_GetSize()
PyUnicode_IS_COMPACT()
PyUnicode_IS_READY()
PyUnicode_WSTR_LENGTH()
_PyUnicode_AsUnicode()
PyUnicode_WCHAR_KIND
PyUnicode_InternImmortal()
Borttagen¶
PyFrame_BlockSetup()
ochPyFrame_BlockPop()
har tagits bort. (Bidrag från Mark Shannon i bpo-40222.)Ta bort följande matematiska makron med hjälp av variabeln
errno
:Py_ADJUST_ERANGE1()
Py_ADJUST_ERANGE2()
Py_OVERFLOWED()
Py_SET_ERANGE_IF_OVERFLOW()
Py_SET_ERRNO_ON_MATH_ERROR()
(Bidrag från Victor Stinner i bpo-45412.)
Ta bort makron
Py_UNICODE_COPY()
ochPy_UNICODE_FILL()
, föråldrade sedan Python 3.3. AnvändPyUnicode_CopyCharacters()
ellermemcpy()
(wchar_t*
-sträng), ochPyUnicode_Fill()
funktioner istället. (Bidrag från Victor Stinner i bpo-41123.)Ta bort huvudfilen
pystrhex.h
. Den innehåller endast privata funktioner. C-tillägg bör endast inkludera huvudfilen<Python.h>
. (Bidrag från Victor Stinner i bpo-45434.)Ta bort makrot
Py_FORCE_DOUBLE()
. Det användes av makrotPy_IS_INFINITY()
. (Bidrag från Victor Stinner i bpo-45440.)Följande objekt är inte längre tillgängliga när
Py_LIMITED_API
är definierat:makrot
Py_MARSHAL_VERSION
Dessa ingår inte i begränsat API.
(Bidrag från Victor Stinner i bpo-45474.)
Uteslut
PyWeakref_GET_OBJECT()
från det begränsade C API:et. Det fungerade aldrig eftersomPyWeakReference
-strukturen är ogenomskinlig i det begränsade C API:et. (Bidrag från Victor Stinner i bpo-35134.)Ta bort makrot
PyHeapType_GET_MEMBERS()
. Det exponerades i det offentliga C API:et av misstag, det får endast användas av Python internt. Använd medlemmenPyTypeObject.tp_members
istället. (Bidrag från Victor Stinner i bpo-40170.)Ta bort makrot
HAVE_PY_SET_53BIT_PRECISION
(flyttat till det interna C API:et). (Bidrag från Victor Stinner i bpo-45412.)
Ta bort
Py_UNICODE
-kodar-API:erna, eftersom de har varit föråldrade sedan Python 3.3, används lite och är ineffektiva i förhållande till de rekommenderade alternativen.De borttagna funktionerna är:
PyUnicode_Encode()
PyUnicode_EncodeASCII()
PyUnicode_EncodeLatin1()
PyUnicode_EncodeUTF7`()
PyUnicode_EncodeUTF8`()
PyUnicode_EncodeUTF16`()
PyUnicode_EncodeUTF32`()
PyUnicode_EncodeUnicodeEscape()
PyUnicode_EncodeRawUnicodeEscape()
PyUnicode_EncodeCharmap()
PyUnicode_TranslateCharmap()
PyUnicode_EncodeDecimal()
PyUnicode_TransformDecimalToASCII()
Se PEP 624 för detaljer och migrationsvägledning. (Bidrag från Inada Naoki i bpo-44029.)
Viktiga ändringar i 3.11.4¶
tarfil¶
Extraktionsmetoderna i
tarfile
ochshutil.unpack_archive()
har ett nytt filter-argument som gör det möjligt att begränsa tarfunktioner som kan vara överraskande eller farliga, t.ex. att skapa filer utanför destinationskatalogen. Se Filter för utsugning för detaljer. I Python 3.12 kommer användning utan filter-argumentet att visa enDeprecationWarning
. I Python 3.14 kommer standardinställningen att ändras till'data'
. (Bidrag från Petr Viktorin i PEP 706.)
Viktiga ändringar i 3.11.5¶
OpenSSL¶
Windows-byggnader och macOS-installationer från python.org använder nu OpenSSL 3.0.