Vad är nytt i Python 3.12

Redigerare:

Adam Turner

I den här artikeln förklaras de nya funktionerna i Python 3.12 jämfört med 3.11. Python 3.12 släpptes den 2 oktober 2023. För fullständig information, se changelog.

Se även

PEP 693 – Python 3.12 Utgivningsschema

Sammanfattning – Release highlights

Python 3.12 är en stabil version av programmeringsspråket Python, med en blandning av ändringar i språket och standardbiblioteket. Biblioteksändringarna fokuserar på att rensa upp föråldrade API: er, användbarhet och korrekthet. Noterbart är att paketet distutils har tagits bort från standardbiblioteket. Filsystemstödet i os och pathlib har genomgått ett antal förbättringar och flera moduler har fått bättre prestanda.

Språkändringarna fokuserar på användbarhet, eftersom f-strings har fått många begränsningar borttagna och ”Menade du …”-förslag fortsätter att förbättras. Den nya type parameter syntax och type statement förbättrar ergonomin för användning av generic types och type aliases med statiska typkontrollanter.

Den här artikeln försöker inte ge en fullständig specifikation av alla nya funktioner, utan ger istället en praktisk översikt. För fullständig information bör du läsa dokumentationen, t.ex. Library Reference och Language Reference. Om du vill förstå den fullständiga implementeringen och designmotiveringen för en ändring kan du läsa PEP:n för en viss ny funktion, men observera att PEP:er vanligtvis inte uppdateras när en funktion har implementerats fullt ut.


Nya syntaxfunktioner:

Nya grammatiska funktioner:

Förbättringar av tolkar:

Förbättringar av Python-datamodellen:

Betydande förbättringar i standardbiblioteket:

Förbättringar av säkerheten:

  • Ersätt de inbyggda hashlib-implementeringarna av SHA1, SHA3, SHA2-384, SHA2-512 och MD5 med formellt verifierad kod från projektet HACL*. Dessa inbyggda implementeringar finns kvar som fallbacks som endast används när OpenSSL inte tillhandahåller dem.

Förbättringar av C API:

Förbättringar av CPython-implementeringen:

  • PEP 709, förståelse inlining

  • CPython-stöd för Linux-profileraren perf

  • Implementera stack overflow-skydd på plattformar som stöds

Nya funktioner för skrivning:

Viktiga avskrivningar, borttagningar eller begränsningar:

  • PEP 623: Ta bort wstr från Unicode-objekt i Pythons C API, vilket minskar storleken på varje str-objekt med minst 8 byte.

  • PEP 632: Ta bort paketet distutils. Se migreringsguiden för råd om att ersätta de API:er som paketet tillhandahöll. Tredjepartspaketet Setuptools fortsätter att tillhandahålla distutils, om du fortfarande behöver det i Python 3.12 och senare.

  • gh-95299: Förinstallera inte setuptools i virtuella miljöer skapade med venv. Detta innebär att distutils, setuptools, pkg_resources och easy_install inte längre kommer att vara tillgängliga som standard; för att få tillgång till dessa kör pip install setuptools i den virtuella miljön activated.

  • Modulerna asynchat, asyncore, och imp har tagits bort, tillsammans med flera unittest.TestCase method aliases.

Nya funktioner

PEP 695: Typ Parameter Syntax

Generiska klasser och funktioner under PEP 484 deklarerades med en mångordig syntax som lämnade omfattningen av typparametrar oklar och krävde uttryckliga variansdeklarationer.

PEP 695 introducerar ett nytt, mer kompakt och explicit sätt att skapa generiska klasser och funktioner:

def max[T](args: Iterabel[T]) -> T:
    ...

klass lista[T]:
    def __getitem__(self, index: int, /) -> T:
        ...

    def append(self, element: T) -> None:
        ...

Dessutom introducerar PEP ett nytt sätt att deklarera typalias med hjälp av type-satsen, som skapar en instans av TypeAliasType:

typ Point = tuple[float, float]

Typaliaser kan också vara generic:

typ Punkt[T] = tupel[T, T]

Den nya syntaxen gör det möjligt att deklarera TypeVarTuple och ParamSpec parametrar, samt TypeVar parametrar med gränser eller begränsningar:

type IntFunc[**P] = Kallbar[P, int] # ParamSpec
type LabeledTuple[*Ts] = tuple[str, *Ts] # TypeVarTuple
type HashableSequence[T: Hashable] = Sequence[T] # TypeVar med bindning
type IntOrStrSequence[T: (int, str)] = Sequence[T] # TypeVar med begränsningar

Värdet på typalias och bindningen och begränsningarna för typvariabler som skapats med denna syntax utvärderas endast på begäran (se lazy evaluation). Detta innebär att typalias kan referera till andra typer som definieras senare i filen.

Typparametrar som deklareras via en typparameterlista är synliga inom deklarationens scope och eventuella nästlade scopes, men inte i det yttre scopet. De kan t.ex. användas i typannoteringarna för metoderna i en generisk klass eller i klassens kropp. De kan dock inte användas i modulscopet efter att klassen har definierats. Se Typ parameterlistor för en detaljerad beskrivning av runtime-semantiken för typ-parametrar.

För att stödja denna scopingsemantik introduceras en ny typ av scope, annotation scope. Annotationsscopes beter sig för det mesta som funktionsscopes, men interagerar annorlunda med omslutande klasscopes. I Python 3.13 kommer annotations också att utvärderas i annotation scopes.

Se PEP 695 för mer information.

(PEP skriven av Eric Traut. Implementering av Jelle Zijlstra, Eric Traut, och andra i gh-103764.)

PEP 701: Syntaktisk formalisering av f-strängar

PEP 701 lyfter vissa restriktioner för användningen av f-strings. Uttryckskomponenter inuti f-strings kan nu vara vilket giltigt Python-uttryck som helst, inklusive strängar som återanvänder samma citat som den innehållande f-stringen, flerradiga uttryck, kommentarer, backslash och unicode-escape-sekvenser. Låt oss gå igenom dessa i detalj:

  • Återanvändning av citat: i Python 3.11 ger återanvändning av samma citat som den omslutande f-strängen ett SyntaxError, vilket tvingar användaren att antingen använda andra tillgängliga citat (som att använda dubbla citat eller trippelcitat om f-strängen använder enkla citat). I Python 3.12 kan du nu göra saker som detta:

    >>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
    >>> f"This is the playlist: {", ".join(songs)}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    

    Observera att det före denna ändring inte fanns någon uttrycklig gräns för hur f-strängar kan nästlas, men det faktum att strängcitat inte kan återanvändas i uttryckskomponenten i f-strängar gjorde det omöjligt att nästla f-strängar godtyckligt. Faktum är att detta är den mest nästlade f-sträng som kan skrivas:

    >>> f"""{f'''{f'{f"{1+1}"}'}'''}"""
    '2'
    

    Eftersom f-strängar nu kan innehålla alla giltiga Python-uttryck inuti uttryckskomponenter är det nu möjligt att nesta f-strängar godtyckligt:

    >>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"
    '2'
    
  • Uttryck och kommentarer på flera rader: I Python 3.11 måste f-stränguttryck definieras på en enda rad, även om uttrycket i f-strängen normalt kan sträcka sig över flera rader (som bokstavslistor som definieras över flera rader), vilket gör dem svårare att läsa. I Python 3.12 kan du nu definiera f-strängar som sträcker sig över flera rader och lägga till inline-kommentarer:

    >>> f"This is the playlist: {", ".join([
    ...     'Take me back to Eden',  # My, my, those eyes like fire
    ...     'Alkaline',              # Not acid nor alkaline
    ...     'Ascensionism'           # Take to the broken skies at last
    ... ])}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    
  • Backsteg och unicode-tecken: före Python 3.12 kunde f-stränguttryck inte innehålla något \-tecken. Detta påverkade även unicode escape sequences (såsom \N{snowman}) eftersom dessa innehåller delen \N som tidigare inte kunde ingå i uttryckskomponenter i f-strängar. Nu kan du definiera uttryck som detta:

    >>> print(f"This is the playlist: {"\n".join(songs)}")
    This is the playlist: Take me back to Eden
    Alkaline
    Ascensionism
    >>> print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}")
    This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
    

Se PEP 701 för mer information.

Som en positiv bieffekt av hur denna funktion har implementerats (genom att analysera f-strängar med the PEG parser), är nu felmeddelanden för f-strängar mer exakta och inkluderar den exakta platsen för felet. Till exempel, i Python 3.11, ger följande f-sträng upphov till ett SyntaxError:

>>> my_string = f"{x z y}" + f"{1 + 1}"
  File "<stdin>", line 1
    (x z y)
     ^^^
SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?

men felmeddelandet innehåller inte den exakta platsen för felet inom raden och har också uttrycket artificiellt omgivet av parenteser. I Python 3.12, när f-strängar analyseras med PEG-parsern, kan felmeddelanden vara mer exakta och visa hela raden:

>>> my_string = f"{x z y}" + f"{1 + 1}"
  File "<stdin>", line 1
    my_string = f"{x z y}" + f"{1 + 1}"
                   ^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

(Bidrag från Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou, Cristián Maureira-Fredes och Marta Gómez i gh-102856. PEP skriven av Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou och Marta Gómez).

PEP 684: En per-tolk GIL

PEP 684 introducerar en per-tolk GIL, så att undertolkare nu kan skapas med en unik GIL per tolk. Detta gör det möjligt för Python-program att dra full nytta av flera CPU-kärnor. Detta är för närvarande endast tillgängligt via C-API, men ett Python-API är förväntat till 3.13.

Använd den nya funktionen Py_NewInterpreterFromConfig() för att skapa en tolk med en egen GIL:

PyInterpreterConfig config = {
    .check_multi_interp_extensions = 1,
    .gil = PyInterpreterConfig_OWN_GIL,
};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) {
    return -1;
}
/* Den nya tolken är nu aktiv i den aktuella tråden. */

För ytterligare exempel på hur man använder C-API för undertolkar med en GIL per tolk, se Modules/_xxsubinterpretersmodule.c.

(Bidrag från Eric Snow i gh-104210, etc.)

PEP 669: Övervakning med låg påverkan för CPython

PEP 669 definierar ett nytt API för profilerare, debuggers och andra verktyg för att övervaka händelser i CPython. Det täcker ett brett spektrum av händelser, inklusive anrop, returer, rader, undantag, hopp och mer. Detta innebär att du bara betalar för det du använder, vilket ger stöd för debuggar och täckningsverktyg med nästan noll overhead. Se sys.monitoring för mer information.

(Bidrag från Mark Shannon i gh-103082.)

PEP 688: Att göra buffertprotokollet tillgängligt i Python

PEP 688 introducerar ett sätt att använda buffer protocol från Python-kod. Klasser som implementerar metoden __buffer__() är nu användbara som bufferttyper.

Den nya collections.abc.Buffer ABC ger ett standardiserat sätt att representera buffertobjekt, t.ex. i typannoteringar. Den nya inspect.BufferFlags enum representerar de flaggor som kan användas för att anpassa skapandet av buffertar. (Bidrag från Jelle Zijlstra i gh-102500.)

PEP 709: Förståelse för inlining

Dictionary-, list- och set-förståelser är nu inline, i stället för att skapa ett nytt funktionsobjekt för engångsbruk för varje körning av förståelsen. Detta snabbar upp exekveringen av en förståelse med upp till två gånger. Se PEP 709 för ytterligare detaljer.

Variabler för förståelseiteration förblir isolerade och skriver inte över en variabel med samma namn i det yttre omfånget, och de är inte heller synliga efter förståelsen. Inlining resulterar i några synliga beteendeförändringar:

  • Det finns inte längre någon separat ram för förståelsen i spårningar, och spårning/profilering visar inte längre förståelsen som ett funktionsanrop.

  • Modulen symtable kommer inte längre att producera underordnade symboltabeller för varje förståelse; istället kommer förståelsens lokala symboler att inkluderas i den överordnade funktionens symboltabell.

  • Anrop av locals() inuti en förståelse inkluderar nu variabler från utanför förståelsen, och inkluderar inte längre den syntetiska .0-variabeln för förståelsen ”argument”.

  • En förståelse som itererar direkt över locals() (t.ex. [k for k in locals()]) kan se ”RuntimeError: dictionary changed size during iteration” när den körs under spårning (t.ex. mätning av kodtäckning). Detta är samma beteende som redan setts i t.ex. for k in locals():. För att undvika felet skapar du först en lista med nycklar att iterera över: keys = list(locals()); [k for k in keys].

(Bidrag från Carl Meyer och Vladimir Matveev i PEP 709.)

Förbättrade felmeddelanden

  • Moduler från standardbiblioteket kan nu potentiellt föreslås som en del av de felmeddelanden som tolken visar när ett NameError lyfts till högsta nivån. (Bidrag från Pablo Galindo i gh-98254.)

    >>> sys.version_info
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'sys' is not defined. Did you forget to import 'sys'?
    
  • Förbättra felförslaget för NameError-undantag för instanser. Nu om ett NameError uppstår i en metod och instansen har ett attribut som är exakt lika med namnet i undantaget, kommer förslaget att inkludera self.<NAME> istället för den närmaste matchningen i metodomfånget. (Bidrag från Pablo Galindo i gh-99139.)

    >>> class A:
    ...    def __init__(self):
    ...        self.blech = 1
    ...
    ...    def foo(self):
    ...        somethin = blech
    ...
    >>> A().foo()
    Traceback (most recent call last):
      File "<stdin>", line 1
        somethin = blech
                   ^^^^^
    NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
    
  • Förbättra felmeddelandet SyntaxError när användaren skriver import x from y istället för from y import x. (Bidrag från Pablo Galindo i gh-98931.)

    >>> import a.y.z from b.y.z
    Traceback (most recent call last):
      File "<stdin>", line 1
        import a.y.z from b.y.z
        ^^^^^^^^^^^^^^^^^^^^^^^
    SyntaxError: Did you mean to use 'from ... import ...' instead?
    
  • ImportError undantag som uppstår från misslyckade from <module> import <name> satser innehåller nu förslag på värdet för <name> baserat på de tillgängliga namnen i <module>. (Bidrag från Pablo Galindo i gh-91058.)

    >>> from collections import chainmap
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
    

Andra språkliga förändringar

  • Parsern visar nu SyntaxError vid parsning av källkod som innehåller nollbytes. (Bidrag från Pablo Galindo i gh-96670.)

  • Ett backslash-teckenpar som inte är en giltig escape-sekvens genererar nu en SyntaxWarning, istället för DeprecationWarning. Till exempel, re.compile("\d+\.\d+") avger nu en SyntaxWarning ("\d" är en ogiltig escape-sekvens, använd råa strängar för reguljärt uttryck: re.compile(r"\d+\.\d+")). I en framtida Python-version kommer SyntaxError så småningom att visas istället för SyntaxWarning. (Bidrag från Victor Stinner i gh-98401.)

  • Oktala escapes med värde större än 0o377 (ex: "\477"), föråldrade i Python 3.11, ger nu en SyntaxWarning, istället för DeprecationWarning. I en framtida Python-version kommer de så småningom att vara SyntaxError. (Bidrag från Victor Stinner i gh-98401.)

  • Variabler som används i måldelen av förståelser som inte lagras till kan nu användas i tilldelningsuttryck (:=). I exempelvis [(b := 1) for a, b.prop in some_iter] är det nu tillåtet att tilldela b. Observera att tilldelning till variabler som lagras i måldelen av förståelser (som a) fortfarande är otillåten, enligt PEP 572. (Bidrag från Nikita Sobolev i gh-100581.)

  • Undantag som uppstår i en klass eller typs __set_name__-metod omsluts inte längre av ett RuntimeError. Kontextinformation läggs till undantaget som en PEP 678-anteckning. (Bidrag från Irit Katriel i gh-77757.)

  • När en try-except*-konstruktion hanterar hela ExceptionGroup och ger upphov till ett annat undantag, är det undantaget inte längre inslaget i en ExceptionGroup. Ändrades även i version 3.11.4. (Bidrag från Irit Katriel i gh-103590.)

  • Garbage Collector körs nu endast på eval breaker-mekanismen i Pythons bytecode-utvärderingsloop istället för på objektallokeringar. GC kan också köras när PyErr_CheckSignals() anropas så att C-tillägg som behöver köras under lång tid utan att köra någon Python-kod också har en chans att köra GC periodiskt. (Bidrag från Pablo Galindo i gh-97922.)

  • Alla inbyggda och utökade anrop som förväntar sig booleska parametrar accepterar nu argument av alla typer istället för bara bool och int. (Bidrag från Serhiy Storchaka i gh-60203.)

  • memoryview har nu stöd för typen half-float (formatkoden ”e”). (Bidrag från Donghee Na och Antoine Pitrou i gh-90751.)

  • slice-objekt är nu hashbara, vilket gör att de kan användas som dict-nycklar och set-objekt. (Bidrag från Will Bradshaw, Furkan Onder och Raymond Hettinger i gh-101264.)

  • sum() använder nu Neumaier-summering för att förbättra noggrannhet och kommutativitet vid summering av flyttal eller blandade ints och flyttal. (Bidrag från Raymond Hettinger i gh-100425.)

  • ast.parse() visar nu SyntaxError istället för ValueError när källkod som innehåller null bytes analyseras. (Bidrag från Pablo Galindo i gh-96670.)

  • Extraktionsmetoderna i tarfile och shutil.unpack_archive() har ett nytt filter-argument som gör det möjligt att begränsa tar-funktioner som kan vara överraskande eller farliga, såsom att skapa filer utanför målkatalogen. Se tarfile extraction filters för mer information. I Python 3.14 kommer standardvärdet att ändras till 'data'. (Bidrag från Petr Viktorin i PEP 706.)

  • types.MappingProxyType-instanser är nu hashbara om den underliggande mappningen är hashbar. (Bidrag från Serhiy Storchaka i gh-87995.)

  • Lägg till stöd för perf profiler genom den nya miljövariabeln PYTHONPERFSUPPORT och kommandoradsalternativet -X perf, samt de nya funktionerna sys.activate_stack_trampoline(), sys.deactivate_stack_trampoline() och sys.is_stack_trampoline_active(). (Design av Pablo Galindo. Bidrag från Pablo Galindo och Christian Heimes med bidrag från Gregory P. Smith [Google] och Mark Shannon i gh-96123)

Nya moduler

  • Ingen.

Förbättrade moduler

array

asyncio

  • Prestandan för att skriva till sockets i asyncio har förbättrats avsevärt. asyncio undviker nu onödig kopiering när man skriver till sockets och använder sendmsg() om plattformen stöder det. (Bidrag från Kumar Aditya i gh-91166.)

  • Lägg till funktionerna asyncio.eager_task_factory() och asyncio.create_eager_task_factory() för att göra det möjligt att välja en händelseslinga för att utföra eager-uppgifter, vilket gör vissa användningsfall 2x till 5x snabbare. (Bidrag från Jacob Bower & Itamar Oren i gh-102853, gh-104140, och gh-104138)

  • På Linux använder asyncio asyncio.PidfdChildWatcher som standard om os.pidfd_open() är tillgänglig och fungerar istället för asyncio.ThreadedChildWatcher. (Bidrag från Kumar Aditya i gh-98024.)

  • Händelseslingan använder nu den bästa tillgängliga barnövervakaren för varje plattform (asyncio.PidfdChildWatcher om den stöds och asyncio.ThreadedChildWatcher annars), så det rekommenderas inte att manuellt konfigurera en barnövervakare. (Bidrag från Kumar Aditya i gh-94597.)

  • Lägg till parametern loop_factory i asyncio.run() för att tillåta specificering av en anpassad fabrik för händelseslingor. (Bidrag från Kumar Aditya i gh-99388.)

  • Lägg till C-implementering av asyncio.current_task() för 4x-6x högre hastighet. (Bidrag från Itamar Oren och Pranav Thulasiram Bhat i gh-100344.)

  • asyncio.iscoroutine() returnerar nu False för generatorer eftersom asyncio inte stöder äldre generatorbaserade coroutines. (Bidrag från Kumar Aditya i gh-102748.)

  • asyncio.wait() och asyncio.as_completed() accepterar nu generatorer som ger uppgifter. (Bidrag från Kumar Aditya i gh-78530.)

kalender

csv

dis

  • Opkoder för pseudoinstruktioner (som används av kompilatorn men som inte visas i körbar bytecode) exponeras nu i modulen dis. HAVE_ARGUMENT är fortfarande relevant för riktiga opkoder, men det är inte användbart för pseudoinstruktioner. Använd den nya dis.hasarg-samlingen istället. (Bidrag från Irit Katriel i gh-94216.)

  • Lägg till dis.hasexc-samlingen för att markera instruktioner som anger en undantagshanterare. (Bidrag från Irit Katriel i gh-94216.)

fraktioner

importlib.resurser

inspektera

itertools

  • Lägg till itertools.batched() för insamling i jämnstora tupler där den sista batchen kan vara kortare än resten. (Bidrag från Raymond Hettinger i gh-98363.)

matematik

  • Lägg till math.sumprod() för att beräkna en summa av produkter. (Bidrag från Raymond Hettinger i gh-100485.)

  • Utöka math.nextafter() till att inkludera ett steps-argument för att flytta upp eller ner flera steg åt gången. (Bidrag från Matthias Goergens, Mark Dickinson och Raymond Hettinger i gh-94906.)

os

  • Lägg till os.PIDFD_NONBLOCK för att öppna en filbeskrivare för en process med os.pidfd_open() i icke-blockerande läge. (Bidrag från Kumar Aditya i gh-93312.)

  • os.DirEntry innehåller nu en os.DirEntry.is_junction()-metod för att kontrollera om posten är en korsning. (Bidrag från Charles Machalow i gh-99547.)

  • Lägg till funktionerna os.listdrives(), os.listvolumes() och os.listmounts() i Windows för att räkna upp enheter, volymer och monteringspunkter. (Bidrag från Steve Dower i gh-102519.)

  • os.stat() och os.lstat() är nu mer exakta i Windows. Fältet st_birthtime kommer nu att fyllas med filens skapelsetid och st_ctime är föråldrat men innehåller fortfarande skapelsetiden (men kommer i framtiden att returnera den senaste metadataändringen, för konsistens med andra plattformar). st_dev kan vara upp till 64 bitar och st_ino upp till 128 bitar beroende på ditt filsystem, och st_rdev sätts alltid till noll snarare än felaktiga värden. Båda funktionerna kan vara betydligt snabbare på nyare versioner av Windows. (Bidrag från Steve Dower i gh-99726.)

os.sökväg

sökväg

plattform

  • Lägg till stöd för att upptäcka Windows 11 och Windows Server-versioner efter 2012. Tidigare returnerade uppslagningar på Windows Server-plattformar nyare än Windows Server 2012 och på Windows 11 Windows-10. (Bidrag från Steve Dower i gh-89545.)

pdb

  • Lägg till bekvämlighetsvariabler för att hålla värden tillfälligt för felsökningssessioner och ge snabb åtkomst till värden som den aktuella ramen eller returvärdet. (Bidrag från Tian Gao i gh-103693.)

slumpvis

shutil

  • shutil.make_archive() skickar nu root_dir-argumentet till anpassade arkiverare som stöder det. I det här fallet ändras inte längre processens aktuella arbetskatalog tillfälligt till root_dir för att utföra arkivering. (Bidrag från Serhiy Storchaka i gh-74696.)

  • shutil.rmtree() accepterar nu ett nytt argument onexc som är en felhanterare som onerror men som förväntar sig en undantagsinstans snarare än en (typ, val, tb) triplett. onerror är föråldrad. (Bidrag från Irit Katriel i gh-102828.)

  • shutil.which() använder nu miljövariabeln PATHEXT för att hitta matchningar inom PATH på Windows även när den givna cmd innehåller en katalogkomponent. (Bidrag från Charles Machalow i gh-103179.)

    shutil.which() kommer att anropa NeedCurrentDirectoryForExePathW vid sökning efter körbara filer i Windows för att avgöra om den aktuella arbetskatalogen ska läggas till i sökvägen. (Bidrag från Charles Machalow i gh-103179.)

    shutil.which() kommer att returnera en sökväg som matchar cmd med en komponent från PATHEXT före en direkt matchning någon annanstans i sökvägen på Windows. (Bidrag från Charles Machalow i gh-103179.)

sqlite3

statistik

  • Utöka statistics.correlation() till att inkludera som en rankad metod för att beräkna Spearman-korrelationen för rankade data. (Bidrag från Raymond Hettinger i gh-95861.)

system

tempfil

gängning

tkinter

  • tkinter.Canvas.coords() plattar nu ut sina argument. Den accepterar nu inte bara koordinater som separata argument (x1, y1, x2, y2, ...) och en sekvens av koordinater ([x1, y1, x2, y2, ...]), utan även koordinater grupperade i par ((x1, y1), (x2, y2), ... och [(x1, y1), (x2, y2), ...]), som create_*() metoder. (Bidrag från Serhiy Storchaka i gh-94473.)

tokenisera

typer

typing

  • isinstance()-kontroller mot runtime-checkable protocols använder nu inspect.getattr_static() istället för hasattr() för att kontrollera om attribut existerar. Detta innebär att beskrivningar och __getattr__()-metoder inte längre oväntat utvärderas under isinstance()-kontroller mot runtime-checkable-protokoll. Det kan dock också innebära att vissa objekt som tidigare betraktades som instanser av ett runtime-checkable-protokoll inte längre betraktas som instanser av det protokollet i Python 3.12+, och vice versa. De flesta användare kommer troligen inte att påverkas av denna ändring. (Bidrag från Alex Waygood i gh-102433.)

  • Medlemmarna i ett runtime-checkable-protokoll anses nu vara ”frysta” vid runtime så snart klassen har skapats. Att monkey-patcha attribut på ett runtime-checkable protokoll kommer fortfarande att fungera, men kommer inte att ha någon inverkan på isinstance()-kontroller som jämför objekt med protokollet. Till exempel:

    >>> from typing import Protocol, runtime_checkable
    >>> @runtime_checkable
    ... class HasX(Protocol):
    ...     x = 1
    ...
    >>> class Foo: ...
    ...
    >>> f = Foo()
    >>> isinstance(f, HasX)
    False
    >>> f.x = 1
    >>> isinstance(f, HasX)
    True
    >>> HasX.y = 2
    >>> isinstance(f, HasX)  # unchanged, even though HasX now also has a "y" attribute
    True
    

    Denna ändring gjordes för att snabba upp isinstance()-kontrollerna mot protokoll som kan kontrolleras under körning.

  • Prestandaprofilen för isinstance() kontrollerar mot runtime-checkable protocols har ändrats avsevärt. De flesta isinstance()-kontroller mot protokoll med endast några få medlemmar bör vara minst dubbelt så snabba som i 3.11, och vissa kan vara 20 gånger snabbare eller mer. Dock kan isinstance()-kontroller mot protokoll med många medlemmar vara långsammare än i Python 3.11. (Bidrag från Alex Waygood i gh-74690 och gh-103193.)

  • Alla klasser typing.TypedDict och typing.NamedTuple har nu attributet __orig_bases__. (Bidrag från Adrian Garcia Badaracco i gh-103699.)

  • Lägg till parametern frozen_default till typing.dataclass_transform(). (Bidrag från Erik De Bonte i gh-99957.)

unicodedata

  • Unicode-databasen har uppdaterats till version 15.0.0. (Bidrag från Benjamin Peterson i gh-96734).

unittest

Lägg till ett kommandoradsalternativ --durations som visar de N långsammaste testfallen:

python3 -m unittest --durationer=3 lib.tests.test_threading
.....
Långsammaste testdurationer
----------------------------------------------------------------------
1.210s test_timeout (Lib.test.test_threading.BarrierTests)
1.003s test_default_timeout (Lib.test.test_threading.BarrierTests)
0.518s test_timeout (Lib.test.test_threading.EventTests)

(0,000 varaktigheter dolda. Använd -v för att visa dessa varaktigheter)
----------------------------------------------------------------------
Körde 158 tester  9,869 sekunder

OK (hoppade över=3)

(Bidrag från Giampaolo Rodola i gh-48330)

uuid

Optimeringar

  • Ta bort medlemmarna wstr och wstr_length från Unicode-objekt. Det minskar objektstorleken med 8 eller 16 byte på 64bitars plattformar. (PEP 623) (Bidrag från Inada Naoki i gh-92536.)

  • Lägg till experimentellt stöd för användning av den binära optimeraren BOLT i byggprocessen, vilket förbättrar prestandan med 1-5%. (Bidrag från Kevin Modzelewski i gh-90536 och justerat av Donghee Na i gh-101525)

  • Snabba upp substitutionen med reguljära uttryck (funktionerna re.sub() och re.subn() och motsvarande re.Pattern-metoder) för ersättningssträngar som innehåller gruppreferenser med 2–3 gånger. (Bidrag från Serhiy Storchaka i gh-91524.)

  • Snabba upp skapandet av asyncio.Task genom att skjuta upp dyr strängformatering. (Bidrag från Itamar Oren i gh-103793.)

  • Funktionerna tokenize.tokenize() och tokenize.generate_tokens() är upp till 64% faster som en bieffekt av de ändringar som krävs för att täcka PEP 701 i modulen tokenize. (Bidrag från Marta Gómez Macías och Pablo Galindo i gh-102856.)

  • Snabba upp super() metodanrop och attributladdningar via den nya LOAD_SUPER_ATTR instruktionen. (Bidrag från Carl Meyer och Vladimir Matveev i gh-103497.)

CPython bytecode-ändringar

Demonstrationer och verktyg

  • Ta bort katalogen Tools/demo/ som innehöll gamla demoskript. En kopia finns i old-demos-projektet. (Bidrag från Victor Stinner i gh-97681.)

  • Ta bort föråldrade exempelskript från katalogen Tools/scripts/. En kopia finns i old-demos-projektet. (Bidrag från Victor Stinner i gh-97669.)

Föråldrat

  • argparse: Parametrarna type, choices och metavar i argparse.BooleanOptionalAction är föråldrade och kommer att tas bort i 3.14. (Bidrag från Nikita Sobolev i gh-92248.)

  • ast: Följande ast-funktioner har varit föråldrade i dokumentationen sedan Python 3.8, orsakar nu en DeprecationWarning som skickas ut vid körning när de nås eller används, och kommer att tas bort i Python 3.14:

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NamnKonstant

    • ast.Ellipsis

    Använd ast.Constant istället. (Bidrag från Serhiy Storchaka i gh-90953.)

  • asyncio:

    • Barnvaktklasserna asyncio.MultiLoopChildWatcher, asyncio.FastChildWatcher, asyncio.AbstractChildWatcher och asyncio.SafeChildWatcher är föråldrade och kommer att tas bort i Python 3.14. (Bidrag från Kumar Aditya i gh-94597.)

    • asyncio.set_child_watcher(), asyncio.get_child_watcher(), asyncio.AbstractEventLoopPolicy.set_child_watcher() och asyncio.AbstractEventLoopPolicy.get_child_watcher() är föråldrade och kommer att tas bort i Python 3.14. (Bidrag från Kumar Aditya i gh-94597.)

    • Metoden get_event_loop() för standardpolicyn för händelseslingor avger nu en DeprecationWarning om det inte finns någon aktuell händelseslinga och den bestämmer sig för att skapa en. (Bidrag från Serhiy Storchaka och Guido van Rossum i gh-100160.)

  • calendar: Konstanterna calendar.January och calendar.February är föråldrade och ersätts av calendar.JANUARY och calendar.FEBRUARY. (Bidrag från Prince Roshan i gh-103636.)

  • collections.abc: Föråldrad collections.abc.ByteString. Föredra Sequence eller collections.abc.Buffer. För användning vid typning, föredra en union, som bytes | bytearray, eller collections.abc.Buffer. (Bidrag från Shantanu Jain i gh-91896.)

  • datetime: datetime.datetime:s utcnow() och utcfromtimestamp() är föråldrade och kommer att tas bort i en framtida version. Använd istället tidszonmedvetna objekt för att representera datatider i UTC: anropa now() respektive fromtimestamp() med parametern tz inställd på datetime.UTC. (Bidrag från Paul Ganssle i gh-103857.)

  • email: Avveckla parametern isdst i email.utils.localtime(). (Bidrag från Alan Williams i gh-72346.)

  • importlib.abc: Föråldrade följande klasser, planerade att tas bort i Python 3.14:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    Använd importlib.resources.abc-klasser istället:

    (Bidrag från Jason R. Coombs och Hugo van Kemenade i gh-93963.)

  • itertools: Avveckla stödet för copy-, deepcopy- och pickle-operationer, som är odokumenterade, ineffektiva, historiskt sett buggiga och inkonsekventa. Detta kommer att tas bort i 3.14 för en betydande minskning av kodvolymen och underhållsbördan. (Bidrag från Raymond Hettinger i gh-101588.)

  • multiprocessing: I Python 3.14 kommer standardstartmetoden multiprocessing att ändras till en säkrare metod på Linux, BSD och andra icke-macOS POSIX-plattformar där 'fork' för närvarande är standard (gh-84559). Att lägga till en körtidsvarning om detta ansågs vara alltför störande eftersom majoriteten av koden inte förväntas bry sig. Använd API:erna get_context() eller set_start_method() för att uttryckligen ange när din kod kräver 'fork'. Se kontexter och startmetoder.

  • pkgutil: pkgutil.find_loader() och pkgutil.get_loader() är föråldrade och kommer att tas bort i Python 3.14; använd importlib.util.find_spec() istället. (Bidrag från Nikita Sobolev i gh-97850.)

  • pty: Modulen har två odokumenterade funktioner master_open() och lave_open() som har varit avförda sedan Python 2 men som fick en korrekt DeprecationWarning först i 3.12. Ta bort dem i 3.14. (Bidrag från Soumendra Ganguly och Gregory P. Smith i gh-85984.)

  • os:

    • Fälten st_ctime som returneras av os.stat() och os.lstat() på Windows är föråldrade. I en framtida version kommer de att innehålla tiden för den senaste ändringen av metadata, i enlighet med andra plattformar. För närvarande innehåller de fortfarande skapelsetiden, som också är tillgänglig i det nya fältet st_birthtime. (Bidrag från Steve Dower i gh-99726.)

    • På POSIX-plattformar kan os.fork() nu ge upphov till en DeprecationWarning när den upptäcker att den anropas från en flertrådad process. Det har alltid funnits en grundläggande inkompatibilitet med POSIX-plattformen när man gör detta. Även om sådan kod verkade fungera. Vi lade till varningen för att öka medvetenheten eftersom problem som uppstår med kod som gör detta blir allt vanligare. Se os.fork()-dokumentationen för mer information tillsammans med den här diskussionen om att fork är inkompatibel med trådar för varför vi nu visar detta långvariga plattformskompatibilitetsproblem för utvecklare.

    När denna varning visas på grund av användning av multiprocessing eller concurrent.futures är lösningen att använda en annan multiprocessing-startmetod som "spawn" eller "forkserver".

  • shutil: Argumentet onerror i shutil.rmtree() är föråldrat; använd onexc istället. (Bidrag från Irit Katriel i gh-102828.)

  • sqlite3:

  • sys: Fälten sys.last_type, sys.last_value och sys.last_traceback är föråldrade. Använd sys.last_exc istället. (Bidrag från Irit Katriel i gh-102778.)

  • tarfile: Att extrahera tar-arkiv utan att ange filter är föråldrat fram till Python 3.14, då filtret 'data' blir standard. Se Filter för utsugning för detaljer.

  • typning:

  • xml.etree.ElementTree: Modulen avger nu DeprecationWarning när den testar sanningsvärdet för ett xml.etree.ElementTree.Element. Tidigare gav Python-implementationen ut FutureWarning och C-implementationen gav inte ut någonting. (Bidrag från Jacob Walls i gh-83122.)

  • 3-arg-signaturerna (typ, värde, spårning) för coroutine throw(), generator throw() och async generator throw() är föråldrade och kan tas bort i en framtida version av Python. Använd single-arg-versionerna av dessa funktioner istället. (Bidrag från Ofey Chan i gh-89874.)

  • DeprecationWarning visas nu när __package__ på en modul skiljer sig från __spec__.parent (tidigare var det ImportWarning). (Bidrag från Brett Cannon i gh-65961.)

  • Att ställa in __package__ eller __cached__ på en modul är föråldrat och kommer att upphöra att ställas in eller tas i beaktande av importsystemet i Python 3.14. (Bidrag från Brett Cannon i gh-65961.)

  • Den bitvisa inversionsoperatorn (~) på bool är föråldrad. Det kommer att kasta ett fel i Python 3.16. Använd not för logisk negation av booler istället. I det sällsynta fallet att du verkligen behöver den bitvisa inversionen av den underliggande int, konvertera till int uttryckligen: ~int(x). (Bidrag från Tim Hoffmann i gh-103487.)

  • Åtkomst till co_lnotab på kodobjekt avförklarades i Python 3.10 via PEP 626, men det fick en riktig DeprecationWarning först i 3.12. Kan komma att tas bort i 3.15. (Bidrag från Nikita Sobolev i gh-101866.)

Väntande borttagningar i Python 3.13

Moduler (se PEP 594):

  • aifc

  • audioop

  • cgi

  • cgitb

  • chunk

  • crypt

  • imghdr

  • mailcap

  • msilib

  • nis

  • nntplib

  • ossaudiodev

  • pipes

  • sndhdr

  • spwd

  • sunau

  • telnetlib

  • uu

  • xdrlib

Övriga moduler:

  • lib2to3, och programmet 2to3 (gh-84540)

API:er:

Väntar på borttagning i Python 3.14

  • argparse: Parametrarna type, choices och metavar i argparse.BooleanOptionalAction är föråldrade och kommer att tas bort i 3.14. (Bidrag från Nikita Sobolev i gh-92248.)

  • ast: Följande funktioner har varit föråldrade i dokumentationen sedan Python 3.8, orsakar nu en DeprecationWarning vid körning när de nås eller används, och kommer att tas bort i Python 3.14:

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NamnKonstant

    • ast.Ellipsis

    Använd ast.Constant istället. (Bidrag från Serhiy Storchaka i gh-90953.)

  • asyncio:

    • Barnvaktklasserna asyncio.MultiLoopChildWatcher, asyncio.FastChildWatcher, asyncio.AbstractChildWatcher och asyncio.SafeChildWatcher är föråldrade och kommer att tas bort i Python 3.14. (Bidrag från Kumar Aditya i gh-94597.)

    • asyncio.set_child_watcher(), asyncio.get_child_watcher(), asyncio.AbstractEventLoopPolicy.set_child_watcher() och asyncio.AbstractEventLoopPolicy.get_child_watcher() är föråldrade och kommer att tas bort i Python 3.14. (Bidrag från Kumar Aditya i gh-94597.)

    • Metoden get_event_loop() för standardpolicyn för händelseslingor avger nu en DeprecationWarning om det inte finns någon aktuell händelseslinga och den bestämmer sig för att skapa en. (Bidrag från Serhiy Storchaka och Guido van Rossum i gh-100160.)

  • collections.abc: Föråldrad collections.abc.ByteString. Föredra Sequence eller Buffer. För användning vid typning, föredra en union, som bytes | bytearray, eller collections.abc.Buffer. (Bidrag från Shantanu Jain i gh-91896.)

  • email: Föråldrad isdst parameter i email.utils.localtime(). (Bidrag från Alan Williams i gh-72346.)

  • importlib.abc föråldrade klasser:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    Använd importlib.resources.abc-klasser istället:

    (Bidrag från Jason R. Coombs och Hugo van Kemenade i gh-93963.)

  • itertools hade odokumenterat, ineffektivt, historiskt buggigt och inkonsekvent stöd för copy-, deepcopy- och pickle-operationer. Detta kommer att tas bort i 3.14 för en betydande minskning av kodvolymen och underhållsbördan. (Bidrag från Raymond Hettinger i gh-101588.)

  • multiprocessing: Standardstartmetoden kommer att ändras till en säkrare metod på Linux, BSD och andra POSIX-plattformar som inte är MacOS där 'fork' för närvarande är standard (gh-84559). Att lägga till en körtidsvarning om detta ansågs vara alltför störande eftersom majoriteten av koden inte förväntas bry sig. Använd API:erna get_context() eller set_start_method() för att uttryckligen ange när din kod kräver 'fork'. Se Sammanhang och startmetoder.

  • pathlib: is_relative_to() och relative_to(): att skicka ytterligare argument är föråldrat.

  • pkgutil: pkgutil.find_loader() och pkgutil.get_loader() ger nu upphov till DeprecationWarning; använd importlib.util.find_spec() istället. (Bidrag från Nikita Sobolev i gh-97850.)

  • pty:

  • sqlite3:

  • typing: typing.ByteString, föråldrad sedan Python 3.9, orsakar nu att en DeprecationWarning sänds ut när den används.

  • urllib: urllib.parse.Quoter is deprecated: det var inte avsett att vara ett offentligt API. (Bidrag från Gregory P. Smith i gh-88168.)

Väntar på borttagning i Python 3.15

  • Importsystemet:

    • Att ställa in __cached__ på en modul samtidigt som man misslyckas med att ställa in __spec__.cached är föråldrat. I Python 3.15 kommer __cached__ inte längre att anges eller tas i beaktande av importsystemet eller standardbiblioteket. (gh-97879)

    • Att ställa in __package__ på en modul utan att ställa in __spec__.parent är föråldrat. I Python 3.15 kommer __package__ inte längre att anges eller tas i beaktande av importsystemet eller standardbiblioteket. (gh-97879)

  • ctypes:

    • Den odokumenterade ctypes.SetPointerType()-funktionen är föråldrad sedan Python 3.13.

  • http.server:

    • Den föråldrade och sällan använda CGIHTTPRequestHandler har utgått sedan Python 3.13. Ingen direkt ersättare finns. Anything är bättre än CGI för att koppla en webbserver till en request-hanterare.

    • Flaggan --cgi till kommandoradsgränssnittet python -m http.server har utgått sedan Python 3.13.

  • importlib:

    • load_module() metod: använd exec_module() istället.

  • locale:

  • pathlib:

  • plattform:

    • java_ver() har utgått sedan Python 3.13. Denna funktion är endast användbar för Jython-stöd, har ett förvirrande API och är i stort sett otestad.

  • sysconfig:

  • threading:

    • RLock() kommer inte att ta några argument i Python 3.15. Att skicka några argument har varit föråldrat sedan Python 3.14, eftersom Python-versionen inte tillåter några argument, men C-versionen tillåter valfritt antal positionella eller nyckelordsargument och ignorerar varje argument.

  • types:

  • typning:

    • Den odokumenterade syntaxen för nyckelordsargument för att skapa NamedTuple-klasser (till exempel Point = NamedTuple("Point", x=int, y=int)) har utgått sedan Python 3.13. Använd den klassbaserade syntaxen eller den funktionella syntaxen istället.

    • När man använder den funktionella syntaxen för TypedDicts, att inte skicka ett värde till parametern fields (TD = TypedDict("TD")) eller att skicka None (TD = TypedDict("TD", None)) har varit föråldrat sedan Python 3.13. Använd class TD(TypedDict): pass eller TD = TypedDict("TD", {}) för att skapa en TypedDict med noll fält.

    • Dekoratorfunktionen typing.no_type_check_decorator() har varit föråldrad sedan Python 3.13. Efter åtta år i modulen typing har den ännu inte fått stöd av någon större typkontroll.

  • våg:

  • zipimport:

Väntar på borttagning i Python 3.16

Väntar på borttagning i Python 3.17

  • typning:

    • Före Python 3.14 implementerades gamla tiders unioner med hjälp av den privata klassen typing._UnionGenericAlias. Denna klass behövs inte längre för implementationen, men den har behållits för bakåtkompatibilitet, med borttagning planerad till Python 3.17. Användare bör använda dokumenterade introspektionshjälpmedel som typing.get_origin() och typing.get_args() istället för att förlita sig på privata implementationsdetaljer.

Avser att tas bort i framtida versioner

Följande API:er kommer att tas bort i framtiden, även om det för närvarande inte finns något datum för när de ska tas bort.

  • argparse:

    • Nesting av argumentgrupper och nesting av ömsesidigt uteslutande grupper är avförda.

    • Att skicka det odokumenterade nyckelordsargumentet prefix_chars till add_argument_group() är nu föråldrat.

    • Typomvandlaren argparse.FileType är föråldrad.

  • builtins:

    • bool(NotImplemented).

    • Generatorer: throw(type, exc, tb) och athrow(type, exc, tb) signaturen är förbrukad: använd throw(exc) och athrow(exc) istället, signaturen med ett enda argument.

    • För närvarande accepterar Python numeriska literaler omedelbart följt av nyckelord, till exempel 0in x, 1or x, 0if 1else 2. Det tillåter förvirrande och tvetydiga uttryck som [0x1for x in y] (som kan tolkas som [0x1 for x in y] eller [0x1f or x in y]). En syntaxvarning visas om den numeriska litteralen omedelbart följs av något av nyckelorden and, else, for, if, in, is och or. I en framtida version kommer det att ändras till ett syntaxfel. (gh-87999)

    • Stöd för metoderna __index__() och __int__() som returnerar icke-int-typer: dessa metoder kommer att behöva returnera en instans av en strikt underklass av int.

    • Stöd för metoden __float__() som returnerar en strikt underklass av float: dessa metoder måste returnera en instans av float.

    • Stöd för metoden __complex__() som returnerar en strikt underklass av complex: dessa metoder måste returnera en instans av complex.

    • Delegering av int() till metoden __trunc__().

    • Att skicka ett komplext tal som real eller imag argument i complex()-konstruktorn är nu föråldrat; det bör endast skickas som ett enda positionellt argument. (Bidrag från Serhiy Storchaka i gh-109218.)

  • calendar: Konstanterna calendar.January och calendar.February är föråldrade och ersätts av calendar.JANUARY och calendar.FEBRUARY. (Bidrag från Prince Roshan i gh-103636.)

  • codecs: använd open() istället för codecs.open(). (gh-133038)

  • codeobject.co_lnotab: använd istället metoden codeobject.co_lines().

  • datetime:

    • utcnow(): använd datetime.datetime.now(tz=datetime.UTC).

    • utcfromtimestamp(): använd datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).

  • gettext: Pluralvärdet måste vara ett heltal.

  • importlib:

    • cache_from_source() Parametern debug_override är föråldrad: använd parametern optimization istället.

  • importlib.metadata:

    • EntryPoints tuple-gränssnitt.

    • Implicit None på returvärden.

  • logging: metoden warn() har utgått sedan Python 3.3, använd warning() istället.

  • mailbox: Användning av StringIO-ingång och textläge är föråldrad, använd BytesIO och binärt läge istället.

  • os: Anropar os.register_at_fork() i flertrådad process.

  • pydoc.ErrorDuringImport: Ett tupelvärde för parametern exc_info är föråldrat, använd en undantagsinstans.

  • re: Strängare regler tillämpas nu för numeriska gruppreferenser och gruppnamn i reguljära uttryck. Endast sekvenser av ASCII-siffror accepteras nu som numeriska referenser. Gruppnamnet i bytesmönster och ersättningssträngar kan nu endast innehålla ASCII-bokstäver och siffror samt understreck. (Bidrag från Serhiy Storchaka i gh-91760.)

  • modulerna sre_compile, sre_constants och sre_parse.

  • shutil: rmtree():s parameter onerror är föråldrad i Python 3.12; använd istället parametern onexc.

  • ssl alternativ och protokoll:

    • ssl.SSLContext utan protokollargument är föråldrad.

    • ssl.SSLContext: set_npn_protocols() and selected_npn_protocol() are deprecated: use ALPN instead.

    • ssl.OP_NO_SSL* alternativ

    • ssl.OP_NO_TLS* alternativ

    • ssl.PROTOCOL_SSLv3

    • ssl.PROTOCOL_TLS

    • ssl.PROTOCOL_TLSv1

    • ssl.PROTOCOL_TLSv1_1

    • ssl.PROTOCOL_TLSv1_2

    • ssl.TLSVersion.SSLv3

    • ssl.TLSVersion.TLSv1

    • ssl.TLSVersion.TLSv1_1

  • threading metoder:

  • typing.Text (gh-92332).

  • Den interna klassen typing._UnionGenericAlias används inte längre för att implementera typing.Union. För att bevara kompatibiliteten med användare som använder denna privata klass, kommer en kompatibilitets-shim att tillhandahållas åtminstone fram till Python 3.17. (Bidrag från Jelle Zijlstra i gh-105499.)

  • unittest.IsolatedAsyncioTestCase: det är förkastligt att returnera ett värde som inte är None från ett testfall.

  • urllib.parse föråldrade funktioner: urlparse() istället

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvärde()

    • to_bytes()

  • wsgiref: SimpleHandler.stdout.write() bör inte göra partiella skrivningar.

  • xml.etree.ElementTree: Att testa sanningsvärdet för en Element är föråldrat. I en framtida version kommer det alltid att returnera True. Föredra istället explicita len(elem) eller elem is not None tester.

  • sys._clear_type_cache() är föråldrad: använd sys._clear_internal_caches() istället.

Borttagen

asynchat och asyncore

  • Dessa två moduler har tagits bort enligt schemat i PEP 594, efter att ha blivit föråldrade i Python 3.6. Använd asyncio istället. (Bidrag från Nikita Sobolev i gh-96580.)

configparser

distutils

  • Ta bort paketet distutils. Det utrangerades i Python 3.10 genom PEP 632 ”Deprecate distutils module”. För projekt som fortfarande använder distutils och inte kan uppdateras till något annat, kan setuptools-projektet installeras: det tillhandahåller fortfarande distutils. (Bidrag från Victor Stinner i gh-92584.)

säkerställa pip

  • Ta bort det medföljande setuptools-hjulet från ensurepip, och sluta installera setuptools i miljöer som skapats av venv.

    pip (>= 22.1) kräver inte att setuptools installeras i miljön. setuptools-baserade (och distutils-baserade) paket kan fortfarande användas med pip install, eftersom pip kommer att tillhandahålla setuptools i den byggmiljö som används för att bygga ett paket.

    easy_install, pkg_resources, setuptools och distutils tillhandahålls inte längre som standard i miljöer som skapats med venv eller startats upp med ensurepip, eftersom de är en del av paketet setuptools. För projekt som förlitar sig på dessa vid körning bör setuptools-projektet deklareras som ett beroende och installeras separat (vanligtvis med pip).

    (Bidrag från Pradyun Gedam i gh-95299.)

enum

  • Ta bort enum:s EnumMeta.__getattr__, som inte längre behövs för åtkomst till enumattribut. (Bidrag från Ethan Furman i gh-95083.)

ftplib

  • Ta bort ftplib:s klassattribut FTP_TLS.ssl_version: använd parametern context istället. (Bidrag från Victor Stinner i gh-94172.)

gzip

  • Ta bort attributet filename i gzip:s gzip.GzipFile, föråldrat sedan Python 2.6, använd istället attributet name. I skrivläge lade attributet filename till filändelsen '.gz om den inte fanns. (Bidrag från Victor Stinner i gh-94196.)

hashlib

  • Ta bort den rena Python-implementationen av hashlibhashlib.pbkdf2_hmac(), som är föråldrad i Python 3.10. Python 3.10 och nyare kräver OpenSSL 1.1.1 (PEP 644): denna OpenSSL-version tillhandahåller en C-implementering av pbkdf2_hmac() som är snabbare. (Bidrag från Victor Stinner i gh-94199.)

importlib

  • Många tidigare avskrivna upprensningar i importlib har nu slutförts:

    • Referenser till och stöd för module_repr() har tagits bort. (Bidrag från Barry Warsaw i gh-97850.)

    • importlib.util.set_package, importlib.util.set_loader och importlib.util.module_for_loader har alla tagits bort. (Bidrag från Brett Cannon och Nikita Sobolev i gh-65961 och gh-97850.)

    • Stöd för API:erna find_loader() och find_module() har tagits bort. (Bidrag från Barry Warsaw i gh-98040.)

    • importlib.abc.Finder, pkgutil.ImpImporter och pkgutil.ImpLoader har tagits bort. (Bidrag från Barry Warsaw i gh-98040.)

imp

  • Modulen imp har tagits bort. (Bidrag från Barry Warsaw i gh-98040.)

    För att migrera, se följande korrespondenstabell:

    imp

    importlib

    imp.NullImporter

    Infoga None i sys.path_importer_cache

    imp.cache_from_source()

    importlib.util.cache_from_source()

    imp.find_module()

    importlib.util.find_spec()

    imp.get_magic()

    importlib.util.MAGIC_NUMBER

    imp.get_suffixes()

    importlib.machinery.SOURCE_SUFFIXES, importlib.machinery.EXTENSION_SUFFIXES, och importlib.machinery.BYTECODE_SUFFIXES

    imp.get_tag()

    sys.implementation.cache_tag

    imp.load_module()

    importlib.import_module()

    imp.ny_modul(namn)

    types.Modultyp(namn)

    imp.reload()

    importlib.reload()

    imp.source_from_cache()

    importlib.util.source_from_cache()

    imp.ladda_källa()

    Se nedan

    Ersätt imp.load_source() med:

    import importlib.util
    import importlib.machinery
    
    def load_source(modname, filename):
        loader = importlib.machinery.SourceFileLoader(modname, filename)
        spec = importlib.util.spec_from_file_location(modname, filename, loader=loader)
        module = importlib.util.module_from_spec(spec)
        # The module is always executed and not cached in sys.modules.
        # Uncomment the following line to cache the module.
        # sys.modules[module.__name__] = module
        loader.exec_module(module)
        return module
    
  • Ta bort imp funktioner och attribut utan ersättare:

    • Odokumenterade funktioner:

      • imp.init_builtin()

      • imp.load_compiled()

      • imp.load_dynamic()

      • imp.load_package()

    • imp.lock_held(), imp.acquire_lock(), imp.release_lock(): låsschemat har ändrats i Python 3.3 till lås per modul.

    • konstanter för imp.find_module(): SEARCH_ERROR, PY_SOURCE, PY_COMPILED, C_EXTENSION, PY_RESOURCE, PKG_DIRECTORY, C_BUILTIN, PY_FROZEN, PY_CODERESOURCE, IMP_HOOK.

io

  • Ta bort io:s io.OpenWrapper och _pyio.OpenWrapper, föråldrade i Python 3.10: använd bara open() istället. Funktionen open() (io.open()) är en inbyggd funktion. Sedan Python 3.10 är _pyio.open() också en statisk metod. (Bidrag från Victor Stinner i gh-94169.)

lokal

smtpd

  • Modulen smtpd har tagits bort enligt schemat i PEP 594, efter att ha blivit föråldrad i Python 3.4.7 och 3.5.4. Använd PyPI-modulen aiosmtpd eller någon annan asyncio-baserad server istället. (Bidrag från Oleg Iarygin i gh-93243.)

sqlite3

  • Följande odokumenterade sqlite3-funktioner, föråldrade i Python 3.10, är nu borttagna:

    • sqlite3.enable_shared_cache()

    • sqlite3.OptimizedUnicode

    Om en delad cache måste användas öppnar du databasen i URI-läge med frågeparametern cache=shared.

    Textfabriken sqlite3.OptimizedUnicode har varit ett alias för str sedan Python 3.3. Kod som tidigare satte textfabriken till OptimizedUnicode kan antingen använda str explicit, eller förlita sig på standardvärdet som också är str.

    (Bidrag från Erlend E. Aasland i gh-92548.)

ssl

  • Ta bort ssl:s ssl.RAND_pseudo_bytes()-funktion, föråldrad i Python 3.6: använd os.urandom() eller ssl.RAND_bytes() istället. (Bidrag från Victor Stinner i gh-94199.)

  • Ta bort funktionen ssl.match_hostname(). Den var föråldrad i Python 3.7. OpenSSL utför matchning av värdnamn sedan Python 3.7, Python använder inte längre funktionen ssl.match_hostname(). (Bidrag från Victor Stinner i gh-94199.)

  • Ta bort funktionen ssl.wrap_socket(), föråldrad i Python 3.7: skapa istället ett ssl.SSLContext-objekt och anropa dess ssl.SSLContext.wrap_socket-metod. Alla paket som fortfarande använder ssl.wrap_socket() är trasiga och osäkra. Funktionen skickar varken ett SNI TLS-tillägg eller validerar serverns värdnamn. Koden är föremål för CWE 295 (Felaktig validering av certifikat). (Bidrag från Victor Stinner i gh-94199.)

unittest

webbläsare

  • Ta bort stöd för föråldrade webbläsare från webbrowser. De borttagna webbläsarna inkluderar: Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird och Firefox version 35 och lägre (gh-102871).

xml.etree.ElementTree

  • Ta bort metoden ElementTree.Element.copy() i den rena Python-implementationen, föråldrad i Python 3.10, använd funktionen copy.copy() istället. C-implementeringen av xml.etree.ElementTree har ingen copy()-metod, bara en __copy__()-metod. (Bidrag från Victor Stinner i gh-94383.)

zipimport

  • Ta bort zipimport’s find_loader() och find_module() metoder, föråldrade i Python 3.10: använd find_spec() metoden istället. Se PEP 451 för motiveringen. (Bidrag från Victor Stinner i gh-94379.)

Andra

  • Ta bort suspicious-regeln från dokumentationen Makefile och Doc/tools/rstlint.py, båda till förmån för sphinx-lint. (Bidrag från Julien Palard i gh-98179.)

  • Ta bort parametrarna keyfile och certfile från modulerna ftplib, imaplib, poplib och smtplib, och parametrarna key_file, cert_file och check_hostname från modulen http.client, alla föråldrade sedan Python 3.6. Använd parametern context (ssl_context i imaplib) istället. (Bidrag från Victor Stinner i gh-94172.)

  • Ta bort Jython-kompatibilitetshack från flera stdlib-moduler och tester. (Bidrag från Nikita Sobolev i gh-99482.)

  • Ta bort flaggan _use_broken_old_ctypes_structure_semantics_ från modulen ctypes. (Bidrag från Nikita Sobolev i gh-99285.)

Portning till Python 3.12

I det här avsnittet listas tidigare beskrivna ändringar och andra buggfixar som kan kräva ändringar i din kod.

Ändringar i Python API

  • Strängare regler tillämpas nu för numeriska gruppreferenser och gruppnamn i reguljära uttryck. Endast en sekvens av ASCII-siffror accepteras nu som numerisk referens. Gruppnamnet i bytesmönster och ersättningssträngar kan nu endast innehålla ASCII-bokstäver och -siffror samt understreck. (Bidrag från Serhiy Storchaka i gh-91760.)

  • Ta bort randrange() funktionalitet som är föråldrad sedan Python 3.10. Tidigare konverterade randrange(10.0) förlustfritt till randrange(10). Nu ger det upphov till ett TypeError. Undantaget för icke heltalsvärden som randrange(10.5) eller randrange('10') har också ändrats från ValueError till TypeError. Detta förhindrar också buggar där randrange(1e25) tyst skulle välja från ett större intervall än randrange(10**25). (Ursprungligen föreslaget av Serhiy Storchaka gh-86388.)

  • argparse.ArgumentParser ändrade kodning och felhantering för läsning av argument från fil (t.ex. alternativet fromfile_prefix_chars) från standardtextkodning (t.ex. locale.getpreferredencoding(False)) till filesystem encoding and error handler. Argumentfiler bör kodas i UTF-8 istället för ANSI Codepage på Windows.

  • Ta bort den asyncore-baserade modulen smtpd som är föråldrad i Python 3.4.7 och 3.5.4. En rekommenderad ersättning är den asyncio-baserade aiosmtpd PyPI-modulen.

  • shlex.split(): Att skicka None för s-argumentet ger nu upphov till ett undantag, istället för att läsa sys.stdin. Funktionen utrangerades i Python 3.9. (Bidrag från Victor Stinner i gh-94352.)

  • Modulen os accepterar inte längre bytesliknande sökvägar, som typerna bytearray och memoryview: endast den exakta typen bytes accepteras för bytessträngar. (Bidrag från Victor Stinner i gh-98393.)

  • syslog.openlog() och syslog.closelog() misslyckas nu om de används i undertolkare. syslog.syslog() kan fortfarande användas i undertolkare, men nu endast om syslog.openlog() redan har anropats i huvudtolkaren. Dessa nya restriktioner gäller inte för huvudtolken, så endast ett mycket litet antal användare kan komma att påverkas. Den här ändringen hjälper till att isolera tolkar. Dessutom är syslog ett omslag runt processglobala resurser, som bäst hanteras från huvudtolken. (Bidrag från Donghee Na i gh-99127.)

  • Det odokumenterade låsbeteendet för cached_property() har tagits bort, eftersom det låste alla instanser av klassen, vilket ledde till hög låskonkurrens. Detta innebär att en getter-funktion för en cachelagrad egenskap nu kan köras mer än en gång för en enda instans om två trådar tävlar. För de flesta enkla cachade egenskaper (t.ex. de som är idempotenta och helt enkelt beräknar ett värde baserat på andra attribut för instansen) kommer detta att fungera bra. Om synkronisering behövs ska du implementera låsning i getter-funktionen för den cachade egenskapen eller runt åtkomstpunkter med flera trådar.

  • sys._current_exceptions() returnerar nu en mappning från thread-id till en undantagsinstans, snarare än till en (typ, exc, tb)-tupel. (Bidrag från Irit Katriel i gh-103176.)

  • När du extraherar tar-filer med tarfile eller shutil.unpack_archive() kan du använda argumentet filter för att begränsa funktioner som kan vara överraskande eller farliga. Se Filter för utsugning för mer information.

  • Utdata från funktionerna tokenize.tokenize() och tokenize.generate_tokens() har nu ändrats på grund av ändringarna som introducerades i PEP 701. Detta innebär att STRING-tokens inte längre skickas ut för f-strängar och de tokens som beskrivs i PEP 701 produceras nu istället: FSTRING_START, FSTRING_MIDDLE och FSTRING_END emitteras nu för f-strings ”string”-delar utöver de lämpliga tokens för tokeniseringen i uttryckskomponenterna. Till exempel för f-strängen f"start {1+1} end" gav den gamla versionen av tokenizer ut:

    1,0-1,18: STRING 'f"start {1+1} slut"'
    

    medan den nya versionen avger:

    1,0-1,2:            FSTRING_START 'f"'
    1,2-1,8: FSTRING_MIDDLE 'start '
    1,8-1,9: OP '{'
    1,9-1,10: NUMMER '1'
    1,10-1,11: OP '+'
    1,11-1,12: NUMMER '1'
    1,12-1,13: OP "}
    1,13-1,17: FSTRING_MIDDLE ' slut'
    1,17-1,18: FSTRING_END '"'
    

    Dessutom kan det förekomma vissa mindre beteendeförändringar som en följd av de förändringar som krävs för att stödja PEP 701. Några av dessa förändringar inkluderar:

    • Attributet type för de tokens som skickas ut vid tokenisering av vissa ogiltiga Python-tecken som ! har ändrats från ERRORTOKEN till OP.

    • Ofullständiga enradiga strängar ger nu också upphov till tokenize.TokenError på samma sätt som ofullständiga flerradiga strängar gör.

    • Viss ofullständig eller ogiltig Python-kod ger nu upphov till tokenize.TokenError istället för att returnera godtyckliga ERRORTOKEN-tokens när den tokeniseras.

    • Att blanda tabbar och mellanslag som indrag i samma fil stöds inte längre och kommer att ge upphov till ett TabError.

  • Modulen threading förväntar sig nu att modulen _thread har ett attribut för _is_main_interpreter. Det är en funktion utan argument som returnerar True om den aktuella tolken är huvudtolken.

    Alla bibliotek eller program som tillhandahåller en anpassad _thread-modul bör tillhandahålla _is_main_interpreter(). (Se gh-112826.)

Förändringar i byggning

  • Python använder inte längre setup.py för att bygga delade C-tilläggsmoduler. Byggparametrar som rubriker och bibliotek upptäcks i skriptet configure. Tillägg byggs av Makefile. De flesta tillägg använder pkg-config och faller tillbaka på manuell detektering. (Bidrag från Christian Heimes i gh-93939.)

  • va_start() med två parametrar, som va_start(args, format), krävs nu för att bygga Python. va_start() anropas inte längre med en enda parameter. (Bidrag från Kumar Aditya i gh-93207.)

  • CPython använder nu alternativet ThinLTO som standardpolicy för optimering av länktid om Clang-kompilatorn accepterar flaggan. (Bidrag från Donghee Na i gh-89536.)

  • Lägg till variabeln COMPILEALL_OPTS i Makefile för att åsidosätta compileall-alternativen (standard: -j0) i make install. Sammanslog även de 3 compileall-kommandona till ett enda kommando för att bygga .pyc-filer för alla optimeringsnivåer (0, 1, 2) på en gång. (Bidrag från Victor Stinner i gh-99289.)

  • Lägg till plattformstripletter för 64-bitars LoongArch:

    • loongarch64-linux-gnusf

    • loongarch64-linux-gnuf32

    • loongarch64-linux-gnu

    (Bidrag från Zhang Na i gh-90656.)

  • PYTHON_FOR_REGEN kräver nu Python 3.10 eller nyare.

  • Autoconf 2.71 och aclocal 1.16.4 krävs nu för att regenerera configure. (Bidrag från Christian Heimes i gh-89886.)

  • Windows-byggnader och macOS-installationer från python.org använder nu OpenSSL 3.0.

Ändringar i C API

Nya funktioner

  • PEP 683: Introducera Immortal Objects, som gör det möjligt för objekt att kringgå referensräkningar, och relaterade ändringar i C-API:

    • _Py_IMMORTAL_REFCNT: Referensantalet som definierar ett objekt

      som odödlig.

    • _Py_IsImmortal Kontrollerar om ett objekt har det odödliga referensantalet.

    • PyObject_HEAD_INIT Detta kommer nu att initiera referensantalet till

      _Py_IMMORTAL_REFCNT när den används med Py_BUILD_CORE.

    • SSTATE_INTERNED_IMMORTAL En identifierare för internerade unicode-objekt

      som är odödliga.

    • SSTATE_INTERNED_IMMORTAL_STATIC En identifierare för interned unicode

      objekt som är odödliga och statiska

    • sys.getunicodeinternedsize Detta returnerar det totala antalet unicode

      objekt som har internaliserats. Detta behövs nu för att refleak.py korrekt ska kunna spåra referensantal och allokerade block

    (Bidrag från Eddie Elizondo i gh-84436.)

  • PEP 684: Lägg till den nya funktionen Py_NewInterpreterFromConfig() och PyInterpreterConfig, som kan användas för att skapa undertolkar med sina egna GIL:er. (Se PEP 684: En per-tolk GIL för mer information.) (Bidrag från Eric Snow i gh-104110.)

  • I den begränsade C API-versionen 3.12 är funktionerna Py_INCREF() och Py_DECREF() nu implementerade som opaka funktionsanrop för att dölja implementationsdetaljer. (Bidrag från Victor Stinner i gh-105387.)

Portning till Python 3.12

  • Äldre Unicode API:er baserade på Py_UNICODE* representation har tagits bort. Migrera till API:er baserade på UTF-8 eller wchar_t*.

  • Argumenttolkningfunktioner som PyArg_ParseTuple() stöder inte längre format baserade på Py_UNICODE* (t.ex. u, Z). Migrera till andra format för Unicode, såsom s, z, es och U.

  • tp_weaklist för alla statiska inbyggda typer är alltid NULL. Detta är ett internt fält på PyTypeObject men vi påpekar ändringen ifall någon råkar komma åt fältet direkt ändå. För att undvika avbrott, överväg att använda det befintliga offentliga C-API istället, eller, om nödvändigt, det (endast interna) makrot _PyObject_GET_WEAKREFS_LISTPTR().

  • Denna endast interna PyTypeObject.tp_subclasses kanske nu inte är en giltig objektpekare. Dess typ ändrades till void* för att återspegla detta. Vi nämner detta ifall någon råkar komma åt det interna fältet direkt.

    För att få en lista över underklasser anropar du Python-metoden __subclasses__() (till exempel med PyObject_CallMethod()).

  • Lägg till stöd för fler formateringsalternativ (vänsterjustering, oktaler, hexadecimaler med versaler, intmax_t, ptrdiff_t, wchar_t C-strängar, variabel bredd och precision) i PyUnicode_FromFormat() och PyUnicode_FromFormatV(). (Bidrag från Serhiy Storchaka i gh-98836.)

  • Ett formattecken som inte känns igen i PyUnicode_FromFormat() och PyUnicode_FromFormatV() ger nu upphov till SystemError. I tidigare versioner orsakade det att resten av formatsträngen kopierades som den var till resultatsträngen och att alla extra argument kastades bort. (Bidrag från Serhiy Storchaka i gh-95781.)

  • Korrigerar felaktig teckenplacering i PyUnicode_FromFormat() och PyUnicode_FromFormatV(). (Bidrag från Philip Georgi i gh-95504.)

  • Tilläggsklasser som vill lägga till en __dict__ eller svag referensplats bör använda Py_TPFLAGS_MANAGED_DICT och Py_TPFLAGS_MANAGED_WEAKREF istället för tp_dictoffset respektive tp_weaklistoffset. Användningen av tp_dictoffset och tp_weaklistoffset stöds fortfarande, men har inte fullt stöd för multipel nedärvning (gh-95589), och prestanda kan vara sämre. Klasser som deklarerar Py_TPFLAGS_MANAGED_DICT måste anropa _PyObject_VisitManagedDict() och _PyObject_ClearManagedDict() för att korsa och rensa sina instansers ordlistor. För att rensa weakrefs, anropa PyObject_ClearWeakRefs(), som tidigare.

  • Funktionen PyUnicode_FSDecoder() accepterar inte längre bytesliknande sökvägar, som typerna bytearray och memoryview: endast den exakta typen bytes accepteras för bytessträngar. (Bidrag från Victor Stinner i gh-98393.)

  • Makrona Py_CLEAR, Py_SETREF och Py_XSETREF utvärderar nu bara sina argument en gång. Om ett argument har sidoeffekter dupliceras inte längre dessa sidoeffekter. (Bidrag från Victor Stinner i gh-98724.)

  • Tolkens felindikator är nu alltid normaliserad. Detta innebär att PyErr_SetObject(), PyErr_SetString() och de andra funktionerna som anger felindikatorn nu normaliserar undantaget innan det lagras. (Bidrag från Mark Shannon i gh-101578.)

  • _Py_RefTotal är inte längre auktoritativt och finns bara kvar för ABI-kompatibilitet. Observera att det är en intern global och endast tillgänglig på debug-byggnader. Om du råkar använda den så måste du börja använda _Py_GetGlobalRefTotal().

  • Följande funktioner väljer nu en lämplig metaklass för den nyskapade typen:

    Att skapa klasser vars metaklass åsidosätter tp_new är föråldrat, och i Python 3.14+ kommer det att vara otillåtet. Observera att dessa funktioner ignorerar metaklassens tp_new, vilket kan leda till ofullständig initialisering.

    Observera att PyType_FromMetaclass() (tillagd i Python 3.12) redan förbjuder skapandet av klasser vars metaklass åsidosätter tp_new (__new__() i Python).

    Eftersom tp_new åsidosätter nästan allt som PyType_From*-funktioner gör, är de två inkompatibla med varandra. Det befintliga beteendet - att ignorera metaklassen under flera steg av typskapandet - är osäkert i allmänhet, eftersom (meta)klasser antar att tp_new anropades. Det finns ingen enkel allmän lösning. Något av följande kan fungera för dig:

    • Om du kontrollerar metaklassen, undvik att använda tp_new i den:

      • Om initialiseringen kan hoppas över kan den göras i tp_init istället.

      • Om metaklassen inte behöver instansieras från Python, sätt dess tp_new till NULL med flaggan Py_TPFLAGS_DISALLOW_INSTANTIATION. Detta gör den acceptabel för PyType_From* funktioner.

    • Undvik PyType_From*-funktioner: om du inte behöver C-specifika funktioner (slots eller inställning av instansstorlek), skapa typer genom att kalla metaklassen.

    • Om du vet att tp_new kan hoppas över på ett säkert sätt, filtrera bort deprecation-varningen med warnings.catch_warnings() från Python.

  • PyOS_InputHook och PyOS_ReadlineFunctionPointer anropas inte längre i subinterpreters. Detta beror på att klienter i allmänhet förlitar sig på processomfattande globalt tillstånd (eftersom dessa återuppringningar inte har något sätt att återställa tilläggsmodulens tillstånd).

    Detta undviker också situationer där tillägg kan komma att köras i en undertolk som de inte stöder (eller ännu inte har laddats in i). Se gh-104668 för mer information.

  • PyLongObject har fått sina interndelar ändrade för bättre prestanda. Även om de interna fälten i PyLongObject är privata används de av vissa tilläggsmoduler. De interna fälten bör inte längre nås direkt, istället bör API-funktionerna som börjar med PyLong_... användas istället. Två nya instabila API-funktioner tillhandahålls för effektiv åtkomst till värdet av PyLongObject som ryms i ett enda maskinord:

  • Anpassade allokatorer, inställda via PyMem_SetAllocator(), måste nu vara tråd-säkra, oavsett minnesdomän. Allokatorer som inte har sitt eget tillstånd, inklusive ”hooks”, påverkas inte. Om din anpassade allokator inte redan är tråd-säker och du behöver vägledning, skapa ett nytt GitHub-ärende och CC @ericsnowcurrently.

Föråldrat

Väntar på borttagning i Python 3.14

Väntar på borttagning i Python 3.15

Väntar på borttagning i Python 3.16

  • Den medföljande kopian av libmpdec.

Avser att tas bort i framtida versioner

Följande API:er är föråldrade och kommer att tas bort, även om det för närvarande inte finns något datum för när de ska tas bort.

Borttagen

  • Ta bort huvudfilen token.h. Det fanns aldrig något offentligt tokenizer C API. Huvudfilen token.h var endast utformad för att användas av Python-interna funktioner. (Bidrag från Victor Stinner i gh-92651.)

  • Äldre Unicode API:er har tagits bort. Se PEP 623 för detaljer.

    • PyUnicode_WCHAR_KIND

    • PyUnicode_AS_UNICODE()

    • PyUnicode_AsUnicode()

    • PyUnicode_AsUnicodeAndSize()

    • PyUnicode_AS_DATA()

    • PyUnicode_FromUnicode()

    • PyUnicode_GET_SIZE()

    • PyUnicode_GetSize()

    • PyUnicode_GET_DATA_SIZE()

  • Ta bort funktionsmakrot PyUnicode_InternImmortal(). (Bidrag från Victor Stinner i gh-85858.)