Vad är nytt i Python 3.10

Redigerare:

Pablo Galindo Salgado

I den här artikeln förklaras de nya funktionerna i Python 3.10 jämfört med 3.9. Python 3.10 släpptes den 4 oktober 2021. För fullständig information, se changelog.

Sammanfattning – Release highlights

Nya syntaxfunktioner:

  • PEP 634, Matchning av strukturella mönster: Specifikation

  • PEP 635, Matchning av strukturella mönster: Motivation och motivering

  • PEP 636, Matchning av strukturella mönster: handledning

  • bpo-12782, Kontexthanterare med parentes är nu officiellt tillåtna.

Nya funktioner i standardbiblioteket:

  • PEP 618, Lägg till valfri längdkontroll till zip.

Förbättringar av tolkar:

  • PEP 626, Exakta radnummer för felsökning och andra verktyg.

Nya funktioner för skrivning:

  • PEP 604, Tillåt att skriva unionstyper som X | Y

  • PEP 612, Parameter Specifikation Variabler

  • PEP 613, Explicita typ-alias

  • PEP 647, Användardefinierade typskydd

Viktiga avskrivningar, borttagningar eller begränsningar:

  • PEP 644, Kräver OpenSSL 1.1.1 eller nyare

  • PEP 632, Utgå ur distutils modul.

  • PEP 623, Avveckla och förbered för borttagandet av wstr-medlemmen i PyUnicodeObject.

  • PEP 624, Ta bort API:er för Py_UNICODE-kodare

  • PEP 597, Lägg till valfri EncodingWarning

Nya funktioner

Förvaltare av kontext inom parentes

Nu finns det stöd för att använda omslutande parenteser för fortsättning över flera rader i kontexthanterare. Detta gör det möjligt att formatera en lång samling kontexthanterare på flera rader på ett liknande sätt som det tidigare var möjligt med import-satser. Till exempel är alla dessa exempel nu giltiga:

med (CtxManager() som exempel):
    ...

med (
    CtxManager1(),
    CtxManager2()
):
    ...

med (CtxManager1() som exempel,
      CtxManager2()):
    ...

med (CtxManager1(),
      CtxManager2() som exempel):
    ...

med (
    CtxManager1() som exempel1,
    CtxManager2() som exempel2
):
    ...

det är också möjligt att använda ett efterföljande kommatecken i slutet av den bifogade gruppen:

med (
    CtxManager1() som exempel1,
    CtxManager2() som exempel2,
    CtxManager3() som exempel3,
):
    ...

Denna nya syntax använder den nya parserns kapacitet som inte är LL(1). Se PEP 617 för mer information.

(Bidrag från Guido van Rossum, Pablo Galindo och Lysandros Nikolaou i bpo-12782 och bpo-40334.)

Bättre felmeddelanden

Syntaxfel

Vid parsning av kod som innehåller oavslutade parenteser eller hakparenteser inkluderar tolken nu platsen för den oavslutade parentesen eller hakparentesen istället för att visa SyntaxError: unexpected EOF while parsing eller peka på någon felaktig plats. Tänk till exempel på följande kod (lägg märke till det oavslutade ’{’):

expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
            38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
någon_annan_kod = foo()

Tidigare versioner av tolken rapporterade förvirrande platser som platsen för syntaxfelet:

Fil "example.py", rad 3
    någon_annan_kod = foo()
                    ^
SyntaxError: ogiltig syntax

men i Python 3.10 avges ett mer informativt fel:

Fil "exempel.py", rad 1
    expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
               ^
SyntaxError: '{' stängdes aldrig

På liknande sätt pekar fel som involverar oavslutade stränglitteraler (enkel- och trippelciterade) nu på början av strängen istället för att rapportera EOF/EOL.

Dessa förbättringar är inspirerade av tidigare arbete med PyPy-tolken.

(Bidrag från Pablo Galindo i bpo-42864 och Batuhan Taskaya i bpo-40176.)

SyntaxError undantag som tolken gör kommer nu att markera hela felområdet för det uttryck som utgör själva syntaxfelet, istället för bara där problemet upptäcks. På detta sätt, istället för att visa (före Python 3.10):

>>> foo(x, z for z in range(10), t, w)
  File "<stdin>", line 1
    foo(x, z for z in range(10), t, w)
           ^
SyntaxError: Generator expression must be parenthesized

nu kommer Python 3.10 att visa undantaget som:

>>> foo(x, z for z in range(10), t, w)
  File "<stdin>", line 1
    foo(x, z for z in range(10), t, w)
           ^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized

Denna förbättring har gjorts av Pablo Galindo i bpo-43914.

En avsevärd mängd nya specialmeddelanden för SyntaxError-undantag har införts. Några av de mest anmärkningsvärda är följande:

  • Saknar : före block:

    >>> if rocket.position > event_horizon
      File "<stdin>", line 1
        if rocket.position > event_horizon
                                          ^
    SyntaxError: expected ':'
    

    (Bidrag från Pablo Galindo i bpo-42997.)

  • Oparenthesiserade tupler i förståelsemål:

    >>> {x,y for x,y in zip('abcd', '1234')}
      File "<stdin>", line 1
        {x,y for x,y in zip('abcd', '1234')}
         ^
    SyntaxError: did you forget parentheses around the comprehension target?
    

    (Bidrag från Pablo Galindo i bpo-43017.)

  • Kommatecken saknas i samlingslitteraler och mellan uttryck:

    >>> items = {
    ... x: 1,
    ... y: 2
    ... z: 3,
      File "<stdin>", line 3
        y: 2
           ^
    SyntaxError: invalid syntax. Perhaps you forgot a comma?
    

    (Bidrag från Pablo Galindo i bpo-43822.)

  • Flera undantagstyper utan parenteser:

    >>> try:
    ...     build_dyson_sphere()
    ... except NotEnoughScienceError, NotEnoughResourcesError:
      File "<stdin>", line 3
        except NotEnoughScienceError, NotEnoughResourcesError:
               ^
    SyntaxError: multiple exception types must be parenthesized
    

    (Bidrag från Pablo Galindo i bpo-43149.)

  • Saknar : och värden i ordboksliteraler:

    >>> values = {
    ... x: 1,
    ... y: 2,
    ... z:
    ... }
      File "<stdin>", line 4
        z:
         ^
    SyntaxError: expression expected after dictionary key and ':'
    
    >>> values = {x:1, y:2, z w:3}
      File "<stdin>", line 1
        values = {x:1, y:2, z w:3}
                            ^
    SyntaxError: ':' expected after dictionary key
    

    (Bidrag från Pablo Galindo i bpo-43823.)

  • try-block utan except eller finally-block:

    >>> try:
    ...     x = 2
    ... something = 3
      File "<stdin>", line 3
        something  = 3
        ^^^^^^^^^
    SyntaxError: expected 'except' or 'finally' block
    

    (Bidrag från Pablo Galindo i bpo-44305.)

  • Användning av = istället för == i jämförelser:

    >>> if rocket.position = event_horizon:
      File "<stdin>", line 1
        if rocket.position = event_horizon:
                           ^
    SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
    

    (Bidrag från Pablo Galindo i bpo-43797.)

  • Användning av * i f-strängar:

    >>> f"Black holes {*all_black_holes} and revelations"
      File "<stdin>", line 1
        (*all_black_holes)
         ^
    SyntaxError: f-string: cannot use starred expression here
    

    (Bidrag från Pablo Galindo i bpo-41064.)

Indragningsfel

Många IndentationError-undantag har nu mer kontext när det gäller vilken typ av block som förväntade sig en indragning, inklusive platsen för uttalandet:

>>> def foo():
...    if lel:
...    x = 2
  File "<stdin>", line 3
    x = 2
    ^
IndentationError: expected an indented block after 'if' statement in line 2

AttributFel

Vid utskrift av AttributeError kommer PyErr_Display() att ge förslag på liknande attributnamn i det objekt som undantaget uppstod från:

>>> collections.namedtoplo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?

(Bidrag från Pablo Galindo i bpo-38530.)

Varning

Observera att detta inte kommer att fungera om PyErr_Display() inte anropas för att visa felet, vilket kan hända om någon annan anpassad felvisningsfunktion används. Detta är ett vanligt scenario i vissa REPLs som IPython.

NamnFel

Vid utskrift av NameError som uppstått i tolken kommer PyErr_Display() att ge förslag på liknande variabelnamn i den funktion som undantaget uppstått i:

>>> schwarzschild_black_hole = None
>>> schwarschild_black_hole
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?

(Bidrag från Pablo Galindo i bpo-38530.)

Varning

Observera att detta inte kommer att fungera om PyErr_Display() inte anropas för att visa felet, vilket kan hända om någon annan anpassad felvisningsfunktion används. Detta är ett vanligt scenario i vissa REPLs som IPython.

PEP 626: Exakta radnummer för felsökning och andra verktyg

PEP 626 ger mer exakta och tillförlitliga radnummer för verktyg för felsökning, profilering och täckning. Spårningshändelser med korrekt radnummer genereras för alla rader med kod som exekveras och endast för rader med kod som exekveras.

Attributet f_lineno för frame-objekt kommer alltid att innehålla det förväntade radnumret.

Attributet co_lnotab i code objects är föråldrat och kommer att tas bort i 3.12. Kod som behöver konvertera från offset till radnummer bör använda den nya metoden co_lines() istället.

PEP 634: Matchning av strukturella mönster

Strukturell mönstermatchning har lagts till i form av en match statement och case statements av mönster med tillhörande åtgärder. Mönster består av sekvenser, mappningar, primitiva datatyper samt klassinstanser. Mönstermatchning gör det möjligt för program att extrahera information från komplexa datatyper, förgrena sig till datastrukturen och tillämpa specifika åtgärder baserat på olika former av data.

Syntax och operationer

Den generiska syntaxen för mönstermatchning är:

matcha ämne:
    fall <mönster_1>:
        <åtgärd_1>
    fall <mönster_2>:
        <åtgärd_2>
    fall <mönster_3>:
        <handling_3>
    fall _:
        <handling_viltkort>

En match-sats tar ett uttryck och jämför dess värde med på varandra följande mönster som anges i ett eller flera case-block. Specifikt fungerar mönstermatchning genom att:

  1. använda data med typ och form (ämnet)

  2. utvärdering av ämnet i match-satsen

  3. jämför objektet med varje mönster i en ”fall”-förklaring uppifrån och ner tills en matchning bekräftas.

  4. utföra den åtgärd som är associerad med mönstret för den bekräftade matchningen

  5. Om en exakt matchning inte bekräftas kommer det sista fallet, ett jokertecken _, om det anges, att användas som matchningsfall. Om en exakt matchning inte bekräftas och ett jokerteckenfall inte finns, är hela matchningsblocket en no-op.

Deklarativ metod

Läsarna kanske känner till mönstermatchning genom det enkla exemplet att matcha ett subjekt (dataobjekt) mot en bokstav (mönster) med switch-satsen som finns i C, Java eller JavaScript (och många andra språk). Ofta används switch-satsen för att jämföra ett objekt/uttryck med case-satser som innehåller literaler.

Mer kraftfulla exempel på mönstermatchning finns i språk som Scala och Elixir. Med strukturell mönstermatchning är tillvägagångssättet ”deklarativt” och anger uttryckligen villkoren (mönstren) för att data ska matcha.

Även om en ”imperativ” serie instruktioner med nästlade ”if”-satser kan användas för att åstadkomma något som liknar strukturell mönstermatchning, är den mindre tydlig än den ”deklarativa” metoden. Istället anger den ”deklarativa” metoden de villkor som ska uppfyllas för en matchning och är mer läsbar genom sina explicita mönster. Strukturell mönstermatchning kan användas i sin enklaste form för att jämföra en variabel med en bokstav i en case-sats, men dess verkliga värde för Python ligger i hanteringen av ämnets typ och form.

Enkelt mönster: matcha till en bokstav

Låt oss se på det här exemplet som mönstermatchning i sin enklaste form: ett värde, ämnet, matchas mot flera litterala värden, mönstren. I exemplet nedan är status subjektet i matchningssatsen. Mönstren är var och en av fallbeskrivningarna, där bokstäverna representerar statuskoder för begäran. Den åtgärd som är kopplad till fallet utförs efter en matchning:

def http_error(status):
    matcha status:
        fall 400:
            returnera "Dålig förfrågan"
        fall 404:
            returnera "Hittades inte"
        fall 418:
            returnera "Jag är en tekanna"
        fall _:
            returnerar "Något är fel med internet"

Om ovanstående funktion får en status på 418 returneras ”I’m a teapot”. Om ovanstående funktion får en status på 500, kommer case-satsen med _ att matchas som ett jokertecken och ”Något är fel med internet” returneras. Observera det sista blocket: variabelnamnet _ fungerar som ett jokertecken och säkerställer att ämnet alltid kommer att matcha. Användningen av _ är valfri.

Du kan kombinera flera literaler i ett enda mönster med hjälp av | (”eller”):

fall 401 | 403 | 404:
    return "Inte tillåtet"
Beteende utan jokertecken

Om vi ändrar ovanstående exempel genom att ta bort det sista fallblocket blir exemplet:

def http_error(status):
    matcha status:
        fall 400:
            returnera "Dålig förfrågan"
        fall 404:
            returnera "Hittades inte"
        fall 418:
            returnera "Jag är en tekanna"

Utan användning av _ i en case-sats kan det hända att det inte finns någon matchning. Om det inte finns någon matchning är beteendet en no-op. Om t.ex. status 500 skickas, inträffar en no-op.

Mönster med bokstav och variabel

Mönster kan se ut som uppackningsuppdrag, och ett mönster kan användas för att binda variabler. I det här exemplet kan en datapunkt packas upp till dess x-koordinat och y-koordinat:

# punkten är en (x, y) tupel
matcha punkten:
    fall (0, 0):
        print("Ursprung")
    fall (0, y):
        print(f"Y={y}")
    fall (x, 0):
        print(f"X={x}")
    fall (x, y):
        print(f"X={x}, Y={y}")
    fall _:
        raise ValueError("Inte en punkt")

Det första mönstret har två literaler, (0, 0), och kan ses som en utvidgning av det literala mönstret som visas ovan. De två följande mönstren kombinerar en bokstav och en variabel, och variabeln binder ett värde från subjektet (point). Det fjärde mönstret fångar upp två värden, vilket gör att det konceptuellt liknar uppackningsuppgiften (x, y) = point.

Mönster och klasser

Om du använder klasser för att strukturera dina data kan du som mönster använda klassnamnet följt av en argumentlista som liknar en konstruktor. Det här mönstret har möjlighet att fånga upp instansattribut i variabler:

klass Punkt:
    def __init__(self, x, y):
        self.x = x
        self.y = y

def location(punkt):
    matcha punkt:
        fall Punkt(x=0, y=0):
            print("Ursprung är punktens position.")
        fall Punkt(x=0, y=y):
            print(f"Y={y} och punkten ligger på y-axeln.")
        fall Punkt(x=x, y=0):
            print(f"X={x} och punkten ligger på x-axeln.")
        fall Punkt():
            print("Punkten är placerad någon annanstans på planet.")
        fall _:
            print("Inte en punkt")
Mönster med positionella parametrar

Du kan använda positionella parametrar med vissa inbyggda klasser som ger en ordning för sina attribut (t.ex. dataklasser). Du kan också definiera en specifik position för attribut i mönster genom att ställa in specialattributet __match_args__ i dina klasser. Om det är inställt på (”x”, ”y”) är följande mönster alla likvärdiga (och alla binder attributet y till variabeln var):

Punkt(1, var)
Punkt(1, y=var)
Punkt(x=1, y=var)
Punkt(y=var, x=1)

Nästlade mönster

Mönster kan vara godtyckligt nästlade. Om våra data till exempel är en kort lista med punkter, kan de matchas så här:

matchningspunkter:
    fall []:
        print("Inga punkter i listan.")
    fall [Punkt(0, 0)]:
        print("Ursprunget är den enda punkten i listan.")
    fall [Punkt(x, y)]:
        print(f"En enda punkt {x}, {y} finns i listan.")
    fall [Punkt(0, y1), Punkt(0, y2)]:
        print(f"Två punkter på Y-axeln vid {y1}, {y2} finns i listan.")
    fall _:
        print("Något annat finns i listan.")

Komplexa mönster och jokertecken

Hittills har exemplen använt _ enbart i den sista fallbeskrivningen. Ett jokertecken kan användas i mer komplexa mönster, till exempel ('error', code, _). Till exempel:

matcha test_variabel:
    fall ("varning", kod, 40):
        print("En varning har mottagits.")
    fall ("error", kod, _):
        print(f"Ett fel {code} inträffade.")

I ovanstående fall kommer test_variable att matcha för (’error’, kod, 100) och (’error’, kod, 800).

Guard

Vi kan lägga till en ”om”-klausul i ett mönster, en s.k. ”guard”. Om guarden är falsk går match vidare till att prova nästa fallblock. Observera att värdeinfångning sker innan guarden utvärderas:

matcha punkt:
    case Point(x, y) if x == y:
        print(f"Punkten ligger på diagonalen Y=X vid {x}.")
    fall Punkt(x, y):
        print(f"Punkten ligger inte på diagonalen.")

Andra viktiga funktioner

Flera andra viktiga funktioner:

  • Precis som uppackningsuppdrag har tuple- och listmönster exakt samma betydelse och matchar faktiskt godtyckliga sekvenser. Tekniskt sett måste ämnet vara en sekvens. Därför är ett viktigt undantag att mönster inte matchar iteratorer. För att förhindra ett vanligt misstag matchar inte heller sekvensmönster strängar.

  • Sekvensmönster har stöd för jokertecken: [x, y, *rest] och (x, y, *rest) fungerar på samma sätt som jokertecken i uppackningsuppdrag. Namnet efter * kan också vara _, så (x, y, *_) matchar en sekvens med minst två objekt utan att binda de återstående objekten.

  • Mappningsmönster: {"bandwidth": b, "latency": l} fångar värdena "bandwidth" och "latency" från en dict. Till skillnad från sekvensmönster ignoreras extra nycklar. Ett jokertecken **rest stöds också. (Men **_ skulle vara överflödigt och är därför inte tillåtet)

  • Undermönster kan fångas upp med hjälp av nyckelordet as:

    case (Punkt(x1, y1), Punkt(x2, y2) som p2): ...
    

    Detta binder x1, y1, x2, y2 som du skulle förvänta dig utan klausulen som, och p2 till hela den andra posten i ämnet.

  • De flesta literaler jämförs med likhet. Singletonerna True, False och None jämförs dock med identitet.

  • Namngivna konstanter kan användas i mönster. Dessa namngivna konstanter måste vara punkterade namn för att förhindra att konstanten tolkas som en fångstvariabel:

    from enum import Enum
    klass Färg(Enum):
        RED = 0
        GRÖN = 1
        BLÅ = 2
    
    färg = Färg.GRÖN
    matcha färg:
        fall Färg.RÖD:
            print("Jag ser rött!")
        fall Färg.GRÖN:
            print("Gräs är grönt")
        fall Färg.BLÅ:
            print("Jag känner mig bluesig :(")
    

För fullständig specifikation se PEP 634. Motivering och skäl finns i PEP 635, och en längre handledning finns i PEP 636.

Valfritt alternativ för EncodingWarning och encoding="locale"

Standardkodningen för TextIOWrapper och open() är plattforms- och lokalberoende. Eftersom UTF-8 används på de flesta Unix-plattformar är det ett mycket vanligt fel att utelämna alternativet encoding när UTF-8-filer öppnas (t.ex. JSON, YAML, TOML, Markdown). Till exempel:

# BUG: "rb"-läge eller encoding="utf-8" ska användas.
med open("data.json") som f:
    data = json.load(f)

För att hitta den här typen av fel läggs en valfri EncodingWarning till. Den skickas ut när sys.flags.warn_default_encoding är true och en lokalspecifik standardkodning används.

alternativet -X warn_default_encoding och PYTHONWARNDEFAULTENCODING läggs till för att aktivera varningen.

Se Teckenuppsättning för mer information.

Andra språkliga förändringar

  • Typen int har fått en ny metod int.bit_count(), som returnerar antalet ettor i den binära expansionen av ett givet heltal, även känt som populationsantalet. (Bidrag från Niklas Fiekas i bpo-29882.)

  • De vyer som returneras av dict.keys(), dict.values() och dict.items() har nu alla ett mapping-attribut som ger ett types.MappingProxyType`-objekt som omsluter den ursprungliga ordlistan. (Bidrag från Dennis Sweeney i bpo-40890.)

  • PEP 618: Funktionen zip() har nu en valfri flagga strict, som används för att kräva att alla iterabler har samma längd.

  • Inbyggda funktioner och tilläggsfunktioner som tar heltalsargument accepterar inte längre Decimal, Fraction och andra objekt som kan konverteras till heltal endast med förlust (t.ex. som har metoden __int__() men inte har metoden __index__()). (Bidrag från Serhiy Storchaka i bpo-37999.)

  • Om object.__ipow__() returnerar NotImplemented, kommer operatoren att falla tillbaka till object.__pow__() och object.__rpow__() som förväntat. (Bidrag från Alex Shkop i bpo-38302.)

  • Tilldelningsuttryck kan nu användas utan parentes inom set-literaler och set-komprehensioner, samt i sekvensindex (men inte i slices).

  • Funktioner har ett nytt attribut __builtins__ som används för att leta efter inbyggda symboler när en funktion exekveras, istället för att leta i __globals__['__builtins__']. Attributet initialiseras från __globals__["__builtins__"] om det finns, annars från de aktuella builtins. (Bidrag från Mark Shannon i bpo-42990.)

  • Två nya inbyggda funktioner – aiter() och anext() har lagts till för att tillhandahålla asynkrona motsvarigheter till iter() respektive next(). (Bidrag från Joshua Bronson, Daniel Pope och Justin Wang i bpo-31861.)

  • Statiska metoder (@staticmethod) och klassmetoder (@classmethod) ärver nu metodattributen (__module__, __name__, __qualname__, __doc__, __annotations__) och har ett nytt attribut __wrapped__. Dessutom är statiska metoder nu anropsbara som vanliga funktioner. (Bidrag från Victor Stinner i bpo-43682.)

  • Anteckningar för komplexa mål (allt förutom mål med simple name definierade av PEP 526) orsakar inte längre några körtidseffekter med from __future__ import annotations. (Bidrag från Batuhan Taskaya i bpo-42737.)

  • Klass- och modulobjekt skapar nu tomma annotationsdikter på begäran. Dikterna med anteckningar lagras i objektets __dict__ för bakåtkompatibilitet. Detta förbättrar de bästa metoderna för att arbeta med __annotations__; för mer information, se Bästa praxis för annoteringar. (Bidrag från Larry Hastings i bpo-43901.)

  • Annoteringar som består av yield, yield from, await eller namngivna uttryck är nu förbjudna under from __future__ import annotations på grund av deras bieffekter. (Bidrag från Batuhan Taskaya i bpo-42725.)

  • Användning av obundna variabler, super() och andra uttryck som kan ändra behandlingen av symboltabellen som annoteringar görs nu verkningslösa under from __future__ import annotations. (Bidrag från Batuhan Taskaya i bpo-42725.)

  • Hashar av NaN-värden av både typen float och typen decimal.Decimal beror nu på objektets identitet. Tidigare hashades de alltid till 0 trots att NaN-värden inte är lika med varandra. Detta orsakade potentiellt kvadratiskt körtidsbeteende på grund av överdrivna hashkollisioner när man skapade ordböcker och uppsättningar som innehöll flera NaN-värden. (Bidrag från Raymond Hettinger i bpo-43475.)

  • Ett SyntaxError (istället för ett NameError) kommer att visas när konstanten __debug__ tas bort. (Bidrag från Donghee Na i bpo-45000.)

  • SyntaxError-undantag har nu attributen end_lineno och end_offset. De kommer att vara None om de inte bestäms. (Bidrag från Pablo Galindo i bpo-43914.)

Nya moduler

  • Ingen.

Förbättrade moduler

asyncio

Lägg till saknad connect_accepted_socket() metod. (Bidrag från Alex Grönholm i bpo-41332.)

argparse

Missvisande fras ”valfria argument” ersattes med ”alternativ” i argparse-hjälpen. Vissa tester kan kräva anpassning om de förlitar sig på exakt matchning av utdata. (Bidrag från Raymond Hettinger i bpo-9694.)

array

Metoden index() i array.array har nu valfria parametrar start och stop. (Bidrag från Anders Lorentsen och Zackery Spytz i bpo-31956.)

asynchat, asyncore, smtpd

Dessa moduler har markerats som föråldrade i sin moduldokumentation sedan Python 3.6. En import-tid DeprecationWarning har nu lagts till för alla dessa tre moduler.

base64

Lägg till base64.b32hexencode() och base64.b32hexdecode() för att stödja Base32-kodning med utökat Hex-alfabet.

bdb

Lägg till clearBreakpoints() för att återställa alla inställda brytpunkter. (Bidrag från Irit Katriel i bpo-24160.)

halvera

Lagt till möjligheten att tillhandahålla en nyckel-funktion till API:erna i modulen bisect. (Bidrag från Raymond Hettinger i bpo-4356.)

codecs

Lägg till en codecs.unregister()-funktion för att avregistrera en codec-sökfunktion. (Bidrag från Hai Shi i bpo-41842.)

samlingar.abc

__args__ av parameterized generic för collections.abc.Callable är nu konsistent med typing.Callable. collections.abc.Callable generisk plattar nu ut typparametrar, liknande till vad typing.Callable gör nu. Detta betyder att collections.abc.Callable[[int, str], str] kommer att ha __args__ för (int, str, str); tidigare var detta ([int, str], str). För att möjliggöra denna ändring kan types.GenericAlias nu underklassas, och en underklass kommer att returneras vid subskription av typen collections.abc.Callable. Observera att ett TypeError kan uppstå för ogiltiga former av parametrisering av collections.abc.Callable som kan ha passerat tyst i Python 3.9. (Bidrag från Ken Jin i bpo-42195.)

contextlib

Lägg till en contextlib.aclosing() kontexthanterare för att säkert stänga asynkrona generatorer och objekt som representerar asynkront frigjorda resurser. (Bidrag från Joongi Kim och John Belmonte i bpo-41229.)

Lägg till stöd för asynkron kontexthanterare till contextlib.nullcontext(). (Bidrag från Tom Gringauz i bpo-41543.)

Lägg till AsyncContextDecorator, för att stödja användning av asynkrona kontexthanterare som dekoratorer.

curses

De utökade färgfunktionerna som lades till i ncurses 6.1 kommer att användas transparent av curses.color_content(), curses.init_color(), curses.init_pair() och curses.pair_content(). En ny funktion, curses.has_extended_color_support(), anger om utökat färgstöd tillhandahålls av det underliggande ncurses-biblioteket. (Bidrag från Jeffrey Kintscher och Hans Petter Jansson i bpo-36982.)

Konstanterna BUTTON5_* exponeras nu i modulen curses om de tillhandahålls av det underliggande curses-biblioteket. (Bidrag från Zackery Spytz i bpo-39273.)

dataklasser

__slots__

Lagt till parametern slots i dataclasses.dataclass()-dekoratorn. (Bidrag från Yurii Karabas i bpo-42269)

Fält med endast sökord

dataclasses stöder nu fält som är nyckelordsbundna i den genererade __init__-metoden. Det finns ett antal olika sätt att ange fält som endast innehåller nyckelord.

Du kan säga att varje fält är nyckelordsbaserat:

from dataclasses import dataclass

@dataklass(kw_only=True)
klass Födelsedag:
    name: str
    födelsedag: datetime.date

Både name och birthday är keyword-only-parametrar till den genererade __init__-metoden.

Du kan ange endast nyckelord för varje fält:

from dataclasses import dataclass, fält

@dataklass
klass Födelsedag:
    name: str
    birthday: datetime.date = field(kw_only=True)

Här är det bara födelsedag som är nyckelordsbundet. Om du anger kw_only för enskilda fält bör du vara medveten om att det finns regler för omordning av fält på grund av att fält med enbart nyckelord måste följa fält utan nyckelord. Se den fullständiga dokumentationen för dataclasses för mer information.

Du kan också ange att alla fält som följer en KW_ONLY-markör endast innehåller nyckelord. Detta är förmodligen den vanligaste användningen:

from dataclasses import dataclass, KW_ONLY

@dataklass
klass Punkt:
    x: float
    y: float
    _: KW_ONLY
    z: float = 0,0
    t: float = 0.0

Här är z och t parametrar som endast innehåller nyckelord, medan x och y inte är det. (Bidrag från Eric V. Smith i bpo-43532.)

distutils

Hela paketet distutils är föråldrat och kommer att tas bort i Python 3.12. Dess funktionalitet för att specificera paketbyggnader har redan helt ersatts av tredjepartspaketen setuptools och packaging, och de flesta andra vanligt förekommande API:er finns tillgängliga på andra ställen i standardbiblioteket (t.ex. platform, shutil, subprocess eller sysconfig). Det finns inga planer på att migrera någon annan funktionalitet från distutils, och program som använder andra funktioner bör planera för att göra privata kopior av koden. Se PEP 632 för diskussion.

Kommandot bdist_wininst som är föråldrat i Python 3.8 har tagits bort. Kommandot bdist_wheel rekommenderas nu för att distribuera binära paket på Windows. (Bidrag från Victor Stinner i bpo-42802.)

doctest

När en modul inte definierar __loader__, fall tillbaka till __spec__.loader. (Bidrag från Brett Cannon i bpo-42133.)

kodningar

encodings.normalize_encoding() ignorerar nu icke-ASCII-tecken. (Bidrag från Hai Shi i bpo-39337.)

enum

Enum __repr__() returnerar nu enum_name.member_name och __str__() returnerar nu member_name. Stdlib-enumer som är tillgängliga som modulkonstanter har en repr()module_name.member_name. (Bidrag från Ethan Furman i bpo-40066.)

Lägg till enum.StrEnum för enumer där alla medlemmar är strängar. (Bidrag från Ethan Furman i bpo-41816.)

filinmatning

Lägg till parametrarna encoding och errors i fileinput.input() och fileinput.FileInput. (Bidrag från Inada Naoki i bpo-43712.)

fileinput.hook_compressed() returnerar nu TextIOWrapper-objekt när mode är ”r” och filen är komprimerad, precis som okomprimerade filer. (Bidrag från Inada Naoki i bpo-5758.)

felhanterare

Modulen faulthandler upptäcker nu om ett allvarligt fel inträffar under en garbage collector-insamling. (Bidrag från Victor Stinner i bpo-44466.)

gc

Lägg till revisionskrokar för gc.get_objects(), gc.get_referrers() och gc.get_referents(). (Bidrag från Pablo Galindo i bpo-43439.)

klot

Lägg till parametrarna root_dir och dir_fd i glob() och iglob() som gör det möjligt att ange rotkatalogen för sökning. (Bidrag från Serhiy Storchaka i bpo-38144.)

hashlib

Modulen hashlib kräver OpenSSL 1.1.1 eller nyare. (Bidrag från Christian Heimes i PEP 644 och bpo-43669.)

Modulen hashlib har preliminärt stöd för OpenSSL 3.0.0. (Bidrag från Christian Heimes i bpo-38820 och andra frågor)

Den rena Python-fallbacken pbkdf2_hmac() är föråldrad. I framtiden kommer PBKDF2-HMAC endast att vara tillgängligt när Python har byggts med OpenSSL-stöd. (Bidrag från Christian Heimes i bpo-43880.)

hmac

Modulen hmac använder nu OpenSSL:s HMAC-implementering internt. (Bidrag från Christian Heimes i bpo-40645.)

IDLE och idlelib

Få IDLE att anropa sys.excepthook() (när den startas utan ’-n’). Användarkrokar ignorerades tidigare. (Bidrag från Ken Hilton i bpo-43008.)

Omorganisera dialogrutan för inställningar. Dela upp fliken Allmänt i flikarna Windows och Shell/Ed. Flytta hjälpkällor, som utökar Hjälp-menyn, till fliken Tillägg. Gör plats för nya alternativ och förkorta dialogrutan. Det senare gör att dialogrutan passar bättre på små skärmar. (Bidrag från Terry Jan Reedy i bpo-40468.) Flytta inställningen för indragningsutrymme från fliken Font till den nya fliken Windows. (Bidrag från Mark Roseman och Terry Jan Reedy i bpo-33962.)

Ändringarna ovan har bakåtportionerats till en underhållsversion av 3.9.

Add a Shell sidebar. Move the primary prompt (’>>>’) to the sidebar. Add secondary prompts (’…’) to the sidebar. Left click and optional drag selects one or more lines of text, as with the editor line number sidebar. Right click after selecting text lines displays a context menu with ’copy with prompts’. This zips together prompts from the sidebar with lines from the selected text. This option also appears on the context menu for the text. (Contributed by Tal Einat in bpo-37903.)

Använd mellanslag i stället för tabbar för att dra in interaktiv kod. Detta gör att interaktiva kodposter ”ser rätt ut”. Att göra detta genomförbart var en viktig motivation för att lägga till sidofältet för skal. (Bidrag från Terry Jan Reedy i bpo-37892.)

Markera de nya mjuka nyckelorden match, case och _ i mönstermatchningssatser. Denna markering är dock inte perfekt och kommer att vara felaktig i vissa sällsynta fall, inklusive vissa _-s i case-mönster. (Bidrag från Tal Einat i bpo-44010.)

Nytt i underhållsversioner av 3.10.

Tillämpa syntaxmarkering på .pyi-filer. (Bidrag från Alex Waygood och Terry Jan Reedy i bpo-45447.)

Inkludera uppmaningar när du sparar Shell med in- och utgångar. (Bidrag från Terry Jan Reedy i gh-95191.)

importlib.metadata

Funktionsparitet med importlib_metadata 4.6 (historik).

importlib.metadata entry points ger nu en trevligare upplevelse för att välja entry points efter grupp och namn genom en ny importlib.metadata.EntryPoints-klass. Se Compatibility Note i dokumentationen för mer information om borttagandet och användningen.

Lagt till importlib.metadata.packages_distributions() för att lösa Python-moduler och -paket på toppnivå till deras importlib.metadata.Distribution.

inspektera

När en modul inte definierar __loader__, fall tillbaka till __spec__.loader. (Bidrag från Brett Cannon i bpo-42133.)

Lägg till inspect.get_annotations(), som på ett säkert sätt beräknar de annoteringar som definierats för ett objekt. Den arbetar runt egenheterna med att komma åt annoteringarna på olika typer av objekt, och gör mycket få antaganden om objektet den undersöker. inspect.get_annotations() kan också korrekt avstränga strängade annoteringar. inspect.get_annotations() anses nu vara bästa praxis för att komma åt annoteringsdikten som definieras på alla Python-objekt; för mer information om bästa praxis för att arbeta med annoteringar, se Bästa praxis för annoteringar. Relaterat, inspect.signature(), inspect.Signature.from_callable(), och inspect.Signature.from_function() anropar nu inspect.get_annotations() för att hämta annoteringar. Detta innebär att inspect.signature() och inspect.Signature.from_callable() nu även kan avstränga strängade annoteringar. (Bidrag från Larry Hastings i bpo-43817.)

itertools

Lägg till itertools.pairwise(). (Bidrag från Raymond Hettinger i bpo-38200.)

linecache

När en modul inte definierar __loader__, fall tillbaka till __spec__.loader. (Bidrag från Brett Cannon i bpo-42133.)

os

Lägg till os.cpu_count() stöd för VxWorks RTOS. (Bidrag från Peixing Xin i bpo-41440.)

Lägg till en ny funktion os.eventfd() och relaterade hjälpfunktioner för att paketera syscallen eventfd2 på Linux. (Bidrag från Christian Heimes i bpo-41001.)

Lägg till os.splice() som gör det möjligt att flytta data mellan två filbeskrivare utan att kopiera mellan kärnans adressrymd och användarens adressrymd, där en av filbeskrivarna måste referera till en pipe. (Bidrag från Pablo Galindo i bpo-41625.)

Lägg till O_EVTONLY, O_FSYNC, O_SYMLINK och O_NOFOLLOW_ANY för macOS. (Bidrag från Donghee Na i bpo-43106.)

os.sökväg

os.path.realpath() accepterar nu ett strikt argument som endast innehåller nyckelord. När den är inställd på True, OSError` tas upp om en sökväg inte existerar eller om en symlänk-loop påträffas. (Bidrag från Barney Gale i bpo-43757.)

sökväg

Lägg till stöd för slice i PurePath.parents. (Bidrag från Joshua Cannon i bpo-35498.)

Lägg till stöd för negativ indexering till PurePath.parents. (Bidrag från Yaroslav Pankovych i bpo-21041.)

Lägg till Path.hardlink_to metod som ersätter link_to(). Den nya metoden har samma argumentordning som symlink_to(). (Bidrag från Barney Gale i bpo-39950.)

pathlib.Path.stat() och chmod() accepterar nu ett follow_symlinks nyckelordsargument för överensstämmelse med motsvarande funktioner i modulen os. (Bidrag från Barney Gale i bpo-39906.)

plattform

Lägg till platform.freedesktop_os_release() för att hämta identifiering av operativsystem från standardfilen freedesktop.org os-release. (Bidrag från Christian Heimes i bpo-28468.)

tryck

pprint.pprint() accepterar nu ett nytt underscore_numbers nyckelordsargument. (Bidrag från sblondon i bpo-42914.)

pprint kan nu pretty-printa dataclasses.dataclass-instanser. (Bidrag från Lewis Gaul i bpo-43080.)

py_kompilera

Lägg till alternativet --quiet i kommandoradsgränssnittet för py_compile. (Bidrag från Gregory Schevchenko i bpo-38731.)

pyclbr

Lägg till ett end_lineno attribut till Function och Class objekten i trädet som returneras av pyclbr.readmodule() och pyclbr.readmodule_ex(). Den matchar den befintliga (start) lineno. (Bidrag från Aviral Srivastava i bpo-38307.)

hylla

Modulen shelve använder nu pickle.DEFAULT_PROTOCOL som standard istället för pickle protocol 3 när hyllor skapas. (Bidrag från Zackery Spytz i bpo-34204.)

statistik

Lägg till covariance(), Pearsons correlation() och enkla linear_regression() funktioner. (Bidrag från Tymoteusz Wołodźko i bpo-38490.)

plats

När en modul inte definierar __loader__, fall tillbaka till __spec__.loader. (Bidrag från Brett Cannon i bpo-42133.)

kortplats

Undantaget socket.timeout är nu ett alias för TimeoutError. (Bidrag från Christian Heimes i bpo-42413.)

Lägg till alternativ för att skapa MPTCP-sockets med IPPROTO_MPTCP (Bidrag från Rui Cunha i bpo-43571.)

Lägg till alternativet IP_RECVTOS för att ta emot fälten Type of Service (ToS) eller DSCP/ECN (Bidrag från Georg Sauthoff i bpo-44077.)

ssl

Modulen ssl kräver OpenSSL 1.1.1 eller nyare. (Bidrag från Christian Heimes i PEP 644 och bpo-43669.)

Modulen ssl har preliminärt stöd för OpenSSL 3.0.0 och det nya alternativet OP_IGNORE_UNEXPECTED_EOF. (Bidrag från Christian Heimes i bpo-38820, bpo-43794, bpo-43788, bpo-43791, bpo-43799, bpo-43920, bpo-43789 och bpo-43811.)

Föråldrad funktion och användning av föråldrade konstanter resulterar nu i en DeprecationWarning. ssl.SSLContext.options har OP_NO_SSLv2 och OP_NO_SSLv3 inställda som standard och kan därför inte varna för att ställa in flaggan igen. I deprecation section finns en lista över föråldrade funktioner. (Bidrag från Christian Heimes i bpo-43880.)

Ssl-modulen har nu säkrare standardinställningar. Ciphers utan forward secrecy eller SHA-1 MAC är inaktiverade som standard. Säkerhetsnivå 2 förbjuder svaga RSA-, DH- och ECC-nycklar med mindre än 112 bitars säkerhet. SSLContext har som standard den lägsta protokollversionen TLS 1.2. Inställningarna är baserade på Hynek Schlawacks forskning. (Bidrag från Christian Heimes i bpo-43998.)

De föråldrade protokollen SSL 3.0, TLS 1.0 och TLS 1.1 stöds inte längre officiellt. Python blockerar dem inte aktivt. Men OpenSSL-byggalternativ, distrokonfigurationer, leverantörspatchar och chiffersviter kan förhindra en framgångsrik handskakning.

Lägg till en timeout-parameter till funktionen ssl.get_server_certificate(). (Bidrag från Zackery Spytz i bpo-31870.)

Modulen ssl använder heap-types och initialisering i flera faser. (Bidrag från Christian Heimes i bpo-42333.)

En ny verifieringsflagga VERIFY_X509_PARTIAL_CHAIN har lagts till. (Bidrag från l0x i bpo-40849.)

sqlite3

Lägg till granskningshändelser för connect/handle(), enable_load_extension(), och load_extension(). (Bidrag från Erlend E. Aasland i bpo-43762.)

system

Lägg till sys.orig_argv-attribut: listan över de ursprungliga kommandoradsargumenten som skickas till Python-körprogrammet. (Bidrag från Victor Stinner i bpo-23427.)

Lägg till sys.stdlib_module_names, som innehåller en lista över standardbibliotekets modulnamn. (Bidrag från Victor Stinner i bpo-42955.)

_tråd

_thread.interrupt_main() tar nu ett valfritt signalnummer att simulera (standard är fortfarande signal.SIGINT). (Bidrag från Antoine Pitrou i bpo-43356.)

gängning

Lägg till threading.gettrace() och threading.getprofile() för att hämta de funktioner som ställts in av threading.settrace() respektive threading.setprofile(). (Bidrag från Mario Corchero i bpo-42251.)

Lägg till threading.__excepthook__ för att tillåta hämtning av originalvärdet för threading.excepthook() om det är inställt på ett trasigt eller ett annat värde. (Bidrag från Mario Corchero i bpo-42308.)

spårning

Funktionerna format_exception(), format_exception_only() och print_exception() kan nu ta ett undantagsobjekt som ett endast positionellt argument. (Bidrag från Zackery Spytz och Matthias Bussonnier i bpo-26389.)

typer

Återinför klasserna types.EllipsisType, types.NoneType och types.NotImplementedType, vilket ger en ny uppsättning typer som lätt kan tolkas av typkontrollanter. (Bidrag från Bas van Beek i bpo-41810.)

typing

För större ändringar, se Nya funktioner relaterade till typtips.

Beteendet för typing.Literal ändrades för att överensstämma med PEP 586 och för att matcha beteendet hos statiska typkontrollanter som anges i PEP.

  1. Literal avduplicerar nu parametrar.

  2. Jämlikhetsjämförelser mellan Literal-objekt är nu orderoberoende.

  3. jämförelser av Literal respekterar nu typer. Till exempel, Literal[0] == Literal[False] utvärderades tidigare till True. Nu är det False. För att stödja denna förändring stöder den internt använda typcachen nu differentierande typer.

  4. Literal objekt kommer nu att ge upphov till ett TypeError undantag under jämlikhetsjämförelser om någon av deras parametrar inte är hashable. Notera att deklaration av Literal med parametrar som inte kan hashas inte kommer att ge upphov till ett fel:

    >>> from typing import Literal
    >>> Literal[{0}]
    >>> Literal[{0}] == Literal[{False}]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'set'
    

(Bidrag från Yurii Karabas i bpo-42345.)

Lägg till ny funktion typing.is_typeddict() för att introspektera om en annotering är en typing.TypedDict. (Bidrag från Patrick Reader i bpo-41792.)

Subklasser av typing.Protocol som endast har datavariabler deklarerade kommer nu att ge upphov till ett TypeError när de kontrolleras med isinstance om de inte är dekorerade med runtime_checkable(). Tidigare passerade dessa kontroller tyst. Användare bör dekorera sina subklasser med runtime_checkable() dekoratorn om de vill ha runtime protokoll. (Bidrag från Yurii Karabas i bpo-38908.)

Import från submodulerna typing.io och typing.re kommer nu att ge DeprecationWarning. Dessa undermoduler har varit föråldrade sedan Python 3.8 och kommer att tas bort i en framtida version av Python. Allt som hör till dessa undermoduler bör importeras direkt från typing istället. (Bidrag från Sebastian Rittau i bpo-38291.)

unittest

Lägg till en ny metod assertNoLogs() som komplement till den befintliga assertLogs(). (Bidrag från Kit Yan Choi i bpo-39385.)

urllib.parse

Python-versioner tidigare än Python 3.10 tillät användning av både ; och & som separatorer för frågeparametrar i urllib.parse.parse_qs() och urllib.parse.parse_qsl(). På grund av säkerhetsproblem och för att överensstämma med nyare W3C-rekommendationer har detta ändrats så att endast en enda separatornyckel tillåts, med & som standard. Denna ändring påverkar även cgi.parse() och cgi.parse_multipart() eftersom de använder de berörda funktionerna internt. För mer information, se deras respektive dokumentation. (Bidrag från Adam Goldschmidt, Senthil Kumaran och Ken Jin i bpo-42967.)

Förekomsten av newline- eller tabb-tecken i delar av en URL möjliggör vissa former av attacker. I enlighet med WHATWG-specifikationen som uppdaterar RFC 3986, tas ASCII newline n, \r och tabb t-tecken bort från URL:en av parsern i urllib.parse för att förhindra sådana attacker. De borttagna tecknen styrs av en ny variabel på modulnivå, urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (Se gh-88048)

xml

Lägg till en LexicalHandler-klass till xml.sax.handler-modulen. (Bidrag från Jonathan Gossage och Zackery Spytz i bpo-35018.)

zipimport

Lägg till metoder relaterade till PEP 451: find_spec(), zipimport.zipimporter.create_module() och zipimport.zipimporter.exec_module(). (Bidrag från Brett Cannon i bpo-42131.)

Lägg till metoden invalidate_caches(). (Bidrag från Desmond Cheong i bpo-14678.)

Optimeringar

  • Konstruktörerna str(), bytes() och bytearray() är nu snabbare (runt 30–40% feller små objekt). (Bidrag från Serhiy Storchaka i bpo-41334.)

  • Modulen runpy importerar nu färre moduler. Starttiden för kommandot python3 -m modul-namn är i genomsnitt 1,4x snabbare. På Linux importerar python3 -I -m module-name 69 moduler i Python 3.9, medan det bara importerar 51 moduler (-18) i Python 3.10. (Bidrag från Victor Stinner i bpo-41006 och bpo-41718.)

  • Instruktionen LOAD_ATTR använder nu den nya ”per opcode cache”-mekanismen. Det är ungefär 36% faster nu för vanliga attribut och 44% faster för slots. (Bidrag från Pablo Galindo och Yury Selivanov i bpo-42093 och Guido van Rossum i bpo-42927, baserat på idéer som ursprungligen implementerades i PyPy och MicroPython)

  • När Python byggs med --enable-optimizations läggs nu -fno-semantic-interposition till på både kompilerings- och länkningsraden. Detta påskyndar byggandet av Python-tolken som skapats med --enable-shared med gcc med upp till 30%. Se den här artikeln för mer information. (Bidrag från Victor Stinner och Pablo Galindo i bpo-38980.)

  • Använd en ny kod för hantering av utdatabufferten för modulerna bz2 / lzma / zlib och lägg till funktionen .readall() i klassen _compression.DecompressReader. bz2-dekomprimering är nu 1,09x ~ 1,17x snabbare, lzma-dekomprimering 1,20x ~ 1,32x snabbare, GzipFile.read(-1) 1,11x ~ 1,18x snabbare. (Bidrag från Ma Lin, granskad av Gregory P. Smith, i bpo-41486)

  • Vid användning av strängformade annoteringar skapas inte längre annotationsdict för funktioner när funktionen skapas. Istället lagras de som en tupel av strängar, och funktionsobjektet konverterar detta till annotationsdikten på begäran. Denna optimering halverar den CPU-tid som krävs för att definiera en annoterad funktion. (Bidrag från Yurii Karabas och Inada Naoki i bpo-42202.)

  • Sökfunktioner för delsträngar som str1 i str2 och str2.find(str1) använder nu ibland Crochemore & Perrins ”Two-Way” strängsökningsalgoritm för att undvika kvadratiskt beteende på långa strängar. (Bidrag från Dennis Sweeney i bpo-41972)

  • Lägg till mikrooptimeringar till _PyType_Lookup() för att förbättra prestanda för typattributcacheuppslagning i det vanliga fallet med cacheträffar. Detta gör tolken 1,04 gånger snabbare i genomsnitt. (Bidrag från Dino Viehland i bpo-43452.)

  • Följande inbyggda funktioner stöder nu den snabbare PEP 590 vectorcall-anropskonventionen: map(), filter(), reversed(), bool() och float(). (Bidrag från Donghee Na och Jeroen Demeyer i bpo-43575, bpo-43287, bpo-41922, bpo-41873 och bpo-41870.)

  • BZ2File prestanda förbättras genom att ta bort interna RLock. Detta gör BZ2File trådosäker mot flera samtidiga läsare eller skrivare, precis som dess motsvarande klasser i gzip och lzma alltid har varit. (Bidrag från Inada Naoki i bpo-43785.)

Föråldrat

  • 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]). Från och med den här utgåvan kommer en deprecation-varning att utfärdas om den numeriska litteralen omedelbart följs av ett av nyckelorden and, else, for, if, in, is och or. I framtida versioner kommer det att ändras till syntaxvarning och slutligen till syntaxfel. (Bidrag från Serhiy Storchaka i bpo-43833.)

  • Från och med den här utgåvan kommer det att finnas en samlad ansträngning för att börja städa upp gammal importsemantik som behölls för Python 2.7-kompatibilitet. I synnerhet find_loader()/find_module() (ersatt av find_spec()), load_module() (ersatt av exec_module()), module_repr() (som importsystemet tar hand om åt dig), attributet __package__ (ersatt av __spec__.parent), attributet __loader__ (ersatt av __spec__.loader) och attributet __cached__ (ersatt av __spec__.cached) kommer långsamt att tas bort (liksom andra klasser och metoder i importlib). ImportWarning och/eller DeprecationWarning kommer att visas på lämpligt sätt för att hjälpa till att identifiera kod som behöver uppdateras under denna övergång.

  • Hela namnrymden distutils är föråldrad och kommer att tas bort i Python 3.12. Se avsnittet Moduländringar för mer information.

  • Argument som inte är heltal till random.randrange() är föråldrade. ValueError är avfört till förmån för TypeError. (Bidrag från Serhiy Storchaka och Raymond Hettinger i bpo-37319.)

  • De olika load_module()-metoderna i importlib har dokumenterats som föråldrade sedan Python 3.6, men kommer nu också att utlösa en DeprecationWarning. Använd exec_module() istället. (Bidrag från Brett Cannon i bpo-26131.)

  • zimport.zipimporter.load_module() har utgått till förmån för exec_module(). (Bidrag från Brett Cannon i bpo-26131.)

  • Importsystemets användning av load_module() utlöser nu en ImportWarning eftersom exec_module() är att föredra. (Bidrag från Brett Cannon i bpo-26131.)

  • Importsystemets användning av importlib.abc.MetaPathFinder.find_module() och importlib.abc.PathEntryFinder.find_module() utlöser nu en ImportWarning eftersom importlib.abc.MetaPathFinder.find_spec() respektive importlib.abc.PathEntryFinder.find_spec() föredras. Du kan använda importlib.util.spec_from_loader() för att hjälpa till med portningen. (Bidrag från Brett Cannon i bpo-42134.)

  • Importsystemets användning av importlib.abc.PathEntryFinder.find_loader() utlöser nu en ImportWarning eftersom importlib.abc.PathEntryFinder.find_spec() är att föredra. Du kan använda importlib.util.spec_from_loader() för att hjälpa till med porteringen. (Bidrag från Brett Cannon i bpo-43672.)

  • De olika implementationerna av importlib.abc.MetaPathFinder.find_module() ( importlib.machinery.BuiltinImporter.find_module(), importlib.machinery.FrozenImporter.find_module(), importlib.machinery.WindowsRegistryFinder.find_module().FrozenImporter.find_module`, importlib.machinery.WindowsRegistryFinder.find_module(), importlib.machinery.PathFinder.find_module(), importlib.abc.MetaPathFinder.find_module() ), importlib.abc.PathEntryFinder.find_module() ( importlib.machinery.FileFinder.find_module() ), och importlib.abc.PathEntryFinder.find_loader() ( importlib.machinery.FileFinder.find_loader() ) ger nu upphov till DeprecationWarning och kommer att tas bort i Python 3.12 (tidigare dokumenterades de som föråldrade i Python 3.4). (Bidrag från Brett Cannon i bpo-42135.)

  • importlib.abc.Finder är utfasad (inklusive dess enda metod, find_module()). Både importlib.abc.MetaPathFinder och importlib.abc.PathEntryFinder ärver inte längre från klassen. Användare bör i stället ärva från en av dessa två klasser på lämpligt sätt. (Bidrag från Brett Cannon i bpo-42135.)

  • Avvecklingen av imp, importlib.find_loader(), importlib.util.set_package_wrapper(), importlib.util.set_loader_wrapper(), importlib.util.module_for_loader(), pkgutil.ImpImporter, och pkgutil.ImpLoader har alla uppdaterats för att lista Python 3.12 som den planerade versionen av borttagning (de började höja DeprecationWarning i tidigare versioner av Python). (Bidrag från Brett Cannon i bpo-43720.)

  • Importsystemet använder nu attributet __spec__ på moduler innan det faller tillbaka på module_repr() för en moduls __repr__()-metod. Borttagandet av användningen av module_repr() är planerat till Python 3.12. (Bidrag från Brett Cannon i bpo-42137.)

  • importlib.abc.Loader.module_repr(), importlib.machinery.FrozenLoader.module_repr(), and importlib.machinery.BuiltinLoader.module_repr() are deprecated and slated for removal in Python 3.12. (Bidrag från Brett Cannon i bpo-42136.)

  • sqlite3.OptimizedUnicode har varit odokumenterad och föråldrad sedan Python 3.3, då den gjordes till ett alias till str. Det är nu föråldrat och planeras att tas bort i Python 3.12. (Bidrag från Erlend E. Aasland i bpo-42264.)

  • Den odokumenterade inbyggda funktionen sqlite3.enable_shared_cache är nu föråldrad och planeras att tas bort i Python 3.12. Dess användning avråds starkt av SQLite3-dokumentationen. Se SQLite3-dokumentationen för mer information. Om en delad cache måste användas, öppna databasen i URI-läge med hjälp av frågeparametern cache=shared. (Bidrag från Erlend E. Aasland i bpo-24464.)

  • Följande threading-metoder är nu föråldrade:

    (Bidrag från Jelle Zijlstra i gh-87889.)

  • pathlib.Path.link_to() är föråldrad och kommer att tas bort i Python 3.12. Använd pathlib.Path.hardlink_to() istället. (Bidrag från Barney Gale i bpo-39950.)

  • cgi.log() är föråldrad och ska tas bort i Python 3.12. (Bidrag från Inada Naoki i bpo-41139.)

  • Följande ssl-funktioner har blivit föråldrade sedan Python 3.6, Python 3.7 eller OpenSSL 1.1.0 och kommer att tas bort i 3.11:

  • Threading debug (PYTHONTHREADDEBUG miljövariabel) är föråldrad i Python 3.10 och kommer att tas bort i Python 3.12. Denna funktion kräver debug build av Python. (Bidrag från Victor Stinner i bpo-44584.)

  • Import från undermodulerna typing.io och typing.re kommer nu att ge upphov till DeprecationWarning. Dessa submoduler kommer att tas bort i en framtida version av Python. Allt som hör till dessa undermoduler bör importeras direkt från typing istället. (Bidrag från Sebastian Rittau i bpo-38291.)

Borttagen

  • Tog bort specialmetoderna __int__, __float__, __floordiv__, __mod__, __divmod__, __rfloordiv__, __rmod__ och __rdivmod__ i klassen complex. De gav alltid upphov till ett TypeError. (Bidrag från Serhiy Storchaka i bpo-41974.)

  • Metoden ParserBase.error() från den privata och odokumenterade modulen _markupbase har tagits bort. html.parser.HTMLParser är den enda underklassen till ParserBase och dess error() implementation togs bort redan i Python 3.5. (Bidrag från Berker Peksag i bpo-31844.)

  • Tog bort attributet unicodedata.ucnhash_CAPI som var ett internt PyCapsule-objekt. Den relaterade privata _PyUnicode_Name_CAPI strukturen flyttades till det interna C API. (Bidrag från Victor Stinner i bpo-42157.)

  • Tog bort modulen parser, som blev föråldrad i 3.9 på grund av bytet till den nya PEG-parsern, samt alla C-käll- och headerfiler som bara användes av den gamla parsern, inklusive node.h, parser.h, graminit.h och grammar.h.

  • Tog bort de offentliga C API-funktionerna PyParser_SimpleParseStringFlags, PyParser_SimpleParseStringFlagsFilename, PyParser_SimpleParseFileFlags och PyNode_Compile som var föråldrade i 3.9 på grund av bytet till den nya PEG-parsern.

  • Tog bort modulen formatter, som blev föråldrad i Python 3.4. Den är något föråldrad, används lite och är inte testad. Den var ursprungligen planerad att tas bort i Python 3.6, men sådana borttagningar försenades till efter Python 2.7 EOL. Befintliga användare bör kopiera de klasser de använder till sin kod. (Bidrag från Donghee Na och Terry J. Reedy i bpo-42299.)

  • Tog bort PyModule_GetWarningsModule()-funktionen som var värdelös nu på grund av att _warnings-modulen konverterades till en inbyggd modul i 2.6. (Bidrag från Hai Shi i bpo-42599.)

  • Ta bort föråldrade alias till Samlingar Abstrakta basklasser från modulen collections. (Bidrag från Victor Stinner i bpo-37324.)

  • Parametern loop har tagits bort från de flesta av asyncios högnivå-API efter att ha utgått i Python 3.8. Motivationen bakom denna förändring är mångfaldig:

    1. Detta förenklar API:et på hög nivå.

    2. Funktionerna i API:et på hög nivå har implicit hämtat den aktuella trådens löpande händelseslinga sedan Python 3.7. Det finns inget behov av att skicka händelseslingan till API i de flesta normala användningsfall.

    3. Event loop passing är felbenäget, särskilt när det handlar om loopar som körs i olika trådar.

    Observera att API:et på låg nivå fortfarande accepterar loop. Se Ändringar i Python API för exempel på hur man ersätter befintlig kod.

    (Bidrag från Yurii Karabas, Andrew Svetlov, Yury Selivanov och Kyle Stanley i bpo-42392.)

Portning till Python 3.10

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

Ändringar i Python-syntaxen

  • Deprecation-varning avges nu vid kompilering av tidigare giltig syntax om den numeriska litteralen omedelbart följs av ett nyckelord (som i 0in x). I framtida versioner kommer den att ändras till en syntaxvarning och slutligen till ett syntaxfel. För att bli av med varningen och göra koden kompatibel med framtida versioner lägger du bara till ett mellanslag mellan den numeriska litteralen och följande nyckelord. (Bidrag från Serhiy Storchaka i bpo-43833.)

Ändringar i Python API

  • Parametrarna etype i funktionerna format_exception(), format_exception_only() och print_exception() i modulen traceback har bytt namn till exc. (Bidrag från Zackery Spytz och Matthias Bussonnier i bpo-26389.)

  • atexit: Vid Python-exit, om en callback registrerad med atexit.register() misslyckas, loggas nu dess undantag. Tidigare loggades bara vissa undantag, och det sista undantaget ignorerades alltid tyst. (Bidrag från Victor Stinner i bpo-42639.)

  • collections.abc.Callable generic plattar nu till typ-parametrar, liknande vad typing.Callable gör för närvarande. Detta innebär att collections.abc.Callable[[int, str], str] kommer att ha __args__ av (int, str, str); tidigare var detta ([int, str], str). Kod som kommer åt argumenten via typing.get_args() eller __args__ måste ta hänsyn till denna ändring. Dessutom kan TypeError uppstå för ogiltiga former av parametrisering av collections.abc.Callable som kan ha passerat tyst i Python 3.9. (Bidrag från Ken Jin i bpo-42195.)

  • socket.htons() och socket.ntohs() ger nu OverflowError istället för DeprecationWarning om den givna parametern inte ryms i ett 16-bitars osignerat heltal. (Bidrag från Erlend E. Aasland i bpo-42393.)

  • Parametern loop har tagits bort från de flesta av asyncios high-level API efter att ha utgått i Python 3.8.

    En coroutine som för närvarande ser ut så här:

    async def foo(loop):
        await asyncio.sleep(1, loop=loop)
    

    Bör ersättas med detta:

    async def foo():
        await asyncio.sleep(1)
    

    Om foo() specifikt utformats för att inte köras i den aktuella trådens pågående händelseslinga (t.ex. körs i en annan tråds händelseslinga), överväg att använda asyncio.run_coroutine_threadsafe() istället.

    (Bidrag från Yurii Karabas, Andrew Svetlov, Yury Selivanov och Kyle Stanley i bpo-42392.)

  • Konstruktorn types.FunctionType ärver nu de aktuella inbyggda funktionerna om globals-ordlistan inte har någon "__builtins__"-nyckel, istället för att använda {"None": None} som inbyggda funktioner: samma beteende som funktionerna eval() och exec(). Definiera en funktion med def function(...): ... i Python påverkas inte, globaler kan inte åsidosättas med denna syntax: den ärver också de aktuella inbyggda funktionerna. (Bidrag från Victor Stinner i bpo-42990.)

Förändringar i C API

  • C API-funktionerna PyParser_SimpleParseStringFlags, PyParser_SimpleParseStringFlagsFilename, PyParser_SimpleParseFileFlags, PyNode_Compile och den typ som används av dessa funktioner, struct _node, togs bort på grund av bytet till den nya PEG-parsern.

    Källan bör nu kompileras direkt till ett kodobjekt med hjälp av t.ex. Py_CompileString(). Det resulterande kodobjektet kan sedan utvärderas med hjälp av till exempel PyEval_EvalCode().

    Specifikt:

    • Ett anrop till PyParser_SimpleParseStringFlags följt av PyNode_Compile kan ersättas med ett anrop till Py_CompileString().

    • Det finns ingen direkt ersättning för PyParser_SimpleParseFileFlags. För att kompilera kod från ett FILE *-argument måste du läsa filen i C och skicka den resulterande bufferten till Py_CompileString().

    • För att kompilera en fil som ges ett char * filnamn, öppna filen explicit, läs den och kompilera resultatet. Ett sätt att göra detta är att använda modulen io med PyImport_ImportModule(), PyObject_CallMethod(), PyBytes_AsString() och Py_CompileString(), enligt skissen nedan. (Deklarationer och felhantering är utelämnade.)

      io_module = Import_ImportModule("io");
      fileobject = PyObject_CallMethod(io_module, "open", "ss", filnamn, "rb");
      source_bytes_object = PyObject_CallMethod(fileobject, "read", "");
      result = PyObject_CallMethod(fileobject, "close", "");
      source_buf = PyBytes_AsString(source_bytes_object);
      kod = Py_CompileString(source_buf, filnamn, Py_file_input);
      
    • För FrameObject-objekt representerar medlemmen f_lasti` nu en ordkod-offset istället för en enkel offset i bytecode-strängen. Detta innebär att detta tal måste multipliceras med 2 för att kunna användas med API:er som förväntar sig en byte-offset istället (som till exempel PyCode_Addr2Line()). Observera också att f_lasti-medlemmen i FrameObject-objekt inte anses vara stabil: använd PyFrame_GetLineNumber() istället.

CPython bytecode-ändringar

  • Instruktionen MAKE_FUNCTION accepterar nu antingen en dict eller en tupel av strängar som funktionens annoteringar. (Bidrag från Yurii Karabas och Inada Naoki i bpo-42202.)

Förändringar i byggning

  • PEP 644: Python kräver nu OpenSSL 1.1.1 eller nyare. OpenSSL 1.0.2 stöds inte längre. (Bidrag från Christian Heimes i bpo-43669.)

  • C99-funktionerna snprintf() och vsnprintf() krävs nu för att bygga Python. (Bidrag från Victor Stinner i bpo-36020.)

  • sqlite3 kräver SQLite 3.7.15 eller senare. (Bidrag från Sergey Fedoseev och Erlend E. Aasland i bpo-40744 och bpo-40810.)

  • Modulen atexit måste nu alltid byggas som en inbyggd modul. (Bidrag från Victor Stinner i bpo-42639.)

  • Lägg till --disable-test-modules option till configure-skriptet: bygg eller installera inte testmoduler. (Bidrag från Xavier de Gaye, Thomas Petazzoni och Peixing Xin i bpo-27640.)

  • Lägg till --with-wheel-pkg-dir=PATH option till skriptet ./configure. Om det anges kommer modulen ensurepip att leta efter hjulpaketen setuptools och pip i den här katalogen: om båda finns där kommer dessa hjulpaket att användas istället för de hjulpaket som ingår i ensurepip.

    Vissa Linux-distributioners paketeringspolicyer rekommenderar att man inte buntar beroenden. Till exempel installerar Fedora wheel-paket i katalogen /usr/share/python-wheels/ och installerar inte paketet ensurepip._bundled.

    (Bidrag från Victor Stinner i bpo-42856.)

  • Lägg till ett nytt configure --without-static-libpython option för att inte bygga det statiska biblioteket libpythonMAJOR.MINOR.a och inte installera objektfilen python.o.

    (Bidrag från Victor Stinner i bpo-43103.)

  • Skriptet configure använder nu verktyget pkg-config, om det finns tillgängligt, för att upptäcka platsen för Tcl/Tk-huvuden och -bibliotek. Som tidigare kan dessa platser uttryckligen anges med konfigurationsalternativen --with-tcltk-includes och --with-tcltk-libs. (Bidrag från Manolis Stamatogiannakis i bpo-42603.)

  • Lägg till --with-openssl-rpath-alternativet till configure-skriptet. Alternativet förenklar byggandet av Python med en anpassad OpenSSL-installation, t.ex. ./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto. (Bidrag från Christian Heimes i bpo-43466.)

Ändringar i C API

PEP 652: Upprätthålla en stabil ABI

Det stabila ABI:t (Application Binary Interface) för tilläggsmoduler eller inbäddning av Python är nu uttryckligen definierat. C API-stabilitet beskriver stabilitetsgarantier för C API och ABI samt bästa praxis för användning av det stabila ABI:t.

(Bidrag från Petr Viktorin i PEP 652 och bpo-43795.)

Nya funktioner

Portning till Python 3.10

  • Makrot PY_SSIZE_T_CLEAN måste nu definieras för att använda formaten PyArg_ParseTuple() och Py_BuildValue() som använder #: es#, et#, s#, u#, y#, z#, U# och Z#. Se Tolkning av argument och skapande av värden och PEP 353. (Bidrag från Victor Stinner i bpo-40943.)

  • Eftersom Py_REFCNT() ändras till en inline statisk funktion, måste Py_REFCNT(obj) = new_refcnt ersättas med Py_SET_REFCNT(obj, new_refcnt): se Py_SET_REFCNT() (tillgänglig sedan Python 3.9). För bakåtkompatibilitet kan detta makro användas:

    #if PY_VERSION_HEX < 0x030900A4
    # define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0)
    #endif
    

    (Bidrag från Victor Stinner i bpo-39573.)

  • Att anropa PyDict_GetItem() utan GIL hade varit tillåtet av historiska skäl. Det är inte längre tillåtet. (Bidrag från Victor Stinner i bpo-40839.)

  • PyUnicode_FromUnicode(NULL, size) och PyUnicode_FromStringAndSize(NULL, size) ger upphov till DeprecationWarning nu. Använd PyUnicode_New() för att allokera Unicode-objekt utan initiala data. (Bidrag från Inada Naoki i bpo-36346.)

  • Den privata _PyUnicode_Name_CAPI-strukturen i PyCapsule API unicodedata.ucnhash_CAPI har flyttats till det interna C API. (Bidrag från Victor Stinner i bpo-42157.)

  • Py_GetPath(), Py_GetPrefix(), Py_GetExecPrefix(), Py_GetProgramFullPath(), Py_GetPythonHome() och Py_GetProgramName() returnerar nu NULL om de anropas före Py_Initialize() (innan Python har initialiserats). Använd det nya API:et Konfiguration av Python-initialisering för att hämta Konfiguration av Python-sökväg. (Bidrag från Victor Stinner i bpo-42260.)

  • makron PyList_SET_ITEM(), PyTuple_SET_ITEM() och PyCell_SET() kan inte längre användas som l-värde eller r-värde. Till exempel, x = PyList_SET_ITEM(a, b, c) och PyList_SET_ITEM(a, b, c) = x misslyckas nu med ett kompilatorfel. Det förhindrar buggar som if (PyList_SET_ITEM (a, b, c) < 0) ... test. (Bidrag från Zackery Spytz och Victor Stinner i bpo-30459.)

  • De icke-begränsade API-filerna odictobject.h, parser_interface.h, picklebufobject.h, pyarena.h, pyctype.h, pydebug.h, pyfpe.h och pytime.h har flyttats till katalogen Include/cpython. Dessa filer får inte inkluderas direkt, eftersom de redan är inkluderade i Python.h; se Inkludera filer. Om de har inkluderats direkt, överväg att inkludera Python.h istället. (Bidrag från Nicholas Sim i bpo-35134.)

  • Använd typflaggan Py_TPFLAGS_IMMUTABLETYPE för att skapa oföränderliga typobjekt. Lita inte på Py_TPFLAGS_HEAPTYPE för att avgöra om ett typobjekt är föränderligt eller inte; kontrollera om Py_TPFLAGS_IMMUTABLETYPE är satt istället. (Bidrag från Victor Stinner och Erlend E. Aasland i bpo-43908.)

  • Den odokumenterade funktionen Py_FrozenMain har tagits bort från det begränsade API:et. Funktionen är främst användbar för specialbyggda Python. (Bidrag från Petr Viktorin i bpo-26241.)

Föråldrat

  • Funktionen PyUnicode_InternImmortal() är nu föråldrad och kommer att tas bort i Python 3.12: använd PyUnicode_InternInPlace() istället. (Bidrag från Victor Stinner i bpo-41692.)

Borttagen

  • Tog bort Py_UNICODE_str* funktioner som manipulerar Py_UNICODE* strängar. (Bidrag från Inada Naoki i bpo-41123.)

  • Tog bort PyUnicode_GetMax(). Migrera till nya (PEP 393) API:er. (Bidrag från Inada Naoki i bpo-41103.)

  • Tog bort PyLong_FromUnicode(). Migrera till PyLong_FromUnicodeObject(). (Bidrag från Inada Naoki i bpo-41103.)

  • Tog bort PyUnicode_AsUnicodeCopy(). Använd PyUnicode_AsUCS4Copy() eller PyUnicode_AsWideCharString() (Bidrag från Inada Naoki i bpo-41103.)

  • Tog bort variabeln _Py_CheckRecursionLimit: den har ersatts av ceval.recursion_limit i PyInterpreterState-strukturen. (Bidrag från Victor Stinner i bpo-41834.)

  • Tog bort odokumenterade makron Py_ALLOW_RECURSION och Py_END_ALLOW_RECURSION samt fältet recursion_critical i PyInterpreterState-strukturen. (Bidrag från Serhiy Storchaka i bpo-41936.)

  • Tog bort den odokumenterade funktionen PyOS_InitInterrupts(). Initialisering av Python installerar redan implicit signalhanterare: se PyConfig.install_signal_handlers. (Bidrag från Victor Stinner i bpo-41713.)

  • Ta bort funktionen PyAST_Validate(). Det är inte längre möjligt att bygga ett AST-objekt (typ mod_ty) med det publika C API:et. Funktionen var redan utesluten från det begränsade C API:et (PEP 384). (Bidrag från Victor Stinner i bpo-43244.)

  • Ta bort huvudfilen symtable.h och de odokumenterade funktionerna:

    • PyST_GetScope()

    • PySymtable_Build()

    • PySymtable_BuildObject()

    • PySymtable_Free()

    • Py_SymtableString()

    • Py_SymtableStringObject()

    Funktionen Py_SymtableString() ingick av misstag i det stabila ABI:t men kunde inte användas eftersom huvudfilen symtable.h inte ingick i det begränsade C API:t.

    Använd Python symtable-modulen istället. (Bidrag från Victor Stinner i bpo-43244.)

  • Ta bort PyOS_ReadlineFunctionPointer() från de begränsade C API-rubrikerna och från python3.dll, biblioteket som tillhandahåller det stabila ABI:t på Windows. Eftersom funktionen tar ett FILE*-argument kan dess ABI-stabilitet inte garanteras. (Bidrag från Petr Viktorin i bpo-43868.)

  • Ta bort huvudfilerna ast.h, asdl.h och Python-ast.h. Dessa funktioner var odokumenterade och uteslutna från det begränsade C-API:et. De flesta namn som definierades av dessa huvudfiler hade inte prefixet Py och kunde därför skapa namnskonflikter. Till exempel definierade Python-ast.h ett makro Yield som var i konflikt med namnet Yield som används av Windows-huvudfilen <winbase.h>. Använd istället Python-modulen ast. (Bidrag från Victor Stinner i bpo-43244.)

  • Ta bort kompilator- och parserfunktionerna som använder typen struct _mod, eftersom det offentliga AST C API:et togs bort:

    • PyAST_Compile()

    • PyAST_CompileEx()

    • PyAST_CompileObject()

    • PyFuture_FromAST()

    • PyFuture_FromASTObject()

    • PyParser_ASTFromFile()

    • PyParser_ASTFromFileObject()

    • PyParser_ASTFromFilename()

    • PyParser_ASTFromString()

    • PyParser_ASTFromStringObject()

    Dessa funktioner var odokumenterade och exkluderade från det begränsade C API:et. (Bidrag från Victor Stinner i bpo-43244.)

  • Ta bort huvudfilen pyarena.h med funktioner:

    • PyArena_New()

    • PyArena_Free()

    • PyArena_Malloc()

    • PyArena_AddPyObject()

    Dessa funktioner var odokumenterade, exkluderade från det begränsade C API:et och användes endast internt av kompilatorn. (Bidrag från Victor Stinner i bpo-43244.)

  • Medlemmen PyThreadState.use_tracing har tagits bort för att optimera Python. (Bidrag från Mark Shannon i bpo-43760.)

Anmärkningsvärd säkerhetsfunktion i 3.10.7

Konvertering mellan int och str i andra baser än 2 (binär), 4, 8 (oktal), 16 (hexadecimal) eller 32 såsom bas 10 (decimal) ger nu upphov till ett ValueError 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 eller sys API:er. Se dokumentationen Längdsbegränsning för konvertering av heltalssträngar. Standardgränsen är 4300 siffror i strängform.

Anmärkningsvärd säkerhetsfunktion i 3.10.8

Den föråldrade modulen mailcap vägrar nu att injicera osäker text (filnamn, MIME-typer, parametrar) i skalkommandon. Istället för att använda sådan text kommer den att varna och agera som om en matchning inte hittades (eller för testkommandon, som om testet misslyckades). (Bidrag från Petr Viktorin i gh-98966.)

Noterbara ändringar i 3.10.12

tarfil

  • Extraktionsmetoderna i tarfile och shutil.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 en DeprecationWarning. I Python 3.14 kommer standardinställningen att ändras till 'data'. (Bidrag från Petr Viktorin i PEP 706.)