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:
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 utanexcept
ellerfinally
-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:
använda data med typ och form (
ämnet
)utvärdering av
ämnet
imatch
-satsenjämför objektet med varje mönster i en ”fall”-förklaring uppifrån och ner tills en matchning bekräftas.
utföra den åtgärd som är associerad med mönstret för den bekräftade matchningen
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
ochNone
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 metodint.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()
ochdict.items()
har nu alla ettmapping
-attribut som ger etttypes.MappingProxyType`
-objekt som omsluter den ursprungliga ordlistan. (Bidrag från Dennis Sweeney i bpo-40890.)PEP 618: Funktionen
zip()
har nu en valfri flaggastrict
, 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__()
returnerarNotImplemented
, kommer operatoren att falla tillbaka tillobject.__pow__()
ochobject.__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()
ochanext()
har lagts till för att tillhandahålla asynkrona motsvarigheter tilliter()
respektivenext()
. (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 medfrom __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 underfrom __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 underfrom __future__ import annotations
. (Bidrag från Batuhan Taskaya i bpo-42725.)Hashar av NaN-värden av både typen
float
och typendecimal.Decimal
beror nu på objektets identitet. Tidigare hashades de alltid till0
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 ettNameError
) kommer att visas när konstanten__debug__
tas bort. (Bidrag från Donghee Na i bpo-45000.)SyntaxError
-undantag har nu attributenend_lineno
ochend_offset
. De kommer att varaNone
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()
på 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.
Literal
avduplicerar nu parametrar.Jämlikhetsjämförelser mellan
Literal
-objekt är nu orderoberoende.jämförelser av
Literal
respekterar nu typer. Till exempel,Literal[0] == Literal[False]
utvärderades tidigare tillTrue
. Nu är detFalse
. För att stödja denna förändring stöder den internt använda typcachen nu differentierande typer.Literal
objekt kommer nu att ge upphov till ettTypeError
undantag under jämlikhetsjämförelser om någon av deras parametrar inte är hashable. Notera att deklaration avLiteral
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()
ochbytearray()
ä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 kommandotpython3 -m modul-namn
är i genomsnitt 1,4x snabbare. På Linux importerarpython3 -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
medgcc
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
ochstr2.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()
ochfloat()
. (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 internaRLock
. Detta görBZ2File
trådosäker mot flera samtidiga läsare eller skrivare, precis som dess motsvarande klasser igzip
ochlzma
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 nyckelordenand
,else
,for
,if
,in
,is
ochor
. 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 avfind_spec()
),load_module()
(ersatt avexec_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 iimportlib
).ImportWarning
och/ellerDeprecationWarning
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örTypeError
. (Bidrag från Serhiy Storchaka och Raymond Hettinger i bpo-37319.)De olika
load_module()
-metoderna iimportlib
har dokumenterats som föråldrade sedan Python 3.6, men kommer nu också att utlösa enDeprecationWarning
. Användexec_module()
istället. (Bidrag från Brett Cannon i bpo-26131.)zimport.zipimporter.load_module()
har utgått till förmån förexec_module()
. (Bidrag från Brett Cannon i bpo-26131.)Importsystemets användning av
load_module()
utlöser nu enImportWarning
eftersomexec_module()
är att föredra. (Bidrag från Brett Cannon i bpo-26131.)Importsystemets användning av
importlib.abc.MetaPathFinder.find_module()
ochimportlib.abc.PathEntryFinder.find_module()
utlöser nu enImportWarning
eftersomimportlib.abc.MetaPathFinder.find_spec()
respektiveimportlib.abc.PathEntryFinder.find_spec()
föredras. Du kan användaimportlib.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 enImportWarning
eftersomimportlib.abc.PathEntryFinder.find_spec()
är att föredra. Du kan användaimportlib.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()
), ochimportlib.abc.PathEntryFinder.find_loader()
(importlib.machinery.FileFinder.find_loader()
) ger nu upphov tillDeprecationWarning
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ådeimportlib.abc.MetaPathFinder
ochimportlib.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
, ochpkgutil.ImpLoader
har alla uppdaterats för att lista Python 3.12 som den planerade versionen av borttagning (de började höjaDeprecationWarning
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 avmodule_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()
, andimportlib.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 tillstr
. 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ågeparameterncache=shared
. (Bidrag från Erlend E. Aasland i bpo-24464.)Följande
threading
-metoder är nu föråldrade:threading.currentThread
=>threading.current_thread()
threading.activeCount
=>threading.active_count()
threading.Condition.notifyAll
=>threading.Condition.notify_all()
threading.Event.isSet
=>threading.Event.is_set()
threading.Thread.setName
=>threading.Thread.name
threading.thread.getName
=>threading.Thread.name
threading.Thread.isDaemon
=>threading.Thread.daemon
threading.Thread.setDaemon
=>threading.Thread.daemon
(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ändpathlib.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:OP_NO_SSLv2
,OP_NO_SSLv3
,OP_NO_TLSv1
,OP_NO_TLSv1_1
,OP_NO_TLSv1_2
ochOP_NO_TLSv1_3
ersätts avminimum_version
ochmaximum_version
.PROTOCOL_SSLv2
,PROTOCOL_SSLv3
,PROTOCOL_SSLv23
,PROTOCOL_TLSv1
,PROTOCOL_TLSv1_1
,PROTOCOL_TLSv1_2
, ochPROTOCOL_TLS
är föråldrade till förmån förPROTOCOL_TLS_CLIENT
ochPROTOCOL_TLS_SERVER
wrap_socket()
ersätts avssl.SSLContext.wrap_socket()
match_hostname()
RAND_pseudo_bytes()
,RAND_egd()
NPN-funktioner som
ssl.SSLSocket.selected_npn_protocol()
ochssl.SSLContext.set_npn_protocols()
ersätts av ALPN.
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
ochtyping.re
kommer nu att ge upphov tillDeprecationWarning
. Dessa submoduler kommer att tas bort i en framtida version av Python. Allt som hör till dessa undermoduler bör importeras direkt fråntyping
istället. (Bidrag från Sebastian Rittau i bpo-38291.)
Borttagen¶
Tog bort specialmetoderna
__int__
,__float__
,__floordiv__
,__mod__
,__divmod__
,__rfloordiv__
,__rmod__
och__rdivmod__
i klassencomplex
. De gav alltid upphov till ettTypeError
. (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 tillParserBase
och desserror()
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, inklusivenode.h
,parser.h
,graminit.h
ochgrammar.h
.Tog bort de offentliga C API-funktionerna
PyParser_SimpleParseStringFlags
,PyParser_SimpleParseStringFlagsFilename
,PyParser_SimpleParseFileFlags
ochPyNode_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 avasyncio
s högnivå-API efter att ha utgått i Python 3.8. Motivationen bakom denna förändring är mångfaldig:Detta förenklar API:et på hög nivå.
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.
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()
ochprint_exception()
i modulentraceback
har bytt namn till exc. (Bidrag från Zackery Spytz och Matthias Bussonnier i bpo-26389.)atexit
: Vid Python-exit, om en callback registrerad medatexit.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 vadtyping.Callable
gör för närvarande. Detta innebär attcollections.abc.Callable[[int, str], str]
kommer att ha__args__
av(int, str, str)
; tidigare var detta([int, str], str)
. Kod som kommer åt argumenten viatyping.get_args()
eller__args__
måste ta hänsyn till denna ändring. Dessutom kanTypeError
uppstå för ogiltiga former av parametrisering avcollections.abc.Callable
som kan ha passerat tyst i Python 3.9. (Bidrag från Ken Jin i bpo-42195.)socket.htons()
ochsocket.ntohs()
ger nuOverflowError
istället förDeprecationWarning
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 avasyncio
s 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ändaasyncio.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 funktionernaeval()
ochexec()
. Definiera en funktion meddef 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 exempelPyEval_EvalCode()
.Specifikt:
Ett anrop till
PyParser_SimpleParseStringFlags
följt avPyNode_Compile
kan ersättas med ett anrop tillPy_CompileString()
.Det finns ingen direkt ersättning för
PyParser_SimpleParseFileFlags
. För att kompilera kod från ettFILE *
-argument måste du läsa filen i C och skicka den resulterande bufferten tillPy_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 modulenio
medPyImport_ImportModule()
,PyObject_CallMethod()
,PyBytes_AsString()
ochPy_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 medlemmenf_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 exempelPyCode_Addr2Line()
). Observera också attf_lasti
-medlemmen iFrameObject
-objekt inte anses vara stabil: användPyFrame_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()
ochvsnprintf()
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 tillconfigure
-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 modulenensurepip
att leta efter hjulpaketensetuptools
ochpip
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 paketetensurepip._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 biblioteketlibpythonMAJOR.MINOR.a
och inte installera objektfilenpython.o
.(Bidrag från Victor Stinner i bpo-43103.)
Skriptet
configure
använder nu verktygetpkg-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 tillconfigure
-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.
Nya funktioner¶
Resultatet av
PyNumber_Index()
har nu alltid exakt typint
. Tidigare kunde resultatet ha varit en instans av en underklass avint
. (Bidrag från Serhiy Storchaka i bpo-40792.)Lägg till en ny
orig_argv
-medlem iPyConfig
-strukturen: listan över de ursprungliga kommandoradsargumenten som skickas till Python-körprogrammet. (Bidrag från Victor Stinner i bpo-23427.)Makrot
PyDateTime_DATE_GET_TZINFO()
ochPyDateTime_TIME_GET_TZINFO()
har lagts till för åtkomst till attributentzinfo
för objektendatetime.datetime
ochdatetime.time
. (Bidrag från Zackery Spytz i bpo-30155.)Lägg till en
PyCodec_Unregister()
-funktion för att avregistrera en codec-sökfunktion. (Bidrag från Hai Shi i bpo-41842.)Funktionen
PyIter_Send()
lades till för att göra det möjligt att skicka värde till iteratorn utan att utlösaStopIteration
undantag. (Bidrag från Vladimir Matveev i bpo-41756.)Lägg till
PyUnicode_AsUTF8AndSize()
till det begränsade C API:et. (Bidrag från Alex Gaynor i bpo-41784.)Lägg till
PyModule_AddObjectRef()
funktion: liknandePyModule_AddObject()
men stjäl inte en referens till värdet vid framgång. (Bidrag från Victor Stinner i bpo-1635741.)Lägg till funktionerna
Py_NewRef()
ochPy_XNewRef()
för att öka referensantalet för ett objekt och returnera objektet. (Bidrag från Victor Stinner i bpo-42262.)Funktionerna
PyType_FromSpecWithBases()
ochPyType_FromModuleAndSpec()
accepterar nu en enda klass som argument bases. (Bidrag från Serhiy Storchaka i bpo-42423.)Funktionen
PyType_FromModuleAndSpec()
accepterar nu NULLtp_doc
slot. (Bidrag från Hai Shi i bpo-41832.)Funktionen
PyType_GetSlot()
kan acceptera statiska typer. (Bidrag från Hai Shi och Petr Viktorin i bpo-41073.)Lägg till en ny
PySet_CheckExact()
-funktion i C-API för att kontrollera om ett objekt är en instans avset
men inte en instans av en subtyp. (Bidrag från Pablo Galindo i bpo-43277.)Lägg till
PyErr_SetInterruptEx()
som gör det möjligt att skicka ett signalnummer att simulera. (Bidrag från Antoine Pitrou i bpo-43356.)Det begränsade C API:et stöds nu om Python är byggt i felsökningsläge (om makrot
Py_DEBUG
är definierat). I det begränsade C API:et implementeras nu funktionernaPy_INCREF()
ochPy_DECREF()
som opaka funktionsanrop, istället för att direkt komma åt medlemmenPyObject.ob_refcnt
, om Python är byggt i felsökningsläge och makrotPy_LIMITED_API
riktar sig mot Python 3.10 eller senare. Det blev möjligt att stödja det begränsade C API:et i felsökningsläge eftersomPyObject
-strukturen är densamma i release- och felsökningsläge sedan Python 3.8 (se bpo-36465).Det begränsade C-API:et stöds fortfarande inte i specialbygget
--with-trace-refs
(makrotPy_TRACE_REFS
). (Bidrag från Victor Stinner i bpo-43688.)Lägg till funktionen
Py_Is(x, y)
för att testa om objektet x är objektet y, samma sak somx är y
i Python. Lägg också till funktionernaPy_IsNone()
,Py_IsTrue()
,Py_IsFalse()
för att testa om ett objekt ärNone
singleton,True
singleton ellerFalse
singleton. (Bidrag från Victor Stinner i bpo-43753.)Lägg till nya funktioner för att styra garbage collector från C-kod:
PyGC_Enable()
,PyGC_Disable()
,PyGC_IsEnabled()
. Dessa funktioner gör det möjligt att aktivera, avaktivera och fråga om skräpsamlarens tillstånd från C-kod utan att behöva importera modulengc
.Lägg till en ny
Py_TPFLAGS_DISALLOW_INSTANTIATION
typflagga för att inte tillåta skapande av typinstanser. (Bidrag från Victor Stinner i bpo-43916.)Lägg till en ny
Py_TPFLAGS_IMMUTABLETYPE
typflagga för att skapa oföränderliga typobjekt: typattribut kan inte ställas in eller tas bort. (Bidrag från Victor Stinner och Erlend E. Aasland i bpo-43908.)
Portning till Python 3.10¶
Makrot
PY_SSIZE_T_CLEAN
måste nu definieras för att använda formatenPyArg_ParseTuple()
ochPy_BuildValue()
som använder#
:es#
,et#
,s#
,u#
,y#
,z#
,U#
ochZ#
. 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åstePy_REFCNT(obj) = new_refcnt
ersättas medPy_SET_REFCNT(obj, new_refcnt)
: sePy_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)
ochPyUnicode_FromStringAndSize(NULL, size)
ger upphov tillDeprecationWarning
nu. AnvändPyUnicode_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 APIunicodedata.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()
ochPy_GetProgramName()
returnerar nuNULL
om de anropas förePy_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()
ochPyCell_SET()
kan inte längre användas som l-värde eller r-värde. Till exempel,x = PyList_SET_ITEM(a, b, c)
ochPyList_SET_ITEM(a, b, c) = x
misslyckas nu med ett kompilatorfel. Det förhindrar buggar somif (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
ochpytime.h
har flyttats till katalogenInclude/cpython
. Dessa filer får inte inkluderas direkt, eftersom de redan är inkluderade iPython.h
; se Inkludera filer. Om de har inkluderats direkt, överväg att inkluderaPython.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 omPy_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ändPyUnicode_InternInPlace()
istället. (Bidrag från Victor Stinner i bpo-41692.)
Borttagen¶
Tog bort
Py_UNICODE_str*
funktioner som manipulerarPy_UNICODE*
strängar. (Bidrag från Inada Naoki i bpo-41123.)Py_UNICODE_strlen
: användPyUnicode_GetLength()
ellerPyUnicode_GET_LENGTH
Py_UNICODE_strcat
: användPyUnicode_CopyCharacters()
ellerPyUnicode_FromFormat()
Py_UNICODE_strcpy
,Py_UNICODE_strncpy
: användPyUnicode_CopyCharacters()
ellerPyUnicode_Substring()
Py_UNICODE_strcmp
: användPyUnicode_Compare()
Py_UNICODE_strncmp
: användPyUnicode_Tailmatch()
Py_UNICODE_strchr
,Py_UNICODE_strrchr
: usePyUnicode_FindChar()
Tog bort
PyUnicode_GetMax()
. Migrera till nya (PEP 393) API:er. (Bidrag från Inada Naoki i bpo-41103.)Tog bort
PyLong_FromUnicode()
. Migrera tillPyLong_FromUnicodeObject()
. (Bidrag från Inada Naoki i bpo-41103.)Tog bort
PyUnicode_AsUnicodeCopy()
. AnvändPyUnicode_AsUCS4Copy()
ellerPyUnicode_AsWideCharString()
(Bidrag från Inada Naoki i bpo-41103.)Tog bort variabeln
_Py_CheckRecursionLimit
: den har ersatts avceval.recursion_limit
iPyInterpreterState
-strukturen. (Bidrag från Victor Stinner i bpo-41834.)Tog bort odokumenterade makron
Py_ALLOW_RECURSION
ochPy_END_ALLOW_RECURSION
samt fältetrecursion_critical
iPyInterpreterState
-strukturen. (Bidrag från Serhiy Storchaka i bpo-41936.)Tog bort den odokumenterade funktionen
PyOS_InitInterrupts()
. Initialisering av Python installerar redan implicit signalhanterare: sePyConfig.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 (typmod_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 huvudfilensymtable.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ånpython3.dll
, biblioteket som tillhandahåller det stabila ABI:t på Windows. Eftersom funktionen tar ettFILE*
-argument kan dess ABI-stabilitet inte garanteras. (Bidrag från Petr Viktorin i bpo-43868.)Ta bort huvudfilerna
ast.h
,asdl.h
ochPython-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 prefixetPy
och kunde därför skapa namnskonflikter. Till exempel definieradePython-ast.h
ett makroYield
som var i konflikt med namnetYield
som används av Windows-huvudfilen<winbase.h>
. Använd istället Python-modulenast
. (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
ochshutil.unpack_archive()
har ett nytt filter-argument som gör det möjligt att begränsa tarfunktioner som kan vara överraskande eller farliga, t.ex. att skapa filer utanför destinationskatalogen. Se Filter för utsugning för detaljer. I Python 3.12 kommer användning utan filter-argumentet att visa enDeprecationWarning
. I Python 3.14 kommer standardinställningen att ändras till'data'
. (Bidrag från Petr Viktorin i PEP 706.)