Vad är nytt i Python 3.9¶
- Redigerare:
Łukasz Langa
I den här artikeln förklaras de nya funktionerna i Python 3.9 jämfört med 3.8. Python 3.9 släpptes den 5 oktober 2020. För fullständig information, se changelog.
Se även
PEP 596 - Python 3.9 Utgivningsschema
Sammanfattning – Release highlights¶
Nya syntaxfunktioner:
PEP 584, unionsoperatorer tillagda i
dict
;PEP 585, typhintande generik i standardsamlingar;
PEP 614, lättade på grammatiska begränsningar för dekoratorer.
Nya inbyggda funktioner:
PEP 616, strängmetoder för att ta bort prefix och suffix.
Nya funktioner i standardbiblioteket:
PEP 593, flexibla funktions- och variabelanteckningar;
os.pidfd_open()
tillagd som möjliggör processhantering utan tävlingar och signaler.
Förbättringar av tolkar:
PEP 573, snabb tillgång till modulstatus från metoder för C-tilläggstyper;
PEP 617, CPython använder nu en ny parser baserad på PEG;
ett antal Python-inbyggda program (range, tuple, set, frozenset, list, dict) snabbas nu upp med PEP 590 vectorcall;
skräpinsamlingen blockerar inte på återuppståndna objekt;
ett antal Python-moduler (
_abc
,audioop
,_bz2
,_codecs
,_contextvars
,_crypt
,_functools
,_json
,_locale
,math
,operator
,resource
,time
,_weakref
) använder nu flerfasinitialisering enligt definitionen i PEP 489;ett antal standardbiblioteksmoduler (
audioop
,ast
,grp
,_hashlib
,pwd
,_posixsubprocess
,random
,select
,struct
,termios
,zlib
) använder nu det stabila ABI som definieras av PEP 384.
Nya biblioteksmoduler:
PEP 615, IANA:s tidszonsdatabas finns nu i standardbiblioteket i modulen
zoneinfo
;en implementation av en topologisk sortering av en graf finns nu i den nya
graphlib
-modulen.
Förändringar i releaseprocessen:
PEP 602, CPython antar en årlig utgivningscykel.
Du bör kontrollera om det finns DeprecationWarning i din kod¶
När Python 2.7 fortfarande stöddes behölls en hel del funktionalitet i Python 3 för bakåtkompatibilitet med Python 2.7. I och med slutet av Python 2-stödet har dessa bakåtkompatibilitetslager tagits bort eller kommer snart att tas bort. De flesta av dem utfärdade en DeprecationWarning
-varning i flera år. Om du till exempel använder collections.Mapping
i stället för collections.abc.Mapping
visas en DeprecationWarning
sedan Python 3.3, som släpptes 2012.
Testa din applikation med kommandoradsalternativet -W
default
för att se DeprecationWarning
och PendingDeprecationWarning
, eller till och med med -W
error
för att behandla dem som fel. Warnings Filter kan användas för att ignorera varningar från tredjepartskod.
Python 3.9 är den sista versionen som tillhandahåller dessa Python 2 bakåtkompatibilitetslager, för att ge mer tid till Python-projektansvariga att organisera borttagningen av Python 2-stödet och lägga till stöd för Python 3.9.
Aliaser till Abstract Base Classes i modulen collections
, som collections.Mapping
alias till collections.abc.Mapping
, behålls i en sista version för bakåtkompatibilitet. De kommer att tas bort från Python 3.10.
Mer generellt, försök att köra dina tester i Python Development Mode som hjälper till att förbereda din kod för att göra den kompatibel med nästa Python-version.
Notera: ett antal redan existerande deprecations togs bort i denna version av Python också. Se avsnittet Borttagen.
Nya funktioner¶
Operatorer för sammanslagning och uppdatering av ordböcker¶
Operatorerna merge (|
) och update (|=
) har lagts till i den inbyggda klassen dict
. Dessa kompletterar de befintliga metoderna dict.update
och {**d1, **d2}
för sammanslagning av ordböcker.
Exempel:
>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}
>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>> y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}
Se PEP 584 för en fullständig beskrivning. (Bidrag från Brandt Bucher i bpo-36144.)
Nya strängmetoder för att ta bort prefix och suffix¶
str.removeprefix(prefix)
och str.removesuffix(suffix)
har lagts till för att enkelt ta bort ett onödigt prefix eller suffix från en sträng. Motsvarande metoder bytes
, bytearray
och collections.UserString
har också lagts till. Se PEP 616 för en fullständig beskrivning. (Bidrag från Dennis Sweeney i bpo-39939.)
Typhintande generik i standardkollektioner¶
I typannoteringar kan du nu använda inbyggda samlingstyper som list
och dict
som generiska typer istället för att importera motsvarande typer med stor bokstav (t.ex. List
eller Dict
) från typing
. Vissa andra typer i standardbiblioteket är nu också generiska, till exempel queue.Queue
.
Exempel:
def greet_all(names: list[str]) -> None:
för namn i names:
print("Hello", namn)
Se PEP 585 för mer information. (Bidrag från Guido van Rossum, Ethan Smith och Batuhan Taşkaya i bpo-39481.)
Ny parser¶
Python 3.9 använder en ny parser, baserad på PEG istället för LL(1). Den nya parserns prestanda är ungefär jämförbar med den gamla parserns, men PEG-formalismen är mer flexibel än LL(1) när det gäller att utforma nya språkfunktioner. Vi kommer att börja använda denna flexibilitet i Python 3.10 och senare.
Modulen ast
använder den nya parsern och producerar samma AST som den gamla parsern.
I Python 3.10 kommer den gamla parsern att raderas, liksom all funktionalitet som är beroende av den (främst modulen parser
, som sedan länge är föråldrad). I Python 3.9 endast kan du byta tillbaka till LL(1)-parsern med hjälp av en kommandoradsväxel (-X oldparser
) eller en miljövariabel (PYTHONOLDPARSER=1
).
Se PEP 617 för mer information. (Bidrag från Guido van Rossum, Pablo Galindo och Lysandros Nikolaou i bpo-40334.)
Andra språkliga förändringar¶
__import__()
ger nu upphov tillImportError
istället förValueError
, vilket brukade inträffa när en relativ import gick förbi sitt toppnivåpaket. (Bidrag från Ngalim Siregar i bpo-37444.)Python får nu den absoluta sökvägen till skriptfilnamnet som anges på kommandoraden (ex:
python3 script.py
): attributet__file__
i modulen__main__
blev en absolut sökväg, snarare än en relativ sökväg. Dessa sökvägar förblir nu giltiga efter att den aktuella katalogen har ändrats medos.chdir()
. Som en bieffekt visar spårningen även den absoluta sökvägen för__main__
-modulramarna i det här fallet. (Bidrag från Victor Stinner i bpo-20443.)I Python Development Mode och i debug build kontrolleras nu argumenten encoding och errors för strängkodning och avkodning. Exempel:
open()
,str.encode()
ochbytes.decode()
.Som standard, för bästa prestanda, kontrolleras errors-argumentet endast vid det första kodnings-/avkodningsfelet och encoding-argumentet ignoreras ibland för tomma strängar. (Bidrag från Victor Stinner i bpo-37388.)
"".replace("", s, n)
returnerar nus
istället för en tom sträng för allan
som inte är noll. Det är nu konsekvent med"".replace("", s)
. Det finns liknande ändringar för objektenbytes
ochbytearray
. (Bidrag från Serhiy Storchaka i bpo-28029.)Alla giltiga uttryck kan nu användas som en decorator. Tidigare var grammatiken mycket mer restriktiv. Se PEP 614 för detaljer. (Bidrag från Brandt Bucher i bpo-39702.)
Förbättrad hjälp för modulen
typing
. Nu visas dokumentsträngar för alla specialformer och speciella generiska alias (somUnion
ochList
). Om du använderhelp()
med ett generiskt alias somList[int]
visas hjälpen för den motsvarande konkreta typen (list
i det här fallet). (Bidrag från Serhiy Storchaka i bpo-40257.)Parallellkörning av
aclose()
/asend()
/athrow()
är nu förbjuden ochag_running
återspeglar nu den faktiska körstatusen för asyncgeneratorn. (Bidrag från Yury Selivanov i bpo-30773.)Oväntade fel vid anrop av metoden
__iter__
maskeras inte längre avTypeError
i operatornin
och funktionernacontains()
,indexOf()
ochcountOf()
i modulenoperator
. (Bidrag från Serhiy Storchaka i bpo-40824.)Lambdauttryck som inte är parenthesized kan inte längre vara uttrycksdelen i en
if
-sats i förståelser och generatoruttryck. Se bpo-41848 och bpo-43755 för detaljer.
Nya moduler¶
zoninfo¶
Modulen zoneinfo
ger stöd för IANA:s tidszonsdatabas till standardbiblioteket. Den lägger till zoneinfo.ZoneInfo
, en konkret implementation av datetime.tzinfo
som stöds av systemets tidszonsdata.
Exempel:
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Daylight saving time
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'
>>> # Standard time
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST
Som en reservkälla för data för plattformar som inte levererar IANA-databasen släpptes modulen tzdata som ett förstapartspaket - distribuerat via PyPI och underhållet av CPython-kärnteamet.
Se även
- PEP 615 – Stöd för IANA:s tidszonsdatabas i standardbiblioteket
PEP skrivet och implementerat av Paul Ganssle
graflib¶
En ny modul, graphlib
, har lagts till som innehåller klassen graphlib.TopologicalSorter
för att erbjuda funktionalitet för att utföra topologisk sortering av grafer. (Bidrag från Pablo Galindo, Tim Peters och Larry Hastings i bpo-17005.)
Förbättrade moduler¶
ast¶
Lade till alternativet indent till dump()
som gör det möjligt att producera en flerradig indragen utdata. (Bidrag från Serhiy Storchaka i bpo-37995.)
Lade till ast.unparse()
som en funktion i modulen ast
som kan användas för att unparsa ett ast.AST
-objekt och producera en sträng med kod som skulle producera ett motsvarande ast.AST
-objekt när det parsas. (Bidrag från Pablo Galindo och Batuhan Taskaya i bpo-38870.)
Lade till docstrings till AST-noder som innehåller ASDL-signaturen som användes för att konstruera den noden. (Bidrag från Batuhan Taskaya i bpo-39638.)
asyncio¶
På grund av betydande säkerhetsproblem stöds inte längre parametern reuse_address i asyncio.loop.create_datagram_endpoint()
. Detta beror på beteendet hos socket-alternativet SO_REUSEADDR
i UDP. För mer information, se dokumentationen för loop.create_datagram_endpoint()
. (Bidrag från Kyle Stanley, Antoine Pitrou och Yury Selivanov i bpo-37228.)
Lagt till en ny coroutine shutdown_default_executor()
som schemalägger en avstängning för standardutföraren som väntar på att ThreadPoolExecutor
ska stängas. Dessutom har asyncio.run()
uppdaterats för att använda den nya coroutine. (Bidrag från Kyle Stanley i bpo-34037.)
Lagt till asyncio.PidfdChildWatcher
, en Linux-specifik implementation av en child watcher som pollar process file descriptors. (bpo-38692)
Lade till en ny coroutine asyncio.to_thread()
. Den används huvudsakligen för att köra IO-bundna funktioner i en separat tråd för att undvika blockering av händelseslingan, och fungerar i huvudsak som en högnivåversion av run_in_executor()
som direkt kan ta nyckelordsargument. (Bidrag från Kyle Stanley och Yury Selivanov i bpo-32309.)
När en uppgift avbryts på grund av en timeout, kommer asyncio.wait_for()
nu att vänta tills avbrytandet är klart även i fallet när timeout är <= 0, precis som den gör med positiva timeouts. (Bidrag från Elvis Pranskevichus i bpo-32751.)
asyncio
ger nu upphov till TypeError
när man anropar inkompatibla metoder med en ssl.SSLSocket
socket. (Bidrag från Ido Michael i bpo-37404.)
compileall¶
Lagt till ny möjlighet att använda hardlinks för duplicerade .pyc
-filer: parametern hardlink_dupes och kommandoradsalternativet –hardlink-dupes. (Bidrag från Lumír ’Frenzy’ Balhar i bpo-40495.)
Nya alternativ för sökvägsmanipulation i resulterande .pyc
-filer har lagts till: parametrarna stripdir, prependdir, limit_sl_dest och kommandoradsalternativen -s, -p, -e. Lagt till möjligheten att ange alternativet för en optimeringsnivå flera gånger. (Bidrag från Lumír ’Frenzy’ Balhar i bpo-38112.)
concurrent.futures¶
Lade till en ny cancel_futures parameter till concurrent.futures.Executor.shutdown()
som avbryter alla väntande futures som inte har börjat köras, istället för att vänta på att de ska slutföras innan exekutorn stängs av. (Bidrag från Kyle Stanley i bpo-39349.)
Tog bort daemon-trådar från ThreadPoolExecutor
och ProcessPoolExecutor
. Detta förbättrar kompatibiliteten med undertolkare och förutsägbarheten i deras avstängningsprocesser. (Bidrag från Kyle Stanley i bpo-39812.)
Arbetare i ProcessPoolExecutor
skapas nu på begäran, endast när det inte finns några lediga arbetare att återanvända. Detta optimerar startomkostnaderna och minskar mängden förlorad CPU-tid till inaktiva arbetare. (Bidrag från Kyle Stanley i bpo-39207.)
curses¶
Lagt till funktionerna curses.get_escdelay()
, curses.set_escdelay()
, curses.get_tabsize()
och curses.set_tabsize()
. (Bidrag från Anthony Sottile i bpo-38312.)
datatid¶
Metoderna isocalendar()
av datetime.date
och isocalendar()
av datetime.datetime
returnerar nu en namedtuple()
istället för en tuple
. (Bidrag från Donghee Na i bpo-24416.)
distutils¶
Kommandot upload skapar nu SHA2-256- och Blake2b-256-hashtester. Det hoppar över MD5 på plattformar som blockerar MD5-digest. (Bidrag från Christian Heimes i bpo-40698.)
fcntl¶
Lagt till konstanterna fcntl.F_OFD_GETLK
, fcntl.F_OFD_SETLK
och fcntl.F_OFD_SETLKW
. (Bidrag från Donghee Na i bpo-38602.)
ftplib¶
FTP
och FTP_TLS
ger nu upphov till ett ValueError
om den angivna timeouten för deras konstruktörer är noll för att förhindra skapandet av en icke-blockerande socket. (Bidrag från Donghee Na i bpo-39259.)
gc¶
När skräpsamlaren gör en insamling där vissa objekt återuppstår (de är nåbara utanför de isolerade cyklerna efter att finalizers har exekverats), blockera inte insamlingen av alla objekt som fortfarande är oåtkomliga. (Bidrag från Pablo Galindo och Tim Peters i bpo-38379.)
Lagt till en ny funktion gc.is_finalized()
för att kontrollera om ett objekt har slutbehandlats av skräpsamlaren. (Bidrag från Pablo Galindo i bpo-39322.)
hashlib¶
Modulen hashlib
kan nu använda SHA3-hashar och SHAKE XOF från OpenSSL när de är tillgängliga. (Bidrag från Christian Heimes i bpo-37630.)
Inbyggda hashmoduler kan nu inaktiveras med ./configure --without-builtin-hashlib-hashes
eller selektivt aktiveras med t.ex. ./configure --with-builtin-hashlib-hashes=sha3,blake2
för att tvinga fram användning av OpenSSL-baserad implementering. (Bidrag från Christian Heimes i bpo-40479)
http¶
HTTP-statuskoderna 103 EARLY_HINTS
, 418 IM_A_TEAPOT
och 425 TOO_EARLY
läggs till i http.HTTPStatus
. (Bidrag från Donghee Na i bpo-39509 och Ross Rhodes i bpo-39507.)
IDLE och idlelib¶
Lagt till alternativ för att slå av markörblinkning. (Bidrag från Zackery Spytz i bpo-4603.)
Escape-tangenten stänger nu IDLE-avslutningsfönster. (Bidrag från Johnny Najera i bpo-38944.)
Lade till nyckelord i listan för komplettering av modulnamn. (Bidrag från Terry J. Reedy i bpo-37765.)
Nytt i 3.9 underhållsversioner
Få IDLE att anropa sys.excepthook()
(när den startas utan ’-n’). Användarkrokar ignorerades tidigare. (Bidrag från Ken Hilton i bpo-43008.)
Ändringarna ovan har backporterats till underhållsversionerna av 3.8.
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.)
Tillämpa syntaxmarkering på .pyi
-filer. (Bidrag från Alex Waygood och Terry Jan Reedy i bpo-45447.)
imaplib¶
IMAP4
och IMAP4_SSL
har nu en valfri timeout-parameter för sina konstruktörer. Även metoden open()
har nu en valfri timeout-parameter i och med denna ändring. De åsidosatta metoderna i IMAP4_SSL
och IMAP4_stream
tillämpades på denna ändring. (Bidrag från Donghee Na i bpo-38615.)
imaplib.IMAP4.unselect()
läggs till. imaplib.IMAP4.unselect()
frigör serverns resurser som är associerade med den valda brevlådan och återställer servern till det autentiserade tillståndet. Det här kommandot utför samma åtgärder som imaplib.IMAP4.close()
, förutom att inga meddelanden tas bort permanent från den valda brevlådan. (Bidrag från Donghee Na i bpo-40375.)
importlib¶
För att förbättra konsekvensen med importmeddelanden, ger importlib.util.resolve_name()
nu ImportError
istället för ValueError
för ogiltiga relativa importförsök. (Bidrag från Ngalim Siregar i bpo-37444.)
Importladdare som publicerar oföränderliga modulobjekt kan nu publicera oföränderliga paket utöver enskilda moduler. (Bidrag från Dino Viehland i bpo-39336.)
Lagt till importlib.resources.files()
-funktionen med stöd för underkataloger i paketdata, motsvarande backport i importlib_resources
version 1.5. (Bidrag från Jason R. Coombs i bpo-39791.)
Uppdaterade importlib.metadata
från importlib_metadata
version 1.6.1.
inspektera¶
inspect.BoundArguments.arguments
ändras från OrderedDict
till vanlig dict. (Bidrag från Inada Naoki i bpo-36350 och bpo-39775.)
ipadress¶
ipaddress
har nu stöd för IPv6 Scoped Addresses (IPv6-adress med suffixet %<scope_id>
).
Scoped IPv6-adresser kan tolkas med hjälp av ipaddress.IPv6Address
. Om det finns ett scope zone ID är det tillgängligt via attributet scope_id
. (Bidrag från Oleksandr Pavliuk i bpo-34788.)
Från och med Python 3.9.5 accepterar modulen ipaddress
inte längre några inledande nollor i IPv4-adresssträngar. (Bidrag från Christian Heimes i bpo-36384).
matematik¶
Utökade math.gcd()
-funktionen till att hantera flera argument. Tidigare hade den bara stöd för två argument. (Bidrag från Serhiy Storchaka i bpo-39648.)
Lagt till math.lcm()
: returnerar den minsta gemensamma multipeln av angivna argument. (Bidrag från Mark Dickinson, Ananthakrishnan och Serhiy Storchaka i bpo-39479 och bpo-39648.)
Lagt till math.nextafter()
: returnerar nästa flyttalsvärde efter x mot y. (Bidrag från Victor Stinner i bpo-39288.)
Lagt till math.ulp()
: returnerar värdet av den minst signifikanta biten i en float. (Bidrag från Victor Stinner i bpo-39310.)
multiprocessing¶
Klassen multiprocessing.SimpleQueue
har en ny close()
-metod för att explicit stänga kön. (Bidrag från Victor Stinner i bpo-30966.)
nntplib¶
NNTP
och NNTP_SSL
ger nu upphov till ett ValueError
om den angivna timeouten för deras konstruktörer är noll för att förhindra skapandet av en icke-blockerande socket. (Bidrag från Donghee Na i bpo-39259.)
os¶
Lade till CLD_KILLED
och CLD_STOPPED
för si_code
. (Bidrag från Donghee Na i bpo-38493.)
Exponerade de Linux-specifika os.pidfd_open()
(bpo-38692) och os.P_PIDFD
(bpo-38713) för processhantering med filbeskrivare.
Funktionen os.unsetenv()
är nu även tillgänglig i Windows. (Bidrag från Victor Stinner i bpo-39413.)
Funktionerna os.putenv()
och os.unsetenv()
är nu alltid tillgängliga. (Bidrag från Victor Stinner i bpo-39395.)
Lagt till os.waitstatus_to_exitcode()
funktion: konverterar en väntestatus till en utgångskod. (Bidrag från Victor Stinner i bpo-40094.)
sökväg¶
Lagt till pathlib.Path.readlink()
som fungerar på liknande sätt som os.readlink()
. (Bidrag från Girts Folkmanis i bpo-30618)
pdb¶
På Windows stöder nu Pdb
~/.pdbrc
. (Bidrag från Tim Hopper och Dan Lidral-Porter i bpo-20523.)
poplib¶
POP3
och POP3_SSL
ger nu upphov till ett ValueError
om den angivna timeouten för deras konstruktörer är noll för att förhindra att ett icke-blockerande uttag skapas. (Bidrag från Donghee Na i bpo-39259.)
tryck¶
pprint
kan nu pretty-printa types.SimpleNamespace
. (Bidrag från Carl Bordum Hansen i bpo-37376.)
pydoc¶
Dokumentationssträngen visas nu inte bara för klass, funktion, metod etc, utan för alla objekt som har sitt eget __doc__
-attribut. (Bidrag från Serhiy Storchaka i bpo-40257.)
slumpvis¶
Lagt till en ny random.Random.randbytes()
-metod: generera slumpmässiga byte. (Bidrag från Victor Stinner i bpo-40286.)
signal¶
Exponerade den Linux-specifika signal.pidfd_send_signal()
för att skicka signaler till en process som använder en filbeskrivare istället för en pid. (bpo-38712)
smtplib¶
SMTP
och SMTP_SSL
ger nu upphov till ett ValueError
om den angivna timeouten för deras konstruktörer är noll för att förhindra att en icke-blockerande socket skapas. (Bidrag från Donghee Na i bpo-39259.)
LMTP
-konstruktören har nu en valfri timeout-parameter. (Bidrag från Donghee Na i bpo-39329.)
kortplats¶
Modulen socket
exporterar nu konstanten CAN_RAW_JOIN_FILTERS
på Linux 4.1 och senare. (Bidrag från Stefan Tatschner och Zackery Spytz i bpo-25780.)
Socket-modulen stöder nu CAN_J1939
-protokollet på plattformar som stöder det. (Bidrag från Karl Ding i bpo-40291.)
Socket-modulen har nu funktionerna socket.send_fds()
och socket.recv_fds()
. (Bidrag från Joannah Nanjekye, Shinya Okano och Victor Stinner i bpo-28724.)
tid¶
På AIX implementeras nu thread_time()
med thread_cputime()
som har en upplösning på nanosekunder, istället för clock_gettime(CLOCK_THREAD_CPUTIME_ID)
som har en upplösning på 10 millisekunder. (Bidrag från Batuhan Taskaya i bpo-40192)
system¶
Lade till ett nytt sys.platlibdir
-attribut: namnet på den plattformsspecifika bibliotekskatalogen. Den används för att bygga sökvägen till standardbiblioteket och sökvägarna till installerade tilläggsmoduler. Det är lika med "lib"
på de flesta plattformar. På Fedora och SuSE är det lika med "lib64"
på 64-bitars plattformar. (Bidrag från Jan Matějek, Matěj Cepl, Charalampos Stratakis och Victor Stinner i bpo-1294959.)
Tidigare var sys.stderr
blockbuffrad när den inte var interaktiv. Nu är stderr
standardinställning att alltid vara linje-buffrad. (Bidrag från Jendrik Seipp i bpo-13601.)
tracemalloc¶
Lagt till tracemalloc.reset_peak()
för att ställa in toppstorleken för spårade minnesblock till den aktuella storleken, för att mäta toppen för specifika bitar av kod. (Bidrag från Huon Wilson i bpo-40630.)
typing¶
PEP 593 introducerade en typing.Annotated
-typ för att dekorera befintliga typer med kontextspecifika metadata och en ny include_extras
-parameter till typing.get_type_hints()
för att komma åt metadata vid körning. (Bidrag från Till Varoquaux och Konstantin Kashin.)
unicodedata¶
Unicode-databasen har uppdaterats till version 13.0.0. (bpo-39926).
ven¶
De aktiveringsskript som tillhandahålls av venv
anger nu alla sin promptanpassning konsekvent genom att alltid använda det värde som anges av __VENV_PROMPT__
. Tidigare använde vissa skript ovillkorligen __VENV_PROMPT__
, andra bara om det råkade vara inställt (vilket var standardfallet) och ett skript använde __VENV_NAME__
istället. (Bidrag från Brett Cannon i bpo-37663.)
xml¶
Vita tecken inom attribut bevaras nu vid serialisering av xml.etree.ElementTree
till XML-fil. EOLNs normaliseras inte längre till ”n”. Detta är resultatet av en diskussion om hur man ska tolka avsnitt 2.11 i XML-specifikationen. (Bidrag från Mefistotelis i bpo-39011.)
Optimeringar¶
Optimerat idiomet för tilldelning av en temporär variabel i förståelser. Nu är
for y in [expr]
i förståelser lika snabbt som en enkel tilldelningy = expr
. Till exempel:summor = [s för s i [0] för x i data för s i [s + x]]
Till skillnad från operatorn
:=
läcker detta idiom inte en variabel till det yttre omfånget.(Bidrag från Serhiy Storchaka i bpo-32856.)
Optimerad signalhantering i flertrådade program. Om en annan tråd än huvudtråden får en signal, avbryts inte längre bytecode-utvärderingsloopen vid varje bytecode-instruktion för att kontrollera om det finns väntande signaler som inte kan hanteras. Endast huvudtråden i huvudtolken kan hantera signaler.
Tidigare avbröts bytecode-utvärderingsslingan vid varje instruktion tills huvudtråden hanterade signaler. (Bidrag från Victor Stinner i bpo-40010.)
Optimerade modulen
subprocess
på FreeBSD med hjälp avclosefrom()
. (Bidrag från Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak och Victor Stinner i bpo-38061.)PyLong_FromDouble()
är nu upp till 1,87 gånger snabbare för värden som passar in i long. (Bidrag från Sergey Fedoseev i bpo-37986.)Ett antal Python-inbyggnader (
range
,tuple
,set
,frozenset
,list
,dict
) snabbas nu upp genom att använda PEP 590 vectorcall-protokollet. (Bidrag från Donghee Na, Mark Shannon, Jeroen Demeyer och Petr Viktorin i bpo-37207.)Optimerade
set.difference_update()
för fallet när den andra uppsättningen är mycket större än basuppsättningen. (Föreslagen av Evgeny Kapun med kod från Michele Orrù i bpo-8425.)Pythons allokator för små objekt (
obmalloc.c
) tillåter nu (högst) en tom arena att förbli tillgänglig för omedelbar återanvändning, utan att återlämna den till operativsystemet. Detta förhindrar thrashing i enkla loopar där en arena skulle kunna skapas och förstöras på nytt vid varje iteration. (Bidrag från Tim Peters i bpo-37257.)floor division of float operation har nu bättre prestanda. Även meddelandet för
ZeroDivisionError
för denna operation har uppdaterats. (Bidrag från Donghee Na i bpo-39434.)Avkodning av korta ASCII-strängar med UTF-8 och ascii-codecs är nu ca 15% faster. (Bidrag från Inada Naoki i bpo-37348.)
Här är en sammanfattning av prestandaförbättringar från Python 3.4 till Python 3.9:
Python version 3.4 3.5 3.6 3.7 3.8 3.9
-------------- --- --- --- --- --- ---
Variable and attribute read access:
read_local 7.1 7.1 5.4 5.1 3.9 3.9
read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.5
read_global 15.5 19.0 14.3 13.6 7.6 7.8
read_builtin 21.1 21.6 18.5 19.0 7.5 7.8
read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 17.9
read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 16.9
read_instancevar 32.4 33.1 28.0 26.3 25.4 25.3
read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 20.5
read_namedtuple 73.8 57.5 45.0 46.8 18.4 18.7
read_boundmethod 37.6 37.9 29.6 26.9 27.7 41.1
Variable and attribute write access:
write_local 8.7 9.3 5.5 5.3 4.3 4.3
write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.8
write_global 19.7 21.2 18.0 18.0 15.8 16.7
write_classvar 92.9 96.0 104.6 102.1 39.2 39.8
write_instancevar 44.6 45.8 40.0 38.9 35.5 37.4
write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 25.8
Data structure read access:
read_list 24.2 24.5 20.8 20.8 19.0 19.5
read_deque 24.7 25.5 20.2 20.6 19.8 20.2
read_dict 24.3 25.7 22.3 23.0 21.0 22.4
read_strdict 22.6 24.3 19.5 21.2 18.9 21.5
Data structure write access:
write_list 27.1 28.5 22.5 21.6 20.0 20.0
write_deque 28.7 30.1 22.7 21.8 23.5 21.7
write_dict 31.4 33.3 29.3 29.2 24.7 25.4
write_strdict 28.4 29.9 27.5 25.2 23.1 24.5
Stack (or queue) operations:
list_append_pop 93.4 112.7 75.4 74.2 50.8 50.6
deque_append_pop 43.5 57.0 49.4 49.2 42.5 44.2
deque_append_popleft 43.7 57.3 49.7 49.7 42.8 46.4
Timing loop:
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3
Dessa resultat genererades från skriptet Variable Access Benchmark på : Tools/scripts/var_access_benchmark.py
. Benchmarkskriptet visar tidsangivelser i nanosekunder. Riktmärkena uppmättes på en Intel® Core™ i7-4960HQ-processor som körde macOS 64-bitars builds som finns på python.org.
Föråldrat¶
Distutils kommandot
bdist_msi
är nu föråldrat, användbdist_wheel
(wheel-paket) istället. (Bidrag från Hugo van Kemenade i bpo-39586.)För närvarande accepterar
math.factorial()
float
instanser med icke-negativa heltalsvärden (som5.0
). Den ger upphov till ettValueError
för icke-integrala och negativa float-värden. Det är nu föråldrat. I framtida Python-versioner kommer den att ge upphov till ettTypeError
för alla flyttal. (Bidrag från Serhiy Storchaka i bpo-37315.)Modulerna
parser
ochsymbol
är föråldrade och kommer att tas bort i framtida versioner av Python. För de flesta användningsfall kan användare utnyttja genererings- och kompileringssteget för AST (Abstract Syntax Tree) med modulenast
.De offentliga C API-funktionerna
PyParser_SimpleParseStringFlags()
,PyParser_SimpleParseStringFlagsFilename()
,PyParser_SimpleParseFileFlags()
ochPyNode_Compile()
är föråldrade och kommer att tas bort i Python 3.10 tillsammans med den gamla parsern.Att använda
NotImplemented
i en boolesk kontext har uteslutits, eftersom det nästan uteslutande är resultatet av felaktiga implementationer av rik komparator. Det kommer att göras till ettTypeError
i en framtida version av Python. (Bidrag från Josh Rosenberg i bpo-35712.)Modulen
random
accepterar för närvarande vilken hashbar typ som helst som ett möjligt seed-värde. Tyvärr är vissa av dessa typer inte garanterade att ha ett deterministiskt hashvärde. Efter Python 3.9 kommer modulen att begränsa sina fröer tillNone
,int
,float
,str
,bytes
ochbytearray
.Att öppna
GzipFile
-filen för skrivning utan att ange mode-argumentet är föråldrat. I framtida Python-versioner kommer den alltid att öppnas för läsning som standard. Ange mode-argumentet för att öppna den för skrivning och tysta en varning. (Bidrag från Serhiy Storchaka i bpo-28286.)Föråldrade metoden
split()
i_tkinter.TkappType
till förmån för metodensplitlist()
som har ett mer konsekvent och förutsägbart beteende. (Bidrag från Serhiy Storchaka i bpo-38371.)Den uttryckliga överföringen av coroutine-objekt till
asyncio.wait()
har föråldrats och kommer att tas bort i version 3.11. (Bidrag från Yury Selivanov och Kyle Stanley i bpo-34790.)binhex4- och hexbin4-standarderna är nu föråldrade. Modulen
binhex
och följande funktionerbinascii
är nu föråldrade:b2a_hqx()
,a2b_hqx()
rlecode_hqx()
,rledecode_hqx()
(Bidrag från Victor Stinner i bpo-39353.)
ast
klassernalice
,Index
ochExtSlice
anses vara föråldrade och kommer att tas bort i framtida Python-versioner.value
själv bör användas istället förIndex(value)
.Tuple(slices, Load())
bör användas istället förExtSlice(slices)
. (Bidrag från Serhiy Storchaka i bpo-34822.)ast
-klassernaSuite
,Param
,AugLoad
ochAugStore
anses vara föråldrade och kommer att tas bort i framtida Python-versioner. De genererades inte av parsern och accepterades inte av kodgeneratorn i Python 3. (Bidrag från Batuhan Taskaya i bpo-39639 och bpo-39969 och Serhiy Storchaka i bpo-39988.)Funktionerna
PyEval_InitThreads()
ochPyEval_ThreadsInitialized()
är nu föråldrade och kommer att tas bort i Python 3.11. Anrop avPyEval_InitThreads()
gör nu ingenting. GIL initialiseras avPy_Initialize()
sedan Python 3.7. (Bidrag från Victor Stinner i bpo-39877.)Att skicka
None
som det första argumentet tillshlex.split()
-funktionen har blivit föråldrat. (Bidrag från Zackery Spytz i bpo-33262.)smtpd.MailmanProxy()
är nu föråldrad eftersom den är oanvändbar utan en extern modul,mailman
. (Bidrag från Samuel Colvin i bpo-35800.)Modulen
lib2to3
avger nu enPendingDeprecationWarning
. Python 3.9 bytte till en PEG-parser (se PEP 617), och Python 3.10 kan innehålla ny språksyntax som inte kan analyseras av lib2to3:s LL(1)-parser. Modulenlib2to3
kan komma att tas bort från standardbiblioteket i en framtida Python-version. Överväg alternativ från tredje part som LibCST eller parso. (Bidrag från Carl Meyer i bpo-40360.)Parametern random i
random.shuffle()
har utgått. (Bidrag från Raymond Hettinger i bpo-40465)
Borttagen¶
Den felaktiga versionen i
unittest.mock.__version__
har tagits bort.nntplib.NNTP
:xpath()
ochxgtitle()
metoderna har tagits bort. Dessa metoder är föråldrade sedan Python 3.3. I allmänhet stöds inte dessa tillägg eller aktiveras inte av NNTP-serveradministratörer. Förxgtitle()
, användnntplib.NNTP.descriptions()
ellernntplib.NNTP.description()
istället. (Bidrag från Donghee Na i bpo-39366.)array.array
: Metodernatostring()
ochfromstring()
har tagits bort. De var alias tilltobytes()
ochfrombytes()
, föråldrade sedan Python 3.2. (Bidrag från Victor Stinner i bpo-38916.)Den odokumenterade funktionen
sys.callstats()
har tagits bort. Sedan Python 3.7 var den föråldrad och returnerade alltidNone
. Den krävde ett speciellt byggalternativCALL_PROFILE
som redan var borttaget i Python 3.7. (Bidrag från Victor Stinner i bpo-37414.)Funktionerna
sys.getcheckinterval()
ochsys.setcheckinterval()
har tagits bort. De var föråldrade sedan Python 3.2. Användsys.getswitchinterval()
ochsys.setswitchinterval()
istället. (Bidrag från Victor Stinner i bpo-37392.)C-funktionen
PyImport_Cleanup()
har tagits bort. Den var dokumenterad som: ”Tömmer modultabellen. Endast för internt bruk.” (Bidrag från Victor Stinner i bpo-36710.)modulerna
dummy_thread
ochdummy_threading
har tagits bort. Dessa moduler är föråldrade sedan Python 3.7 som kräver stöd för trådning. (Bidrag från Victor Stinner i bpo-37312.)aifc.openfp()
alias tillaifc.open()
,unau.openfp()
alias tillunau.open()
ochwave.openfp()
alias tillwave.open()
har tagits bort. De var föråldrade sedan Python 3.7. (Bidrag från Victor Stinner i bpo-37320.)Metoden
isAlive()
ithreading.Thread
har tagits bort. Den var föråldrad sedan Python 3.8. Användis_alive()
istället. (Bidrag från Donghee Na i bpo-37804.)Metoderna
getchildren()
ochgetiterator()
i klassernaElementTree
ochElement
i modulenElementTree
har tagits bort. De var föråldrade i Python 3.2. Använditer(x)
ellerlist(x)
istället förx.getchildren()
ochx.iter()
ellerlist(x.iter())
istället förx.getiterator()
. (Bidrag från Serhiy Storchaka i bpo-36543.)Det gamla
plistlib
API:et har tagits bort, det var föråldrat sedan Python 3.4. Använd funktionernaload()
,loads()
,dump()
ochdumps()
. Dessutom togs parametern use_builtin_types bort, standardbytes
-objekt används alltid istället. (Bidrag från Jon Janzen i bpo-36409.)C-funktionen
PyGen_NeedsFinalizing
har tagits bort. Den var inte dokumenterad, testad eller använd någonstans inom CPython efter implementeringen av PEP 442. Patch av Joannah Nanjekye. (Bidrag från Joannah Nanjekye i bpo-15088)base64.encodestring()
ochbase64.decodestring()
, alias som är föråldrade sedan Python 3.1, har tagits bort: användbase64.encodebytes()
ochbase64.decodebytes()
istället. (Bidrag från Victor Stinner i bpo-39351.)funktionen
fractions.gcd()
har tagits bort, den är föråldrad sedan Python 3.5 (bpo-22486): användmath.gcd()
istället. (Bidrag från Victor Stinner i bpo-39350.)Parametern buffring i
bz2.BZ2File
har tagits bort. Sedan Python 3.0 ignorerades den och att använda den gav enDeprecationWarning
. Skicka ett open file object för att kontrollera hur filen öppnas. (Bidrag från Victor Stinner i bpo-39357.)Parametern encoding i
json.loads()
har tagits bort. Från och med Python 3.1 var den föråldrad och ignorerades; att använda den har gett upphov till enDeprecationWarning
sedan Python 3.8. (Bidrag från Inada Naoki i bpo-39377)with (await asyncio.lock):
ochwith (yield from asyncio.lock):
uttalanden stöds inte längre, användasync with lock
istället. Detsamma gäller förasyncio.Condition
ochasyncio.Semaphore
. (Bidrag från Andrew Svetlov i bpo-34793.)Funktionen
sys.getcounts()
, kommandoradsalternativet-X showalloccount
och fältetshow_alloc_count
i C-strukturenPyConfig
har tagits bort. De krävde en speciell Python-byggnad genom att definiera makrotCOUNT_ALLOCS
. (Bidrag från Victor Stinner i bpo-39489.)Attributet
_field_types
i klassentyping.NamedTuple
har tagits bort. Det var föråldrat sedan Python 3.8. Använd attributet__annotations__
istället. (Bidrag från Serhiy Storchaka i bpo-40182.)Metoden
symtable.SymbolTable.has_exec()
har tagits bort. Den var föråldrad sedan 2006 och returnerade baraFalse
när den anropades. (Bidrag från Batuhan Taskaya i bpo-40208)asyncio.Task.current_task()
ochasyncio.Task.all_tasks()
har tagits bort. De är föråldrade sedan Python 3.7 och du kan användaasyncio.current_task()
ochasyncio.all_tasks()
istället. (Bidrag från Rémi Lapeyre i bpo-40967)Metoden
unescape()
i klassenhtml.parser.HTMLParser
har tagits bort (den har varit föråldrad sedan Python 3.4).html.unescape()
bör användas för att konvertera teckenreferenser till motsvarande unicode-tecken.
Portning till Python 3.9¶
I det här avsnittet listas tidigare beskrivna ändringar och andra buggfixar som kan kräva ändringar i din kod.
Ändringar i Python API¶
__import__()
ochimportlib.util.resolve_name()
ger nu upphov tillImportError
där det tidigare gav upphov tillValueError
. Anropare som fångar den specifika undantagstypen och stöder både Python 3.9 och tidigare versioner måste fånga båda med hjälp avexcept (ImportError, ValueError):
.Aktiveringsskriptet
venv
är inte längre ett specialfall när__VENV_PROMPT__
är satt till""
.Metoden
select.epoll.unregister()
ignorerar inte längre feletEBADF
. (Bidrag från Victor Stinner i bpo-39239.)Parametern compresslevel i
bz2.BZ2File
blev endast nyckelord, eftersom parametern buffering har tagits bort. (Bidrag från Victor Stinner i bpo-39357.)Förenklad AST för prenumeration. Enkla index kommer att representeras av deras värde, utökade slices kommer att representeras som tuples.
Index(värde)
kommer att returnera ettvärde
själv,ExtSlice(slices)
kommer att returneraTuple(slices, Load())
. (Bidrag från Serhiy Storchaka i bpo-34822.)Modulen
importlib
ignorerar nu miljövariabelnPYTHONCASEOK
när kommandoradsalternativen-E
eller-I
används.Parametern encoding har lagts till i klasserna
ftplib.FTP
ochftplib.FTP_TLS
som en parameter med endast nyckelord, och standardkodningen har ändrats från Latin-1 till UTF-8 för att följa RFC 2640.asyncio.loop.shutdown_default_executor()
har lagts till iAbstractEventLoop
, vilket innebär att alternativa händelseslingor som ärver från den bör ha denna metod definierad. (Bidrag från Kyle Stanley i bpo-34037.)De konstanta värdena för framtidsflaggor i modulen
__future__
har uppdaterats för att förhindra kollision med kompilatorflaggor. Tidigare krockadePyCF_ALLOW_TOP_LEVEL_AWAIT
medCO_FUTURE_DIVISION
. (Bidrag från Batuhan Taskaya i bpo-39562)array('u')
använder nuwchar_t
som C-typ istället förPy_UNICODE
. Denna ändring påverkar inte dess beteende eftersomPy_UNICODE
är alias förwchar_t
sedan Python 3.3. (Bidrag från Inada Naoki i bpo-34538.)API:et
logging.getLogger()
returnerar nu rotloggaren när namnet'root'
anges, medan det tidigare returnerade en icke-rotloggare med namnet'root'
. Detta kan påverka fall där användarkod uttryckligen vill ha en icke-rotlogger med namnet'root
, eller instansierar en logger med hjälp avlogging.getLogger(__name__)
i någon toppnivåmodul som heter'root.py'
. (Bidrag från Vinay Sajip i bpo-37742.)Divisionshanteringen av
PurePath
returnerar nuNotImplemented
istället för att ge upphov tillTypeError
när något annat än en instans avstr
ellerPurePath
skickas. Detta gör det möjligt att skapa kompatibla klasser som inte ärver från de nämnda typerna. (Bidrag från Roger Aiudi i bpo-34775).Från och med Python 3.9.5 accepterar modulen
ipaddress
inte längre några ledande nollor i IPv4-adresssträngar. Ledande nollor är tvetydiga och tolkas som oktal notation av vissa bibliotek. Till exempel behandlar den äldre funktionensocket.inet_aton()
ledande nollor som oktalnotation. glibc-implementeringen av den modernainet_pton()
accepterar inte några ledande nollor. (Bidrag från Christian Heimes i bpo-36384).codecs.lookup()
normaliserar nu kodningsnamnet på samma sätt somencodings.normalize_encoding()
, förutom attcodecs.lookup()
även konverterar namnet till gemener. Till exempel,"latex+latin1"
kodningsnamn är nu normaliserat till"latex_latin1"
. (Bidrag från Jordon Xu i bpo-37751.)
Förändringar i C API¶
Instanser av heap-allocated types (såsom de som skapats med
PyType_FromSpec()
och liknande API:er) innehåller en referens till sitt typobjekt sedan Python 3.8. Som anges i ”Ändringar i C API” i Python 3.8 bör det i de allra flesta fall inte finnas några bieffekter, men för typer som har en anpassadtp_traverse
-funktion måste du se till att alla anpassadetp_traverse
-funktioner för heap-allokerade typer besöker objektets typ.Exempel:
int foo_traverse(PyObject *self, visitproc visit, void *arg) { // Rest of the traverse function #if PY_VERSION_HEX >= 0x03090000 // This was not needed before Python 3.9 (Python issue 35810 and 40217) Py_VISIT(Py_TYPE(self)); #endif }
Om din traverseringsfunktion delegerar till
tp_traverse
i sin basklass (eller en annan typ), se till attPy_TYPE(self)
endast besöks en gång. Observera att endast heap type förväntas besöka typen itp_traverse
.Till exempel, om din
tp_traverse
-funktion innehåller:base->tp_traverse(self, besök, arg)
lägg sedan till:
#if PY_VERSION_HEX >= 0x03090000 // This was not needed before Python 3.9 (bpo-35810 and bpo-40217) if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) { // a heap type's tp_traverse already visited Py_TYPE(self) } else { Py_VISIT(Py_TYPE(self)); } #else
Funktionerna
PyEval_CallObject
,PyEval_CallFunction
,PyEval_CallMethod
ochPyEval_CallObjectWithKeywords
är föråldrade. AnvändPyObject_Call()
och dess varianter istället. (Se mer detaljer i bpo-29548.)
CPython bytecode-ändringar¶
Opkoden
LOAD_ASSERTION_ERROR
lades till för hantering avassert
-satsen. Tidigare skulle assert-satsen inte fungera korrekt omAssertionError
undantaget skuggades. (Bidrag från Zackery Spytz i bpo-34880.)Opkoden
COMPARE_OP
delades upp i fyra olika instruktioner:COMPARE_OP
för omfattande jämförelserIS_OP
för ”är”- och ”är inte”-testerCONTAINS_OP
för ”in”- och ”not in”-testerJUMP_IF_NOT_EXC_MATCH
för kontroll av undantag i ’try-except’-satser.
(Bidrag från Mark Shannon i bpo-39156.)
Förändringar i byggning¶
Lagt till alternativet
--with-platlibdir
tillconfigure
-skriptet: namnet på den plattformsspecifika bibliotekskatalogen, lagrad i det nya attributetsys.platlibdir
. Se attributetsys.platlibdir
för mer information. (Bidrag från Jan Matějek, Matěj Cepl, Charalampos Stratakis och Victor Stinner i bpo-1294959.)Det speciella byggmakrot
COUNT_ALLOCS
har tagits bort. (Bidrag från Victor Stinner i bpo-39489.)På icke-Windows-plattformar krävs nu funktionerna
setenv()
ochunsetenv()
för att bygga Python. (Bidrag från Victor Stinner i bpo-39395.)På icke-Windows-plattformar stöds nu inte skapandet av
bdist_wininst
-installationsprogram officiellt. (Se bpo-10945 för mer information.)När Python byggs på macOS från källkod, länkar
_tkinter
nu med Tcl- och Tk-ramverk som inte finns i systemet om de är installerade i/Library/Frameworks
, vilket har varit fallet på äldre versioner av macOS. Om ett macOS SDK är explicit konfigurerat, genom att använda--enable-universalsdk
eller-isysroot
, söks endast SDK:n själv. Standardbeteendet kan fortfarande åsidosättas med--with-tcltk-includes
och--with-tcltk-libs
. (Bidrag från Ned Deily i bpo-34956.)Python kan nu byggas för Windows 10 ARM64. (Bidrag från Steve Dower i bpo-33125.)
Vissa enskilda tester hoppas nu över när
--pgo
används. Testerna i fråga ökade PGO-uppgiftens tid avsevärt och bidrog sannolikt inte till att förbättra optimeringen av den slutliga körbara filen. Detta påskyndar uppgiften med en faktor på cirka 15x. Att köra hela enhetstestsviten är långsamt. Den här ändringen kan resultera i en något mindre optimerad version eftersom inte lika många kodgrenar kommer att köras. Om du är villig att vänta på den mycket långsammare byggningen kan det gamla beteendet återställas med hjälp av./configure [..] PROFILE_TASK="-m test --pgo-extended"
. Vi ger inga garantier för vilken PGO-uppgiftsuppsättning som ger en snabbare konstruktion. Användare som bryr sig bör köra sina egna relevanta riktmärken eftersom resultaten kan bero på miljö, arbetsbelastning och kompilatorverktygskedja. (Se bpo-36044 och bpo-37707 för mer information)
Ändringar i C API¶
Nya funktioner¶
PEP 573: Lagt till
PyType_FromModuleAndSpec()
för att associera en modul med en klass;PyType_GetModule()
ochPyType_GetModuleState()
för att hämta modulen och dess tillstånd; ochPyCMethod
ochMETH_METHOD
för att tillåta en metod att komma åt klassen den definierades i. (Bidrag från Marcel Plch och Petr Viktorin i bpo-38787.)Lagt till
PyFrame_GetCode()
funktion: hämtar en ramkod. Lagt tillPyFrame_GetBack()
funktion: hämta nästa yttre ram. (Bidrag från Victor Stinner i bpo-40421.)Lagt till
PyFrame_GetLineNumber()
till det begränsade C API:et. (Bidrag från Victor Stinner i bpo-40421.)Lagt till
PyThreadState_GetInterpreter()
ochPyInterpreterState_Get()
funktioner för att hämta tolken. Lagt tillPyThreadState_GetFrame()
för att hämta den aktuella ramen i ett Python-trådtillstånd. Lagt tillPyThreadState_GetID()
funktion: hämta den unika identifieraren för ett Python-trådtillstånd. (Bidrag från Victor Stinner i bpo-39947.)Lade till en ny publik
PyObject_CallNoArgs()
-funktion till C API, som anropar ett anropbart Python-objekt utan några argument. Det är det mest effektiva sättet att anropa ett anropbart Python-objekt utan några argument. (Bidrag från Victor Stinner i bpo-37194.)Ändringar i det begränsade C API:et (om makrot
Py_LIMITED_API
är definierat):Tillhandahåll
Py_EnterRecursiveCall()
ochPy_LeaveRecursiveCall()
som vanliga funktioner för det begränsade API:et. Tidigare definierades de som makron, men dessa makron kompilerade inte med det begränsade C API:et som inte kan komma åt fältetPyThreadState.recursion_depth
(strukturen är ogenomskinlig i det begränsade C API:et).PyObject_INIT()
ochPyObject_INIT_VAR()
blir vanliga ”opaka” funktioner för att dölja implementeringsdetaljer.
Funktionen
PyModule_AddType()
har lagts till för att hjälpa till att lägga till en typ till en modul. (Bidrag från Donghee Na i bpo-40024.)Lade till funktionerna
PyObject_GC_IsTracked()
ochPyObject_GC_IsFinalized()
till det publika API:et för att göra det möjligt att fråga om Python-objekt för närvarande spåras eller redan har slutförts av skräpsamlaren. (Bidrag från Pablo Galindo Salgado i bpo-40241.)Lagt till
_PyObject_FunctionStr()
för att få en användarvänlig strängrepresentation av ett funktionsliknande objekt. (Patch av Jeroen Demeyer i bpo-37645.)Lagt till
PyObject_CallOneArg()
för att anropa ett objekt med ett positionellt argument (Patch by Jeroen Demeyer in bpo-37483.)
Portning till Python 3.9¶
PyInterpreterState.eval_frame
(PEP 523) kräver nu en ny obligatorisk tstate-parameter (PyThreadState*
). (Bidrag från Victor Stinner i bpo-38500.)Tilläggsmoduler: funktionerna
m_traverse
,m_clear
ochm_free
iPyModuleDef
anropas inte längre om modultillståndet begärdes men ännu inte har allokerats. Detta är fallet omedelbart efter att modulen har skapats och innan modulen körs (Py_mod_exec
function). Mer exakt anropas inte dessa funktioner omm_size
är större än 0 och modultillståndet (som returneras avPyModule_GetState()
) ärNULL
.Tilläggsmoduler utan modulstatus (
m_size <= 0
) påverkas inte.Om
Py_AddPendingCall()
anropas i en undertolk, schemaläggs nu funktionen för att anropas från undertolken, i stället för att anropas från huvudtolken. Varje undertolk har nu sin egen lista över schemalagda anrop. (Bidrag från Victor Stinner i bpo-39984.)Windows-registret används inte längre för att initiera
sys.path
när alternativet-E
används (omPyConfig.use_environment
är satt till0
). Detta är viktigt vid inbäddning av Python på Windows. (Bidrag från Zackery Spytz i bpo-8901.)Den globala variabeln
PyStructSequence_UnnamedField
är nu en konstant och refererar till en konstant sträng. (Bidrag från Serhiy Storchaka i bpo-38650.)Strukturen
PyGC_Head
är nu opak. Den definieras endast i det interna C API:et (pycore_gc.h
). (Bidrag från Victor Stinner i bpo-40241.)Py_UNICODE_COPY
,Py_UNICODE_FILL
,PyUnicode_WSTR_LENGTH
,PyUnicode_FromUnicode()
,PyUnicode_AsUnicode()
,_PyUnicode_AsUnicode
ochPyUnicode_AsUnicodeAndSize()
är markerade som föråldrade i C. De har varit föråldrade av PEP 393 sedan Python 3.3. (Bidrag från Inada Naoki i bpo-36346.)Funktionen
Py_FatalError()
är ersatt med ett makro som automatiskt loggar namnet på den aktuella funktionen, såvida inte makrotPy_LIMITED_API
är definierat. (Bidrag från Victor Stinner i bpo-39882.)Protokollet vectorcall kräver nu att anroparen endast skickar strängar som nyckelordsnamn. (Se bpo-37540 för mer information.)
Implementeringsdetaljer för ett antal makron och funktioner är nu dolda:
PyObject_IS_GC()
makro konverterades till en funktion.Makrot
PyObject_NEW()
blir ett alias till makrotPyObject_New
, och makrotPyObject_NEW_VAR()
blir ett alias till makrotPyObject_NewVar
. De har inte längre direkt åtkomst tillPyTypeObject.tp_basicsize
-medlemmen.makrot
PyObject_GET_WEAKREFS_LISTPTR()
konverterades till en funktion: makrot använde direkt medlemmenPyTypeObject.tp_weaklistoffset
.makrot
PyObject_CheckBuffer()
konverterades till en funktion: Makrot använde direkt medlemmenPyTypeObject.tp_as_buffer
.PyIndex_Check()
deklareras nu alltid som en opak funktion för att dölja implementationsdetaljer: tog bort makrotPyIndex_Check()
. Makrot hade direkt åtkomst till medlemmenPyTypeObject.tp_as_number
.
(Se bpo-40170 för mer information.)
Borttagen¶
Uteslöt
PyFPE_START_PROTECT()
ochPyFPE_END_PROTECT()
makron ipyfpe.h
från det begränsade C API:et. (Bidrag från Victor Stinner i bpo-38835.)tp_print
slot i PyTypeObject har tagits bort. Den användes för att skriva ut objekt till filer i Python 2.7 och tidigare. Sedan Python 3.0 har den ignorerats och är oanvänd. (Bidrag från Jeroen Demeyer i bpo-36974.)Ändringar i det begränsade C API:et (om makrot
Py_LIMITED_API
är definierat):Följande funktioner har uteslutits från det begränsade C API:et:
PyThreadState_DeleteCurrent()
(Bidrag från Joannah Nanjekye i bpo-37878.)_Py_CheckRecursionLimit
_Py_NewReference()
_Py_ForgetReference()
_PyTraceMalloc_NewReference()
_Py_GetRefTotal()
Papperskorgsmekanismen som aldrig fungerade i det begränsade C API:et.
PyTrash_UNWIND_LEVEL
Py_TRASHCAN_BEGIN_CONDITION
Py_TRASHCAN_BEGIN
Py_TRASHCAN_END
Py_TRASHCAN_SAFE_BEGIN
Py_TRASHCAN_SAFE_END
Följande funktioner och definitioner har flyttats till det interna C API:et:
_PyDebug_PrintTotalRefs()
_Py_PrintReferences()
_Py_PrintReferenceAddresses()
_Py_tracemalloc_config
_Py_AddToAllObjects()
(specifik förPy_TRACE_REFS
-byggnation)
Borttagen
_PyRuntime.getframe
hook och borttaget_PyThreadState_GetFrame
makro som var ett alias till_PyRuntime.getframe
. De var endast exponerade av det interna C API. Tog även bort typenPyThreadFrameGetter
. (Bidrag från Victor Stinner i bpo-39946.)Följande funktioner har tagits bort från C API. Anropa
PyGC_Collect()
explicit för att rensa alla fria listor. (Bidrag från Inada Naoki och Victor Stinner i bpo-37340, bpo-38896 och bpo-40428.)PyAsyncGen_ClearFreeLists()
PyContext_ClearFreeList()
PyDict_ClearFreeList()
PyFloat_ClearFreeList()
PyFrame_ClearFreeList()
PyList_ClearFreeList()
PyMethod_ClearFreeList()
ochPyCFunction_ClearFreeList()
: de fria listorna för bundna metodobjekt har tagits bort.PySet_ClearFreeList()
: listan över fria set har tagits bort i Python 3.4.PyTuple_ClearFreeList()
PyUnicode_ClearFreeList()
: Unicodes fria lista har tagits bort i Python 3.3.
Tog bort funktionen
_PyUnicode_ClearStaticStrings()
. (Bidrag från Victor Stinner i bpo-39465.)Tog bort
Py_UNICODE_MATCH
. Den har föråldrats av PEP 393 och är trasig sedan Python 3.3. FunktionenPyUnicode_Tailmatch()
kan användas istället. (Bidrag från Inada Naoki i bpo-36346.)Rensade header-filer från gränssnitt som definierats men som inte har någon implementation. De offentliga API-symbolerna som tas bort är:
_PyBytes_InsertThousandsGroupingLocale
,_PyBytes_InsertThousandsGrouping
,_Py_InitializeFromArgs
,_Py_InitializeFromWideArgs
,_PyFloat_Repr
,_PyFloat_Digits
,_PyFloat_DigitsInit
,PyFrame_ExtendStack
,_PyAIterWrapper_Type
,PyNullImporter_Type
,PyCmpWrapper_Type
,PySortWrapper_Type
,PyNoArgsFunction
. (Bidrag från Pablo Galindo Salgado i bpo-39372.)
Viktiga ändringar i Python 3.9.1¶
typing¶
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. Observera att deklaration avLiteral
med mutabla parametrar 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.)
macOS 11.0 (Big Sur) och stöd för Apple Silicon Mac¶
Från och med version 3.9.1 har Python fullt stöd för kompilering och körning på macOS 11.0 (Big Sur) och på Apple Silicon Mac-datorer (baserade på ARM64
-arkitekturen). En ny universell kompileringsvariant, universal2
, finns nu tillgänglig för att nativt stödja både ARM64
och Intel 64
i en uppsättning körbara filer. Binärfiler kan nu också byggas på aktuella versioner av macOS för att distribueras på en rad äldre macOS-versioner (testat till 10.9) samtidigt som vissa nyare OS-funktioner och alternativ görs villkorligt tillgängliga baserat på den operativsystemversion som används vid körning (”weaklinking”).
(Bidrag från Ronald Oussoren och Lawrence D’Anna i bpo-41100.)
Viktiga ändringar i Python 3.9.2¶
samlingar.abc¶
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)
. 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
. Kod som kommer åt argumenten via typing.get_args()
eller __args__
måste ta hänsyn till denna ändring. En DeprecationWarning
kan komma att skickas ut för ogiltiga former av parametrisering av collections.abc.Callable
som kan ha passerat tyst i Python 3.9.1. Denna DeprecationWarning
kommer att bli en TypeError
i Python 3.10. (Bidrag från Ken Jin i bpo-42195.)
urllib.parse¶
Tidigare Python-versioner 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.)
Viktiga ändringar i Python 3.9.3¶
En säkerhetsfix ändrar ftplib.FTP
-beteendet så att det inte litar på den IPv4-adress som skickas från fjärrservern när en passiv datakanal sätts upp. Vi återanvänder istället ftp-serverns IP-adress. För ovanlig kod som kräver det gamla beteendet, ställ in attributet trust_server_pasv_ipv4_address
på din FTP-instans till True
. (Se gh-87451)
Viktiga ändringar i Python 3.9.5¶
urllib.parse¶
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)
Anmärkningsvärd säkerhetsfunktion i 3.9.14¶
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.
Viktiga ändringar i 3.9.17¶
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.)