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 till ImportError istället för ValueError, 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 med os.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() och bytes.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 nu s istället för en tom sträng för alla n som inte är noll. Det är nu konsekvent med "".replace("", s). Det finns liknande ändringar för objekten bytes och bytearray. (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 (som Union och List). Om du använder help() med ett generiskt alias som List[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 och ag_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 av TypeError i operatorn in och funktionerna contains(), indexOf() och countOf() i modulen operator. (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 tilldelning y = 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 av closefrom(). (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änd bdist_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 (som 5.0). Den ger upphov till ett ValueError 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 ett TypeError för alla flyttal. (Bidrag från Serhiy Storchaka i bpo-37315.)

  • Modulerna parser och symbol ä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 modulen ast.

  • De offentliga C API-funktionerna PyParser_SimpleParseStringFlags(), PyParser_SimpleParseStringFlagsFilename(), PyParser_SimpleParseFileFlags() och PyNode_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 ett TypeError 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 till None, int, float, str, bytes och bytearray.

  • 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 metoden splitlist() 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 funktioner binascii är nu föråldrade:

    • b2a_hqx(), a2b_hqx()

    • rlecode_hqx(), rledecode_hqx()

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

  • ast klasserna lice, Index och ExtSlice anses vara föråldrade och kommer att tas bort i framtida Python-versioner. value själv bör användas istället för Index(value). Tuple(slices, Load()) bör användas istället för ExtSlice(slices). (Bidrag från Serhiy Storchaka i bpo-34822.)

  • ast-klasserna Suite, Param, AugLoad och AugStore 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() och PyEval_ThreadsInitialized() är nu föråldrade och kommer att tas bort i Python 3.11. Anrop av PyEval_InitThreads() gör nu ingenting. GIL initialiseras av Py_Initialize() sedan Python 3.7. (Bidrag från Victor Stinner i bpo-39877.)

  • Att skicka None som det första argumentet till shlex.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 en PendingDeprecationWarning. 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. Modulen lib2to3 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() och xgtitle() 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ör xgtitle(), använd nntplib.NNTP.descriptions() eller nntplib.NNTP.description() istället. (Bidrag från Donghee Na i bpo-39366.)

  • array.array: Metoderna tostring() och fromstring() har tagits bort. De var alias till tobytes() och frombytes(), 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 alltid None. Den krävde ett speciellt byggalternativ CALL_PROFILE som redan var borttaget i Python 3.7. (Bidrag från Victor Stinner i bpo-37414.)

  • Funktionerna sys.getcheckinterval() och sys.setcheckinterval() har tagits bort. De var föråldrade sedan Python 3.2. Använd sys.getswitchinterval() och sys.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 och dummy_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 till aifc.open(), unau.openfp() alias till unau.open() och wave.openfp() alias till wave.open() har tagits bort. De var föråldrade sedan Python 3.7. (Bidrag från Victor Stinner i bpo-37320.)

  • Metoden isAlive() i threading.Thread har tagits bort. Den var föråldrad sedan Python 3.8. Använd is_alive() istället. (Bidrag från Donghee Na i bpo-37804.)

  • Metoderna getchildren() och getiterator() i klasserna ElementTree och Element i modulen ElementTree har tagits bort. De var föråldrade i Python 3.2. Använd iter(x) eller list(x) istället för x.getchildren() och x.iter() eller list(x.iter()) istället för x.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 funktionerna load(), loads(), dump() och dumps(). Dessutom togs parametern use_builtin_types bort, standard bytes-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() och base64.decodestring(), alias som är föråldrade sedan Python 3.1, har tagits bort: använd base64.encodebytes() och base64.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änd math.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 en DeprecationWarning. 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 en DeprecationWarning sedan Python 3.8. (Bidrag från Inada Naoki i bpo-39377)

  • with (await asyncio.lock): och with (yield from asyncio.lock): uttalanden stöds inte längre, använd async with lock istället. Detsamma gäller för asyncio.Condition och asyncio.Semaphore. (Bidrag från Andrew Svetlov i bpo-34793.)

  • Funktionen sys.getcounts(), kommandoradsalternativet -X showalloccount och fältet show_alloc_count i C-strukturen PyConfig har tagits bort. De krävde en speciell Python-byggnad genom att definiera makrot COUNT_ALLOCS. (Bidrag från Victor Stinner i bpo-39489.)

  • Attributet _field_types i klassen typing.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 bara False när den anropades. (Bidrag från Batuhan Taskaya i bpo-40208)

  • asyncio.Task.current_task() och asyncio.Task.all_tasks() har tagits bort. De är föråldrade sedan Python 3.7 och du kan använda asyncio.current_task() och asyncio.all_tasks() istället. (Bidrag från Rémi Lapeyre i bpo-40967)

  • Metoden unescape() i klassen html.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__() och importlib.util.resolve_name() ger nu upphov till ImportError där det tidigare gav upphov till ValueError. 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 av except (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 felet EBADF. (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 ett värde själv, ExtSlice(slices) kommer att returnera Tuple(slices, Load()). (Bidrag från Serhiy Storchaka i bpo-34822.)

  • Modulen importlib ignorerar nu miljövariabeln PYTHONCASEOK när kommandoradsalternativen -E eller -I används.

  • Parametern encoding har lagts till i klasserna ftplib.FTP och ftplib.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 i AbstractEventLoop, 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 krockade PyCF_ALLOW_TOP_LEVEL_AWAIT med CO_FUTURE_DIVISION. (Bidrag från Batuhan Taskaya i bpo-39562)

  • array('u') använder nu wchar_t som C-typ istället för Py_UNICODE. Denna ändring påverkar inte dess beteende eftersom Py_UNICODE är alias för wchar_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 av logging.getLogger(__name__) i någon toppnivåmodul som heter 'root.py'. (Bidrag från Vinay Sajip i bpo-37742.)

  • Divisionshanteringen av PurePath returnerar nu NotImplemented istället för att ge upphov till TypeError när något annat än en instans av str eller PurePath 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 funktionen socket.inet_aton() ledande nollor som oktalnotation. glibc-implementeringen av den moderna inet_pton() accepterar inte några ledande nollor. (Bidrag från Christian Heimes i bpo-36384).

  • codecs.lookup() normaliserar nu kodningsnamnet på samma sätt som encodings.normalize_encoding(), förutom att codecs.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 anpassad tp_traverse-funktion måste du se till att alla anpassade tp_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 att Py_TYPE(self) endast besöks en gång. Observera att endast heap type förväntas besöka typen i tp_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
    

    (Se bpo-35810 och bpo-40217 för mer information)

  • Funktionerna PyEval_CallObject, PyEval_CallFunction, PyEval_CallMethod och PyEval_CallObjectWithKeywords är föråldrade. Använd PyObject_Call() och dess varianter istället. (Se mer detaljer i bpo-29548.)

CPython bytecode-ändringar

  • Opkoden LOAD_ASSERTION_ERROR lades till för hantering av assert-satsen. Tidigare skulle assert-satsen inte fungera korrekt om AssertionError 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örelser

    • IS_OP för ”är”- och ”är inte”-tester

    • CONTAINS_OP för ”in”- och ”not in”-tester

    • JUMP_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 till configure-skriptet: namnet på den plattformsspecifika bibliotekskatalogen, lagrad i det nya attributet sys.platlibdir. Se attributet sys.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() och unsetenv() 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() och PyType_GetModuleState() för att hämta modulen och dess tillstånd; och PyCMethod och METH_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 till PyFrame_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() och PyInterpreterState_Get() funktioner för att hämta tolken. Lagt till PyThreadState_GetFrame() för att hämta den aktuella ramen i ett Python-trådtillstånd. Lagt till PyThreadState_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() och Py_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ältet PyThreadState.recursion_depth (strukturen är ogenomskinlig i det begränsade C API:et).

    • PyObject_INIT() och PyObject_INIT_VAR() blir vanliga ”opaka” funktioner för att dölja implementeringsdetaljer.

    (Bidrag från Victor Stinner i bpo-38644 och bpo-39542.)

  • 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() och PyObject_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 och m_free i PyModuleDef 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 om m_size är större än 0 och modultillståndet (som returneras av PyModule_GetState()) är NULL.

    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 (om PyConfig.use_environment är satt till 0). 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 och PyUnicode_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 makrot Py_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:

    (Se bpo-40170 för mer information.)

Borttagen

  • Uteslöt PyFPE_START_PROTECT() och PyFPE_END_PROTECT() makron i pyfpe.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ör Py_TRACE_REFS-byggnation)

    (Bidrag från Victor Stinner i bpo-38644 och bpo-39542.)

  • 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 typen PyThreadFrameGetter. (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() och PyCFunction_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. Funktionen PyUnicode_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.

  1. Literal avduplicerar nu parametrar.

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

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

  4. Literal objekt kommer nu att ge upphov till ett TypeError undantag under jämlikhetsjämförelser om någon av deras parametrar inte är hashable. Observera att deklaration av Literal 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 och shutil.unpack_archive() har ett nytt filter-argument som gör det möjligt att begränsa tarfunktioner som kan vara överraskande eller farliga, t.ex. att skapa filer utanför destinationskatalogen. Se Filter för utsugning för detaljer. I Python 3.12 kommer användning utan filter-argumentet att visa en DeprecationWarning. I Python 3.14 kommer standardinställningen att ändras till 'data'. (Bidrag från Petr Viktorin i PEP 706.)