Vad är nytt i Python 3.11

Redigerare:

Pablo Galindo Salgado

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

Sammanfattning – Release highlights

  • Python 3.11 är mellan 10-60% fsnabbare än Python 3.10. I genomsnitt uppmätte vi en 1,25x snabbare hastighet på standard benchmark svit. Se Snabbare CPython för detaljer.

Nya syntaxfunktioner:

Nya inbyggda funktioner:

Nya standardmoduler för bibliotek:

Förbättringar av tolkar:

Nya funktioner för skrivning:

Viktiga avskrivningar, borttagningar och begränsningar:

Nya funktioner

PEP 657: Finkorniga felplaceringar i spårningar

Vid utskrift av spårningar kommer tolken nu att peka på det exakta uttryck som orsakade felet, istället för bara raden. Till exempel

Traceback (senaste anropet senast):
  Fil "distance.py", rad 11, i <module>
    print(manhattan_distance(p1, p2))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  Fil "distance.py", rad 6, i manhattan_distance
    return abs(punkt_1.x - punkt_2.x) + abs(punkt_1.y - punkt_2.y)
                           ^^^^^^^^^
AttributeError: Objektet 'NoneType' har inget attribut 'x'

Tidigare versioner av tolken pekade bara på raden, vilket gjorde det tvetydigt vilket objekt som var None. Dessa förbättrade fel kan också vara till hjälp när man har att göra med djupt nästlade dict-objekt och flera funktionsanrop:

Traceback (senaste anropet senast):
  Fil "query.py", rad 37, i <module>
    magic_aritmetic('foo')
  Fil "query.py", rad 18, i magic_arithmetic
    returnera add_counts(x) / 25
           ^^^^^^^^^^^^^
  Fil "query.py", rad 24, i add_counts
    return 25 + query_user(user1) + query_user(user2)
                ^^^^^^^^^^^^^^^^^
  Fil "query.py", rad 32, i query_user
    return 1 + query_count(db, svar['a']['b']['c']['user'], retry=True)
                               ~~~~~~~~~~~~~~~~~~^^^^^
TypeError: Objektet 'NoneType' är inte subskriberbart

Samt komplexa aritmetiska uttryck:

Traceback (senaste anropet senast):
  Fil "calculation.py", rad 54, i <module>
    resultat = (x / y / z) * (a / b / c)
              ~~~~~~^~~
ZeroDivisionError: division med noll

Dessutom görs den information som används av den förbättrade spårningsfunktionen tillgänglig via ett allmänt API, som kan användas för att korrelera bytecode instructions med källkodens plats. Denna information kan hämtas med hjälp av:

Se PEP 657 för mer information. (Bidrag från Pablo Galindo, Batuhan Taskaya och Ammar Askar i bpo-43950.)

Anteckning

Denna funktion kräver lagring av kolumnpositioner i Kodobjekt, vilket kan resultera i en liten ökning av minnesanvändningen i tolken och diskanvändningen för kompilerade Python-filer. För att undvika att lagra den extra informationen och avaktivera utskrift av extra spårningsinformation, använd kommandoradsalternativet -X no_debug_ranges eller miljövariabeln PYTHONNODEBUGRANGES.

PEP 654: Undantagsgrupper och except*

PEP 654 introducerar språkfunktioner som gör det möjligt för ett program att skapa och hantera flera orelaterade undantag samtidigt. De inbyggda typerna ExceptionGroup och BaseExceptionGroup gör det möjligt att gruppera undantag och aktivera dem tillsammans, och den nya syntaxen except* generaliserar except så att den passar undergrupper av undantagsgrupper.

Se PEP 654 för mer information.

(Bidrag från Irit Katriel i bpo-45292. PEP skriven av Irit Katriel, Yury Selivanov och Guido van Rossum.)

PEP 678: Undantag kan kompletteras med anteckningar

Metoden add_note() har lagts till i BaseException. Den kan användas för att berika undantag med kontextinformation som inte är tillgänglig vid den tidpunkt då undantaget uppstår. De tillagda anteckningarna visas i standardspårningen.

Se PEP 678 för mer information.

(Bidrag från Irit Katriel i bpo-45607. PEP skriven av Zac Hatfield-Dodds.)

Förbättringar av startprogrammet py.exe i Windows

Den kopia av Pythons installationshanterare som ingår i Python 3.11 har uppdaterats avsevärt. Den stöder nu företags-/taggsyntax enligt definitionen i PEP 514 och använder argumentet -V:<company>/<tag> istället för det begränsade -<major>.<minor>. Detta gör det möjligt att starta andra distributioner än PythonCore, den som finns på python.org.

När du använder -V:-väljare kan antingen företag eller tagg utelämnas, men alla installationer kommer att sökas. Till exempel kommer -V:OtherPython/ att välja den ”bästa” taggen som är registrerad för OtherPython, medan -V:3.11 eller -V:/3.11 kommer att välja den ”bästa” distributionen med taggen 3.11.

När du använder de äldre argumenten -<major>, -<major>.<minor>, -<major>-<bitness> eller -<major>.<minor>-<bitness>, bör allt befintligt beteende bevaras från tidigare versioner, och endast utgåvor från PythonCore kommer att väljas. Suffixet -64 innebär dock nu ”inte 32-bitars” (inte nödvändigtvis x86-64), eftersom det finns flera 64-bitars plattformar som stöds. 32-bitars körtider upptäcks genom att kontrollera om körtidens tagg innehåller suffixet -32. Alla utgåvor av Python sedan 3.5 har inkluderat detta i sina 32-bitarsbyggen.

Andra språkliga förändringar

  • Lade till ett kommandoradsalternativ -P och en miljövariabel PYTHONSAFEPATH, som inaktiverar det automatiska tillägget till sys.path av skriptets katalog när ett skript körs, eller den aktuella katalogen när -c och -m används. Detta säkerställer att endast stdlib och installerade moduler hämtas av import och undviker oavsiktlig eller illvillig skuggning av moduler med dem i en lokal (och vanligtvis användbar) katalog. (Bidrag från Victor Stinner i gh-57684.)

  • Ett "z"-alternativ lades till i Formatspecifikation Mini-språk som omvandlar negativa till positiva nollor efter avrundning till formatets precision. Se PEP 682 för mer information. (Bidrag från John Belmonte i gh-90153.)

  • Bytes accepteras inte längre på sys.path. Stödet upphörde någon gång mellan Python 3.2 och 3.6, utan att någon märkte det förrän efter att Python 3.10.0 släpptes. Dessutom skulle det vara problematiskt att återinföra stöd på grund av interaktioner mellan -b och sys.path_importer_cache när det finns en blandning av str och bytes nycklar. (Bidrag från Thomas Grainger i gh-91181.)

Andra ändringar i implementeringen av CPython

  • Specialmetoderna __complex__() för complex och __bytes__() för bytes är implementerade för att stödja protokollen typing.SupportsComplex och typing.SupportsBytes. (Bidrag från Mark Dickinson och Donghee Na i bpo-24234.)

  • siphash13 har lagts till som en ny intern hashingalgoritm. Den har liknande säkerhetsegenskaper som siphash24, men den är något snabbare för långa inmatningar. str, bytes, och några andra typer använder den nu som standardalgoritm för hash(). PEP 552 hash-baserade .pyc-filer använder nu siphash13 också. (Bidrag från Inada Naoki i bpo-29410.)

  • När ett aktivt undantag återaktiveras med en raise-sats utan parametrar, är nu spårningen som är kopplad till detta undantag alltid sys.exc_info()[1].__traceback__. Detta innebär att ändringar som görs i spårningen i den aktuella except-satsen återspeglas i det återaktiverade undantaget. (Bidrag från Irit Katriel i bpo-45711.)

  • Tolkstatens representation av hanterade undantag (aka exc_info eller _PyErr_StackItem) har nu bara fältet exc_value; exc_type och exc_traceback har tagits bort, eftersom de kan härledas från exc_value. (Bidrag från Irit Katriel i bpo-45711.)

  • Ett nytt kommandoradsalternativ, AppendPath, har lagts till för Windows-installationsprogrammet. Det fungerar på samma sätt som PrependPath, men lägger till install- och skriptkatalogerna istället för att lägga till dem först. (Bidrag från Bastian Neuburger i bpo-44934.)

  • Fältet PyConfig.module_search_paths_set måste nu vara inställt på 1 för att initieringen ska använda PyConfig.module_search_paths för att initiera sys.path. Annars kommer initieringen att räkna om sökvägen och ersätta alla värden som lagts till i module_search_paths.

  • Utdata från alternativet --help ryms nu på 50 rader/80 kolumner. Information om Python-miljövariabler och -X-alternativ finns nu tillgänglig med respektive --help-env och --help-xoptions-flaggor, och med det nya --help-all. (Bidrag från Éric Araujo i bpo-46142.)

  • 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.

Nya moduler

Förbättrade moduler

asyncio

contextlib

  • Lagt till icke parallell-säker chdir() kontexthanterare för att ändra den aktuella arbetskatalogen och sedan återställa den vid avslutning. Enkelt omslag runt chdir(). (Bidrag från Filipe Laíns i bpo-25625)

dataklasser

  • Ändra kontrollen av fältets föränderlighet så att endast standardvärden som är hashable tillåts istället för alla objekt som inte är en instans av dict, list eller set. (Bidrag från Eric V. Smith i bpo-44674.)

datatid

enum

  • Bytte namn på EnumMeta till EnumType (EnumMeta behölls som ett alias).

  • Lagt till StrEnum, med medlemmar som kan användas som (och måste vara) strängar.

  • Lade till ReprEnum, som endast modifierar __repr__() av medlemmar medan den returnerar deras bokstavliga värden (snarare än namn) för __str__() och __format__() (används av str(), format() och f-strings).

  • Ändrat Enum.__format__() (standard för format(), str.format() och f-strings) så att det alltid ger samma resultat som Enum.__str__(): för enumer som ärver från ReprEnum kommer det att vara medlemmens värde; för alla andra enumer kommer det att vara enum- och medlemsnamnet (t.ex. Color.RED).

  • En ny klass-parameter boundary har lagts till i enum Flag och enum FlagBoundary med dess alternativ, för att styra hur flaggvärden utanför intervallet ska hanteras.

  • Lade till verify() enum-dekoratorn och EnumCheck enum med dess alternativ, för att kontrollera enumklasser mot flera specifika begränsningar.

  • Lade till dekoratorerna member() och nonmember() för att säkerställa att det dekorerade objektet konverteras/inte konverteras till en enum-medlem.

  • Lade till property() dekoratorn, som fungerar som property() förutom för enum. Använd denna istället för types.DynamicClassAttribute().

  • Lade till enumdekoratorn global_enum(), som justerar __repr__() och __str__() så att värden visas som medlemmar i deras modul i stället för i enumklassen. Till exempel 're.ASCII' för ASCII-medlemmen i re.RegexFlag i stället för 'RegexFlag.ASCII'.

  • Förbättrade Flag för att stödja len(), iteration och in/not in på dess medlemmar. Till exempel fungerar följande nu: len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)

  • Ändrade Enum och Flag så att medlemmar nu definieras innan __init_subclass__() anropas; dir() inkluderar nu metoder etc. från mixade datatyper.

  • Ändrad Flag för att endast betrakta primära värden (potens av två) som kanoniska medan sammansatta värden (3, 6, 10, etc.) betraktas som alias; inverterade flaggor tvingas till sin positiva motsvarighet.

fcntl

  • På FreeBSD stöds flaggorna F_DUP2FD respektive F_DUP2FD_CLOEXEC, den förra motsvarar dup2-användning medan den senare dessutom sätter flaggan FD_CLOEXEC.

fraktioner

  • Stödjer PEP 515-stil initialisering av Fraction från sträng. (Bidrag från Sergey B Kirpichev i bpo-44258.)

  • Fraction implementerar nu en __int__ metod, så att en isinstance(some_fraction, typing.SupportsInt) kontroll godkänns. (Bidrag från Mark Dickinson i bpo-44547.)

functools

  • functools.singledispatch() stöder nu types.UnionType och typing.Union som annotationer till dispatch-argumentet.:

    >>> from functools import singledispatch
    >>> @singledispatch
    ... def fun(arg, verbose=False):
    ...     if verbose:
    ...         print("Let me just say,", end=" ")
    ...     print(arg)
    ...
    >>> @fun.register
    ... def _(arg: int | float, verbose=False):
    ...     if verbose:
    ...         print("Strength in numbers, eh?", end=" ")
    ...     print(arg)
    ...
    >>> from typing import Union
    >>> @fun.register
    ... def _(arg: Union[list, set], verbose=False):
    ...     if verbose:
    ...         print("Enumerate this:")
    ...     for i, elem in enumerate(arg):
    ...         print(i, elem)
    ...
    

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

gzip

  • Funktionen gzip.compress() är nu snabbare när den används med argumentet mtime=0 eftersom den delegerar komprimeringen helt till en enda zlib.compress()-operation. Det finns en bieffekt av denna förändring: Filhuvudet för gzip innehåller en ”OS”-byte i sitt huvud. Den sattes traditionellt alltid till ett värde av 255 som representerar ”unknown” av modulen gzip. Nu, när du använder compress() med mtime=0, kan det sättas till ett annat värde av det underliggande zlib C-biblioteket som Python länkades mot. (Se gh-112346 för detaljer om bieffekten)

hashlib

  • hashlib.blake2b() och hashlib.blake2s() föredrar nu libb2 framför Pythons vendored copy. (Bidrag från Christian Heimes i bpo-47095.)

  • Den interna modulen _sha3 med SHA3- och SHAKE-algoritmer använder nu tiny_sha3 i stället för Keccak Code Package för att minska storleken på kod och binärfiler. Modulen hashlib föredrar optimerade SHA3- och SHAKE-implementeringar från OpenSSL. Ändringen påverkar endast installationer utan OpenSSL-stöd. (Bidrag från Christian Heimes i bpo-47098.)

  • Lägg till hashlib.file_digest(), en hjälpfunktion för effektiv hashing av filer eller filliknande objekt. (Bidrag från Christian Heimes i gh-89313.)

IDLE och idlelib

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

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

inspektera

lokal

loggning

matematik

  • Lägg till math.exp2(): returnera 2 upphöjt till x. (Bidrag från Gideon Mitchell i bpo-45917.)

  • Lägg till math.cbrt(): returnera kubikroten av x. (Bidrag från Ajith Ramachandran i bpo-44357.)

  • Beteendet för två math.pow()-hörnfall har ändrats för att överensstämma med IEEE 754-specifikationen. Operationerna math.pow(0.0, -math.inf) och math.pow(-0.0, -math.inf) returnerar nu inf. Tidigare gav de ValueError. (Bidrag från Mark Dickinson i bpo-44339.)

  • Värdet math.nan är nu alltid tillgängligt. (Bidrag från Victor Stinner i bpo-46917.)

operator

  • En ny funktion operator.call har lagts till, så att operator.call(obj, *args, **kwargs) == obj(*args, **kwargs). (Bidrag från Antony Lee i bpo-44019.)

os

  • På Windows använder os.urandom() nu BCryptGenRandom(), istället för CryptGenRandom() som är föråldrad. (Bidrag från Donghee Na i bpo-44611.)

sökväg

re

  • Atomgruppering ((?>...)) och possessiva kvantifierare (*+, ++, ?+, {m,n}+) stöds nu i reguljära uttryck. (Bidrag från Jeffrey C. Jacobs och Serhiy Storchaka i bpo-433030.)

shutil

kortplats

  • Lägg till stöd för CAN Socket för NetBSD. (Bidrag från Thomas Klausner i bpo-30512.)

  • create_connection() har ett alternativ för att, i händelse av misslyckad anslutning, skapa en ExceptionGroup som innehåller alla fel istället för att bara skapa det sista felet. (Bidrag från Irit Katriel i bpo-29980.)

sqlite3

sträng

system

  • sys.exc_info() härleder nu fälten type och traceback från value (undantagsinstansen), så när ett undantag ändras medan det hanteras, återspeglas ändringarna i resultaten av efterföljande anrop till exc_info(). (Bidrag från Irit Katriel i bpo-45711.)

  • Lägg till sys.exception() som returnerar den aktiva undantagsinstansen (motsvarande sys.exc_info()[1]). (Bidrag från Irit Katriel i bpo-46328.)

  • Lägg till flaggan sys.flags.safe_path. (Bidrag från Victor Stinner i gh-57684.)

sysconfig

  • Tre nya installationsscheman (posix_venv, nt_venv och venv) har lagts till och används när Python skapar nya virtuella miljöer eller när den körs från en virtuell miljö. De två första schemana (posix_venv och nt_venv) är OS-specifika för icke-Windows och Windows, venv är i huvudsak ett alias till ett av dem beroende på vilket OS Python körs på. Detta är användbart för nedströmsdistributörer som ändrar sysconfig.get_preferred_scheme(). Tredjepartskod som skapar nya virtuella miljöer bör använda det nya venv-installationsschemat för att bestämma sökvägarna, precis som venv. (Bidrag från Miro Hrončok i bpo-45413.)

tempfil

gängning

  • På Unix, om funktionen sem_clockwait() finns tillgänglig i C-biblioteket (glibc 2.30 och senare), använder nu metoden threading.Lock.acquire() den monotona klockan (time.CLOCK_MONOTONIC) för timeout, istället för att använda systemklockan (time.CLOCK_REALTIME), för att inte påverkas av ändringar i systemklockan. (Bidrag från Victor Stinner i bpo-41710.)

tid

  • På Unix använder time.sleep() nu funktionen clock_nanosleep() eller nanosleep(), om den finns tillgänglig, som har en upplösning på 1 nanosekund (10-9 sekunder), i stället för att använda select() som har en upplösning på 1 mikrosekund (10-6 sekunder). (Bidrag från Benjamin Szőke och Victor Stinner i bpo-21302.)

  • I Windows 8.1 och senare använder time.sleep() nu en väntande timer baserad på högupplösta timers som har en upplösning på 100 nanosekunder (10-7 sekunder). Tidigare hade den en upplösning på 1 millisekund (10-3 sekunder). (Bidrag från Benjamin Szőke, Donghee Na, Eryk Sun och Victor Stinner i bpo-21302 och bpo-45429.)

tkinter

  • Lagt till metoden info_patchlevel() som returnerar den exakta versionen av Tcl-biblioteket som en namngiven tupel liknande sys.version_info. (Bidrag från Serhiy Storchaka i gh-91827.)

spårning

typing

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

  • Lägg till typing.assert_never() och typing.Never. typing.assert_never() är användbart för att be en typkontroll att bekräfta att en kodrad inte är nåbar. Vid körning ger det upphov till ett AssertionError. (Bidrag från Jelle Zijlstra i gh-90633.)

  • Lägg till typing.reveal_type(). Detta är användbart för att fråga en typkontrollant vilken typ den har härlett för ett givet uttryck. Vid körning skriver den ut typen för det mottagna värdet. (Bidrag från Jelle Zijlstra i gh-90572.)

  • Lägg till typing.assert_type(). Detta är användbart för att be en typkontrollör att bekräfta att den typ som den har härlett för ett visst uttryck matchar den angivna typen. Vid körning returnerar den helt enkelt det mottagna värdet. (Bidrag från Jelle Zijlstra i gh-90638.)

  • typing.TypedDict-typer kan nu vara generiska. (Bidrag från Samodya Abeysiriwardane i gh-89026.)

  • NamedTuple-typer kan nu vara generiska. (Bidrag från Serhiy Storchaka i bpo-43923.)

  • Tillåt subklassning av typing.Any. Detta är användbart för att undvika typkontrollfel relaterade till mycket dynamiska klasser, t.ex. mocks. (Bidrag från Shantanu Jain i gh-91154.)

  • Dekoratorn typing.final() sätter nu attributet __final__ på det dekorerade objektet. (Bidrag från Jelle Zijlstra i gh-90500.)

  • Funktionen typing.get_overloads() kan användas för att introspektera överbelastningar av en funktion. typing.clear_overloads() kan användas för att rensa alla registrerade överbelastningar av en funktion. (Bidrag från Jelle Zijlstra i gh-89263.)

  • Metoden __init__() för Protocol-underklasser bevaras nu. (Bidrag från Adrian Garcia Badarasco i gh-88970.)

  • Representationen av tomma tupeltyper (Tuple[()]) har förenklats. Detta påverkar introspektion, t.ex. get_args(Tuple[()]) utvärderas nu till () istället för ((),). (Bidrag från Serhiy Storchaka i gh-91137.)

  • Lättar på körtidskraven för typannoteringar genom att ta bort den anropbara kontrollen i den privata funktionen typing._type_check. (Bidrag från Gregory Beauregard i gh-90802.)

  • typing.get_type_hints() stöder nu utvärdering av strängar som framåtriktade referenser i PEP 585 generiska alias. (Bidrag från Niklas Rosenstein i gh-85542.)

  • typing.get_type_hints() lägger inte längre till Optional till parametrar med None som standard. (Bidrag från Nikita Sobolev i gh-90353.)

  • typing.get_type_hints() stöder nu utvärdering av nakna strängade ClassVar-annoteringar. (Bidrag från Gregory Beauregard i gh-90711.)

  • typing.no_type_check() modifierar inte längre externa klasser och funktioner. Den markerar nu också korrekt att klassmetoder inte ska typkontrolleras. (Bidrag från Nikita Sobolev i gh-90729.)

unicodedata

  • Unicode-databasen har uppdaterats till version 14.0.0. (Bidrag från Benjamin Peterson i bpo-45190).

unittest

ven

  • När nya virtuella Python-miljöer skapas används venv sysconfig-installationsschemat för att bestämma sökvägarna i miljön. När Python körs i en virtuell miljö är samma installationsschema standard. Det innebär att nedströmsdistributörer kan ändra standardinstallationsschemat för sysconfig utan att ändra beteendet i virtuella miljöer. Tredjepartskod som också skapar nya virtuella miljöer bör göra detsamma. (Bidrag från Miro Hrončok i bpo-45413.)

varningar

zip-fil

  • Lagt till stöd för att ange kodning av medlemsnamn för läsning av metadata i en ZipFile katalog och filhuvuden. (Bidrag från Stephen J. Turnbull och Serhiy Storchaka i bpo-28080.)

  • Lagt till ZipFile.mkdir() för att skapa nya kataloger inuti ZIP-arkiv. (Bidrag från Sam Ezeh i gh-49083.)

  • Lade till stem, suffix och suffixes till zipfile.Path. (Bidrag från Miguel Brito i gh-88261.)

Optimeringar

Detta avsnitt behandlar specifika optimeringar oberoende av Snabbare CPython-projektet, som behandlas i ett eget avsnitt.

  • Kompilatorn optimerar nu enkel printf-style % formatting på strängliteraler som endast innehåller formatkoderna %s, %r och %a och gör det lika snabbt som ett motsvarande f-string -uttryck. (Bidrag från Serhiy Storchaka i bpo-28307.)

  • Integer division (//) är bättre anpassad för optimering av kompilatorer. Det är nu runt 20% faster på x86-64 när man delar en int med ett värde som är mindre än 2**30. (Bidrag från Gregory P. Smith och Tim Peters i gh-90564.)

  • sum() är nu nästan 30% faster för heltal mindre än 2**30. (Bidrag från Stefan Behnel i gh-68264.)

  • Att ändra storlek på listor är strömlinjeformat för vanliga fall, vilket påskyndar list.append() med ≈15% aoch enkla list comprehension med upp till 20-30% (Bidrag från Dennis Sweeney i gh-91165.)

  • Dictionaries lagrar inte hash-värden när alla nycklar är Unicode-objekt, vilket minskar dict-storleken. Till exempel minskas sys.getsizeof(dict.fromkeys("abcdefg")) från 352 byte till 272 byte (23% smaller) på 64-bitars plattformar. (Bidrag från Inada Naoki i bpo-46845.)

  • Att använda asyncio.DatagramProtocol är nu flera storleksordningar snabbare vid överföring av stora filer över UDP, med hastigheter över 100 gånger högre för en fil på ≈60 MiB. (Bidrag från msoxzw i gh-91487.)

  • math-funktionerna comb() och perm() är nu ≈10 gånger snabbare för stora argument (med en större ökning för större k). (Bidrag från Serhiy Storchaka i bpo-37295.)

  • Funktionerna statistics mean(), variance() och stdev() använder nu iteratorer i ett svep i stället för att först konvertera dem till en list. Detta är dubbelt så snabbt och kan spara mycket minne. (Bidrag från Raymond Hettinger i gh-90415.)

  • unicodedata.normalize() normaliserar nu rena ASCII-strängar i konstant tid. (Bidrag från Donghee Na i bpo-44987.)

Snabbare CPython

CPython 3.11 är i genomsnitt 25% faster snabbare än CPython 3.10 mätt med pyperformance benchmark suite, när det kompileras med GCC på Ubuntu Linux. Beroende på din arbetsbelastning kan den totala hastighetsökningen vara 10-60%.

Det här projektet fokuserar på två stora områden i Python: Snabbare uppstart och Snabbare körtid. Optimeringar som inte täcks av detta projekt listas separat under Optimeringar.

Snabbare uppstart

Fryst import / Statiska kodobjekt

Python cachelagrar bytecode i __pycache__ katalogen för att påskynda laddning av moduler.

Tidigare i 3.10 såg exekveringen av Python-moduler ut så här:

Läs __pycache__ -> Unmarshal -> Heap-allokerat kodobjekt -> Utvärdera

I Python 3.11 är de kärnmoduler som är nödvändiga för Python-start ”frysta”. Detta innebär att deras Kodobjekt (och bytekoder) allokeras statiskt av tolken. Detta reducerar stegen i modulens exekveringsprocess till:

Statiskt allokerat kodobjekt -> Utvärdera

Interpreterstart är nu 10-15% faster i Python 3.11. Detta har stor inverkan på kortlivade program som använder Python.

(Bidrag från Eric Snow, Guido van Rossum och Kumar Aditya i många utgåvor)

Snabbare körtid

Billigare, latare Python-ramar

Python-ramar, som innehåller exekveringsinformation, skapas varje gång Python anropar en Python-funktion. Följande är nya optimeringar av ramar:

  • Effektiviserad process för att skapa ramar.

  • Undviker minnesallokering genom att generöst återanvända ramutrymme på C-stacken.

  • Effektiviserat den interna ramstrukturen till att endast innehålla väsentlig information. Frames innehöll tidigare extra felsöknings- och minneshanteringsinformation.

Den gamla stilen frame objects skapas nu endast på begäran av debuggar eller av Pythons introspektionsfunktioner som sys._getframe() och inspect.currentframe(). För de flesta användarkoder skapas inga frame-objekt alls. Som ett resultat av detta har nästan alla anrop av Python-funktioner blivit betydligt snabbare. Vi uppmätte en 3-7% speedup i pyperformance.

(Bidrag från Mark Shannon i bpo-44590.)

Anrop av Python-funktioner

Under ett Python-funktionsanrop kommer Python att anropa en utvärderande C-funktion för att tolka den funktionens kod. Detta begränsar effektivt ren Python-rekursion till vad som är säkert för C-stacken.

I 3.11, när CPython upptäcker att Python-kod anropar en annan Python-funktion, skapar CPython en ny ram och ”hoppar” till den nya koden i den nya ramen. På så sätt undviker man att anropa C-tolkningsfunktionen helt och hållet.

De flesta Python-funktionsanrop förbrukar nu inget C-stackutrymme, vilket snabbar upp dem. I enkla rekursiva funktioner som fibonacci eller factorial observerade vi en 1,7-faldig hastighet. Detta innebär också att rekursiva funktioner kan rekursera betydligt djupare (om användaren ökar rekursionsgränsen med sys.setrecursionlimit()). Vi uppmätte en 1-3% im förbättring av pyperformance.

(Bidrag från Pablo Galindo och Mark Shannon i bpo-45256.)

PEP 659: Specialisering av adaptiv tolk

PEP 659 är en av de viktigaste delarna i Faster CPython-projektet. Den allmänna idén är att även om Python är ett dynamiskt språk, har de flesta koder regioner där objekt och typer sällan ändras. Detta koncept är känt som typstabilitet.

Vid körning försöker Python leta efter vanliga mönster och typstabilitet i den exekverande koden. Python ersätter sedan den aktuella operationen med en mer specialiserad. Denna specialiserade operation använder snabba vägar som endast är tillgängliga för dessa användningsfall/typer, som i allmänhet överträffar sina generiska motsvarigheter. Detta medför också ett annat koncept som kallas inline caching, där Python cachelagrar resultaten av dyra operationer direkt i bytecode.

Specialiseraren kombinerar också vissa vanliga instruktionspar till en superinstruktion, vilket minskar overheaden under exekveringen.

Python kommer bara att specialisera sig när det ser kod som är ”het” (exekveras flera gånger). Detta förhindrar att Python slösar tid på kod som bara körs en gång. Python kan också avspecialisera när koden är för dynamisk eller när användningen ändras. Specialiseringsförsök görs med jämna mellanrum och specialiseringsförsöken är inte alltför dyra, vilket gör att specialiseringen kan anpassas till nya omständigheter.

(PEP skriven av Mark Shannon, med idéer inspirerade av Stefan Brunthaler. Se PEP 659 för mer information. Implementering av Mark Shannon och Brandt Bucher, med ytterligare hjälp från Irit Katriel och Dennis Sweeney)

Operation

Formulär

Specialisering

Snabbare drift (upp till)

Medverkande(n)

Binära operationer

x + x

x - x

x * x

Binär addition, multiplikation och subtraktion för vanliga typer som int, float och str tar anpassade snabba vägar för sina underliggande typer.

10%

Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney

Nedsänkt

a[i]

Subscripterande containertyper som list, tuple och dict indexerar direkt de underliggande datastrukturerna.

Subscripting custom __getitem__() är också inline på liknande sätt som Anrop av Python-funktioner.

10-25%

Irit Katriel, Mark Shannon

Lagra index

a[i] = z

På samma sätt som för specialisering av subskription ovan.

10-25%

Dennis Sweeney

Calls

f(arg)

C(arg)

Anrop till vanliga inbyggda (C) funktioner och typer som len() och str anropar direkt deras underliggande C-version. Detta undviker att gå igenom den interna anropskonventionen.

20%

Mark Shannon, Ken Jin

Ladda global variabel

print

len

Objektets index i namnrymdens globals/builtins är cachat. Inläsning av globaler och builtins kräver inga namnrymdsuppslagningar.

[1]

Mark Shannon

Ladda attribut

o.attr

På samma sätt som vid laddning av globala variabler. Attributets index i klassens/objektets namnrymd cachelagras. I de flesta fall kräver attributladdning inga namnrymdsuppslagningar.

[2]

Mark Shannon

Ladda metoder för anrop

o.meth()

Den faktiska adressen till metoden cachelagras. Metodladdning har nu inga namnrymdsuppslagningar - inte ens för klasser med långa arvskedjor.

10-20%

Ken Jin, Mark Shannon

Butikens attribut

o.attr = z

Liknar optimering av lastattribut.

2% in pyperformance

Mark Shannon

Sekvens för uppackning

*seq

Specialiserad för vanliga behållare som list och tuple. Undviker intern anropskonvention.

8%

Brandt Bucher

Övrigt

  • Objekt kräver nu mindre minne tack vare att namnrymder för objekt skapas på ett lättsamt sätt. Deras namnrymdsordböcker delar nu också nycklar mer fritt. (Bidrag från Mark Shannon i bpo-45340 och bpo-40116.)

  • ”Zero-cost”-undantag implementeras, vilket eliminerar kostnaden för try-satser när inget undantag uppstår. (Bidrag från Mark Shannon i bpo-40222.)

  • En mer kortfattad representation av undantag i tolken minskade den tid som krävs för att fånga ett undantag med cirka 10%. (Bidrag från Irit Katriel i bpo-45711.)

  • re:s matchningsmotor för reguljära uttryck har delvis omarbetats och använder nu beräknade gotos (eller ”trådad kod”) på plattformar som stöds. Som ett resultat exekverar Python 3.11 pyperformance regular expression benchmarks upp till 10% faster än Python 3.10. (Bidrag från Brandt Bucher i gh-91404.)

FAQ

Hur ska jag skriva min kod för att utnyttja dessa hastighetsökningar?

Skriv Pythonic-kod som följer vanliga bästa praxis; du behöver inte ändra din kod. Faster CPython-projektet optimerar för vanliga kodmönster som vi observerar.

Kommer CPython 3.11 att använda mer minne?

Kanske inte; vi förväntar oss inte att minnesanvändningen kommer att överstiga 20% hig mer än 3.10. Detta kompenseras av minnesoptimeringar för ramobjekt och objektordböcker som nämnts ovan.

Jag ser inte några hastighetsökningar i min arbetsbelastning. Varför inte?

Viss kod kommer inte att ha märkbara fördelar. Om din kod tillbringar större delen av sin tid på I/O-operationer eller redan gör större delen av sin beräkning i ett C-tilläggsbibliotek som NumPy, kommer det inte att finnas några betydande hastigheter. Detta projekt gynnar för närvarande rena Python-arbetsbelastningar mest.

Siffrorna för pyperformance är dessutom ett geometriskt medelvärde. Även inom pyperformance-riktmärkena har vissa riktmärken saktat ned något, medan andra har snabbats upp med nästan 2x!

Finns det en JIT-kompilator?

Nej, vi undersöker fortfarande andra optimeringar.

Om

Faster CPython utforskar optimeringar för CPython. Huvudteamet finansieras av Microsoft för att arbeta med detta på heltid. Pablo Galindo Salgado är också finansierad av Bloomberg LP för att arbeta med projektet på deltid. Slutligen är många bidragsgivare frivilliga från gemenskapen.

CPython bytecode-ändringar

Bytekoden innehåller nu inline-cacheposter i form av de nytillkomna instruktionerna CACHE. Många opkoder förväntar sig att följas av ett exakt antal cacher och instruerar tolken att hoppa över dem vid körning. Fyllda cacher kan se ut som godtyckliga instruktioner, så stor försiktighet bör iakttas när man läser eller modifierar rå, adaptiv bytecode som innehåller quickened-data.

Nya opkoder

Ersatta opkoder

Ersatt Opcode(s)

Ny(a) operationskod(er)

Anteckningar

BINARY_*
INPLACE_*

BINARY_OP

Ersatte alla numeriska binära/in-place-operationskoder med en enda operationskod

CALL_FUNCTION
CALL_FUNCTION_KW
CALL_METHOD
KW_NAMES
PRECALL

Kopplar bort argumentväxling för metoder från hantering av nyckelordsargument; möjliggör bättre specialisering av anrop

DUP_TOP
DUP_TOP_TWO
ROT_TWO
ROT_THREE
ROT_FOUR
ROT_N

Instruktioner för manipulering av stapeln

JUMP_IF_NOT_EXC_MATCH

Utför nu kontroll men hoppar inte

JUMP_ABSOLUTE`
POP_JUMP_IF_FALSE
POP_JUMP_IF_TRUE
POP_JUMP_BACKWARD_IF_*
POP_JUMP_FORWARD_IF_*

Se [3]; varianterna TRUE, FALSE, NONE och NOT_NONE för varje riktning

SETUP_WITH
SETUP_ASYNC_WITH

BEFORE_WITH

with blockuppsättning

Ändrade/ borttagna opkoder

  • Ändrad MATCH_CLASS och MATCH_KEYS för att inte längre skicka ett ytterligare booleskt värde för att indikera framgång/misslyckande. Istället skickas None vid misslyckande i stället för tupeln av extraherade värden.

  • Ändrade opkoder som arbetar med undantag för att återspegla att de nu representeras som ett objekt på stacken istället för tre (se gh-89874).

  • Tog bort COPY_DICT_WITHOUT_KEYS, GEN_START, POP_BLOCK, SETUP_FINALLY och YIELD_FROM.

Föråldrat

I detta avsnitt listas Python API:er som har utgått i Python 3.11.

Föråldrade C API:er är listade separat.

Språk/Builtins

  • Chaining classmethod descriptors (introducerad i bpo-19072) är nu avförd. Den kan inte längre användas för att omsluta andra deskriptorer såsom property. Grunddesignen för denna funktion var bristfällig och orsakade ett antal problem i efterhand. För att ”pass-through” en classmethod, överväg att använda attributet __wrapped__ som lades till i Python 3.10. (Bidrag från Raymond Hettinger i gh-89519.)

  • Oktala escapes i sträng- och byteslitteraler med värden större än 0o377 (255 i decimal) ger nu en DeprecationWarning. I en framtida Python-version kommer de att ge upphov till en SyntaxWarning och så småningom en SyntaxError. (Bidrag från Serhiy Storchaka i gh-81548.)

  • Delegeringen av int() till __trunc__() är nu föråldrad. Anrop av int(a) när type(a) implementerar __trunc__() men inte __int__() eller __index__() ger nu upphov till en DeprecationWarning. (Bidrag från Zackery Spytz i bpo-44977.)

Moduler

  • PEP 594 ledde till att följande moduler togs bort i Python 3.13:

    aifc

    chunk

    msilib

    pipes

    telnetlib

    audioop

    crypt

    nis

    sndhdr

    uu

    cgi

    imghdr

    nntplib

    spwd

    xdrlib

    cgitb

    mailcap

    ossaudiodev

    sunau

    (Bidrag från Brett Cannon i bpo-47061 och Victor Stinner i gh-68966.)

  • Modulerna asynchat, asyncore och smtpd har varit föråldrade sedan åtminstone Python 3.6. Deras dokumentation och varningar om utfasning har nu uppdaterats för att notera att de kommer att tas bort i Python 3.12. (Bidrag från Hugo van Kemenade i bpo-47022.)

  • Paketet lib2to3 och verktyget 2to3 är nu föråldrade och kanske inte kan parsa Python 3.10 eller nyare. Se PEP 617, som introducerar den nya PEG-parsern, för mer information. (Bidrag från Victor Stinner i bpo-40360.)

  • De odokumenterade modulerna sre_compile, sre_constants och sre_parse är nu föråldrade. (Bidrag från Serhiy Storchaka i bpo-47152.)

Standardbibliotek

  • Följande har utgått i configparser sedan Python 3.2. Deras varningar om utfasning har nu uppdaterats för att notera att de kommer att tas bort i Python 3.12:

    • klassen configparser.SafeConfigParser

    • egenskapen configparser.ParsingError.filename

    • configparser.RawConfigParser.readfp()-metoden

    (Bidrag från Hugo van Kemenade i bpo-45173.)

  • configparser.LegacyInterpolation har varit utfasad i dokumentationen sedan Python 3.2, och är inte listad i configparser dokumentationen. Den avger nu en DeprecationWarning och kommer att tas bort i Python 3.13. Använd configparser.BasicInterpolation eller configparser.ExtendedInterpolation istället. (Bidrag från Hugo van Kemenade i bpo-46607.)

  • Den äldre uppsättningen importlib.resources-funktioner utrangerades till förmån för de ersättningar som lades till i Python 3.9 och kommer att tas bort i en framtida Python-version, på grund av att de inte stöder resurser som finns i paketunderkataloger:

    • importlib.resources.contents()

    • importlib.resources.is_resource()

    • importlib.resources.open_binary()

    • importlib.resources.open_text()

    • importlib.resources.read_binary()

    • importlib.resources.read_text()

    • importlib.resources.path()

  • Funktionen locale.getdefaultlocale() är föråldrad och kommer att tas bort i Python 3.15. Använd istället funktionerna locale.setlocale(), locale.getpreferredencoding(False) och locale.getlocale(). (Bidrag från Victor Stinner i gh-90817.)

  • Funktionen locale.resetlocale() är föråldrad och kommer att tas bort i Python 3.13. Använd locale.setlocale(locale.LC_ALL, "") istället. (Bidrag från Victor Stinner i gh-90817.)

  • Strängare regler kommer nu att tillämpas för numeriska gruppreferenser och gruppnamn i regular expressions. Endast sekvenser av ASCII-siffror accepteras nu som en numerisk referens, och gruppnamnet i bytes-mönster och ersättningssträngar får endast innehålla ASCII-bokstäver, siffror och understreck. För närvarande utfärdas en varning för syntax som bryter mot dessa regler. (Bidrag från Serhiy Storchaka i gh-91760.)

  • I modulen re är funktionen re.template() och motsvarande flaggor re.TEMPLATE och re.T avförda, eftersom de var odokumenterade och saknade ett uppenbart syfte. De kommer att tas bort i Python 3.13. (Bidrag från Serhiy Storchaka och Miro Hrončok i gh-92728.)

  • turtle.settiltangle() har varit föråldrad sedan Python 3.1; den avger nu en föråldringsvarning och kommer att tas bort i Python 3.13. Använd turtle.tiltangle() istället (det var tidigare felaktigt markerat som föråldrat, och dess docstring är nu korrigerad). (Bidrag från Hugo van Kemenade i bpo-45837.)

  • typing.Text, som existerar enbart för att ge kompatibilitetsstöd mellan Python 2 och Python 3-kod, är nu föråldrad. Dess borttagning är för närvarande inte planerad, men användare uppmuntras att använda str istället när det är möjligt. (Bidrag från Alex Waygood i gh-92332.)

  • Syntaxen för nyckelordsargument för konstruktion av typing.TypedDict-typer är nu föråldrad. Stödet kommer att tas bort i Python 3.13. (Bidrag från Jingchen Ye i gh-90224.)

  • webbrowser.MacOSX är föråldrad och kommer att tas bort i Python 3.13. Den är otestad, odokumenterad och används inte av webbrowser själv. (Bidrag från Donghee Na i bpo-42255.)

  • Beteendet att returnera ett värde från testmetoderna TestCase och IsolatedAsyncioTestCase (annat än standardvärdet None) är nu föråldrat.

  • Följande icke-formellt dokumenterade unittest-funktioner har utgått och kommer att tas bort i Python 3.13:

    • unittest.findTestCases()

    • unittest.makeSuite()

    • unittest.getTestCaseNames()

    Använd istället TestLoader-metoder:

    (Bidrag från Erlend E. Aasland i bpo-5846.)

  • unittest.TestProgram.usageExit() är markerad som föråldrad och kommer att tas bort i 3.13. (Bidrag från Carlos Damázio i gh-67048.)

Väntar på borttagning i Python 3.12

Följande Python API:er har utgått i tidigare Python-utgåvor och kommer att tas bort i Python 3.12.

C API:er som väntar på att tas bort är listade separat.

  • Modulen asynchat

  • Modulen asyncore

  • Paketet entire distutils

  • Modulen imp

  • Namnrymden typing.io

  • Namnrymden typing.re

  • cgi.log()

  • importlib.find_loader()

  • importlib.abc.Loader.module_repr()

  • importlib.abc.MetaPathFinder.find_module()

  • importlib.abc.PathEntryFinder.find_loader()

  • importlib.abc.PathEntryFinder.find_module()

  • importlib.machinery.BuiltinImporter.find_module()

  • importlib.machinery.BuiltinLoader.module_repr()

  • importlib.machinery.FileFinder.find_loader()

  • importlib.machinery.FileFinder.find_module()

  • importlib.machinery.FrozenImporter.find_module()

  • importlib.machinery.FrozenLoader.module_repr()

  • importlib.machinery.PathFinder.find_module()

  • importlib.machinery.WindowsRegistryFinder.find_module()

  • importlib.util.module_for_loader()

  • importlib.util.set_loader_wrapper()

  • importlib.util.set_package_wrapper()

  • pkgutil.ImpImporter

  • pkgutil.ImpLoader

  • pathlib.Path.link_to()

  • sqlite3.enable_shared_cache()

  • sqlite3.OptimizedUnicode()

  • PYTHONTHREADDEBUG miljövariabel

  • Följande föråldrade alias i unittest:

    Föråldrat alias

    Metod Namn

    Avskrivna i

    failUnless

    assertTrue()

    3.1

    failIf

    assertFalse()

    3.1

    failUnlessEqual

    assertEqual()

    3.1

    failIfEqual

    assertNotEqual()

    3.1

    ”misslyckas utan undantag nästan lika

    assertAlmostEqual()

    3.1

    failIfAlmostEqual

    assertNotAlmostEqual()

    3.1

    failUnlessRaises

    assertRaises()

    3.1

    assert_

    assertTrue()

    3.2

    assertEquals

    assertEqual()

    3.2

    assertNotEquals

    assertNotEqual()

    3.2

    assertAlmostEquals

    assertAlmostEqual()

    3.2

    assertNotAlmostEquals

    assertNotAlmostEqual()

    3.2

    assertRegexpMatches

    assertRegex()

    3.2

    assertRaisesRegexp

    assertRaisesRegex()

    3.2

    assertNotRegexpMatches

    assertNotRegex()

    3.5

Borttagen

I detta avsnitt listas Python API:er som har tagits bort i Python 3.11.

Borttagna C API:er är listade separat.

  • Tog bort @asyncio.coroutine() decorator som gör det möjligt för äldre generatorbaserade coroutines att vara kompatibla med async / await-kod. Funktionen har varit föråldrad sedan Python 3.8 och borttagningen var ursprungligen planerad till Python 3.10. Använd async def istället. (Bidrag från Illia Volochii i bpo-43216.)

  • Tog bort asyncio.coroutines.CoroWrapper som används för att paketera äldre generatorbaserade coroutine-objekt i felsökningsläget. (Bidrag från Illia Volochii i bpo-43216.)

  • På grund av betydande säkerhetsproblem är parametern reuse_address i asyncio.loop.create_datagram_endpoint(), som inaktiverades i Python 3.9, nu helt borttagen. Detta beror på beteendet hos socket-alternativet SO_REUSEADDR i UDP. (Bidrag från Hugo van Kemenade i bpo-45129.)

  • Tog bort modulen binhex, föråldrad i Python 3.9. Tog även bort de relaterade, likaledes föråldrade binascii-funktionerna:

    • binascii.a2b_hqx()

    • binascii.b2a_hqx()

    • binascii.rlecode_hqx()

    • binascii.rldecode_hqx()

    Funktionen binascii.crc_hqx() är fortfarande tillgänglig.

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

  • Tog bort kommandot distutils bdist_msi som är föråldrat i Python 3.9. Använd bdist_wheel (wheel-paket) istället. (Bidrag från Hugo van Kemenade i bpo-45124.)

  • Tog bort __getitem__()-metoderna för xml.dom.pulldom.DOMEventStream, wsgiref.util.FileWrapper och fileinput.FileInput, föråldrade sedan Python 3.9. (Bidrag från Hugo van Kemenade i bpo-45132.)

  • Tog bort de föråldrade gettext-funktionerna lgettext(), ldgettext(), lngettext() och ldngettext(). Tog även bort funktionen bind_textdomain_codeset(), metoderna NullTranslations.output_charset() och NullTranslations.set_output_charset(), samt parametern codeset i translation() och install(), eftersom de endast används för funktionerna l*gettext(). (Bidrag från Donghee Na och Serhiy Storchaka i bpo-44235.)

  • Borttagen från modulen inspect:

    (Bidrag från Hugo van Kemenade i bpo-45320.)

  • Tog bort metoden __class_getitem__() från pathlib.PurePath, eftersom den inte användes och lades till av misstag i tidigare versioner. (Bidrag från Nikita Sobolev i bpo-46483.)

  • Tog bort klassen MailmanProxy i modulen smtpd, eftersom den är oanvändbar utan det externa paketet mailman. (Bidrag från Donghee Na i bpo-35800.)

  • Tog bort den föråldrade split()-metoden i _tkinter.TkappType. (Bidrag från Erlend E. Aasland i bpo-38371.)

  • Tog bort stöd för namnrymdspaket från unittest-upptäckt. Det introducerades i Python 3.4 men har varit trasigt sedan Python 3.7. (Bidrag från Inada Naoki i bpo-23882.)

  • Tog bort den odokumenterade privata metoden float.__set_format__(), tidigare känd som float.__setformat__() i Python 3.7. Dess docstring sa: ”Du vill förmodligen inte använda den här funktionen. Den existerar främst för att användas i Pythons testsvit.” (Bidrag från Victor Stinner i bpo-46852.)

  • Konfigurationsflaggan --experimental-isolated-subinterpreters (och motsvarande makro EXPERIMENTAL_ISOLATED_SUBINTERPRETERS) har tagits bort.

  • Pynche — The Pythonically Natural Color and Hue Editor — har flyttats från Tools/scripts och utvecklas nu oberoende från Pythons källkodsträd.

Portning till Python 3.11

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

Anteckningar om portning av C API finns listade separat.

  • open(), io.open(), codecs.open() och fileinput.FileInput accepterar inte längre 'U' (”universal newline”) i filläget. I Python 3 används ”universal newline”-läget som standard när en fil öppnas i textläge, och flaggan 'U' har utgått sedan Python 3.3. Parametern newline till dessa funktioner kontrollerar hur universella nya rader fungerar. (Bidrag från Victor Stinner i bpo-37330.)

  • ast.AST nodpositioner valideras nu när de anges till compile() och andra relaterade funktioner. Om ogiltiga positioner upptäcks kommer ett ValueError att visas. (Bidrag från Pablo Galindo i gh-93351)

  • Förbjöd att skicka non-concurrent.futures.ThreadPoolExecutor-exekutorer till asyncio.loop.set_default_executor() efter en deprecation i Python 3.8. (Bidrag från Illia Volochii i bpo-43234.)

  • calendar: Klasserna calendar.LocaleTextCalendar och calendar.LocaleHTMLCalendar använder nu locale.getlocale(), istället för att använda locale.getdefaultlocale(), om ingen locale är specificerad. (Bidrag från Victor Stinner i bpo-46659.)

  • Modulen pdb läser nu konfigurationsfilen .pdbrc med kodningen 'UTF-8'. (Bidrag från Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) i bpo-41137.)

  • Parametern population i random.sample() måste vara en sekvens, och automatisk konvertering av set till list stöds inte längre. Om urvalsstorleken är större än populationsstorleken uppstår dessutom ett ValueError. (Bidrag från Raymond Hettinger i bpo-40465.)

  • Den valfria parametern random i random.shuffle() togs bort. Tidigare var det en godtycklig slumpfunktion som användes för blandningen; nu kommer random.random() (dess tidigare standard) alltid att användas.

  • I re Syntax för reguljära uttryck kan globala inline-flaggor (t.ex. (?i)) nu bara användas i början av reguljära uttryck. Att använda dem på andra ställen har varit förbjudet sedan Python 3.6. (Bidrag från Serhiy Storchaka i bpo-47066.)

  • I modulen re har flera gamla buggar åtgärdats som i sällsynta fall kunde leda till att fångstgrupper fick fel resultat. Därför kan detta ändra den fångade utdata i dessa fall. (Bidrag från Ma Lin i bpo-35859.)

Förändringar i byggning

  • CPython har nu PEP 11 Tier 3 support för korskompilering till WebAssembly plattformarna Emscripten (wasm32-unknown-emscripten, dvs Python i webbläsaren) och WebAssembly System Interface (WASI) (wasm32-unknown-wasi). Ansträngningen är inspirerad av tidigare arbete som Pyodide. Dessa plattformar tillhandahåller en begränsad delmängd av POSIX API:er; Pythons standardbiblioteksfunktioner och moduler relaterade till nätverk, processer, trådning, signaler, mmap och användare/grupper är inte tillgängliga eller fungerar inte. (Emscripten bidragit med av Christian Heimes och Ethan Smith i gh-84461 och WASI bidragit med av Christian Heimes i gh-90473; plattformar marknadsförda i gh-95085)

  • Att bygga CPython kräver nu:

  • Makrot Py_NO_NAN har tagits bort. Eftersom CPython nu kräver IEEE 754-flottor är NaN-värden alltid tillgängliga. (Bidrag från Victor Stinner i bpo-46656.)

  • Paketet tkinter kräver nu Tcl/Tk version 8.5.12 eller nyare. (Bidrag från Serhiy Storchaka i bpo-46996.)

  • Byggberoenden, kompilatorflaggor och länkarflaggor för de flesta stdlib-tilläggsmoduler upptäcks nu av configure. libffi, libnsl, libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk och uuid-flaggor upptäcks av pkg-config (när tillgängligt). tkinter kräver nu ett pkg-config-kommando för att upptäcka utvecklingsinställningar för Tcl/Tk-huvuden och bibliotek. (Bidrag från Christian Heimes och Erlend Egeberg Aasland i bpo-45847, bpo-45747, och bpo-45763.)

  • libpython är inte längre länkat mot libcrypt. (Bidrag från Mike Gilbert i bpo-45433.)

  • CPython kan nu byggas med alternativet ThinLTO genom att skicka thin till --with-lto, dvs. --with-lto=thin. (Bidrag från Donghee Na och Brett Holman i bpo-44340.)

  • Freelists för objektstrukturer kan nu inaktiveras. Ett nytt configure-alternativ --without-freelists kan användas för att inaktivera alla frilistor utom tom tuple singleton. (Bidrag från Christian Heimes i bpo-45522.)

  • Modules/Setup och Modules/makesetup har förbättrats och knutits samman. Tilläggsmoduler kan nu byggas genom makesetup. Alla utom vissa testmoduler kan länkas statiskt till en huvudbinärfil eller ett huvudbibliotek. (Bidrag från Brett Cannon och Christian Heimes i bpo-45548, bpo-45570, bpo-45571, och bpo-43974.)

    Anteckning

    Använd miljövariablerna TCLTK_CFLAGS och TCLTK_LIBS för att manuellt ange platsen för Tcl/Tk-huvuden och -bibliotek. Alternativen configure --with-tcltk-includes och --with-tcltk-libs har tagits bort.

    På RHEL 7 och CentOS 7 tillhandahåller inte utvecklingspaketen tcl.pc och tk.pc; använd TCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5". Katalogen Misc/rhel7 innehåller .pc-filer och instruktioner om hur man bygger Python med RHEL 7:s och CentOS 7:s Tcl/Tk och OpenSSL.

  • CPython kommer nu att använda 30-bitars siffror som standard för Python int-implementationen. Tidigare var standardinställningen att använda 30-bitars siffror på plattformar med SIZEOF_VOID_P >= 8, och 15-bitars siffror annars. Det är fortfarande möjligt att uttryckligen begära användning av 15-bitars siffror via antingen --enable-big-digits-alternativet till configure-skriptet eller (för Windows) variabeln PYLONG_BITS_IN_DIGIT i PC/pyconfig.h, men detta alternativ kan komma att tas bort någon gång i framtiden. (Bidrag från Mark Dickinson i bpo-45569.)

Ändringar i C API

Nya funktioner

Portning till Python 3.11

  • Vissa makron har konverterats till statiska inline-funktioner för att undvika makrofällor. Förändringen bör vara mestadels transparent för användarna, eftersom ersättningsfunktionerna kommer att kasta sina argument till de förväntade typerna för att undvika kompilatorvarningar på grund av statiska typkontroller. När det begränsade C API:et är inställt på >=3.11 görs dock inte dessa kast och anropare måste kasta argumenten till deras förväntade typer. Se PEP 670 för mer information. (Bidrag från Victor Stinner och Erlend E. Aasland i gh-89653.)

  • PyErr_SetExcInfo() använder inte längre argumenten type och traceback, tolken härleder nu dessa värden från undantagsinstansen (argumentet value). Funktionen stjäl fortfarande referenser till alla tre argumenten. (Bidrag från Irit Katriel i bpo-45711.)

  • PyErr_GetExcInfo() härleder nu fälten type och traceback i resultatet från undantagsinstansen (fältet value). (Bidrag från Irit Katriel i bpo-45711.)

  • _frozen har fått ett nytt fält is_package som anger om den frysta modulen är ett paket eller inte. Tidigare var ett negativt värde i fältet size indikatorn. Nu kan endast icke-negativa värden användas för size. (Bidrag från Kumar Aditya i bpo-46608.)

  • _PyFrameEvalFunction() tar nu _PyInterpreterFrame* som sin andra parameter, istället för PyFrameObject*. Se PEP 523 för mer information om hur man använder denna funktionspekartyp.

  • PyCode_New() och PyCode_NewWithPosOnlyArgs() tar nu ett ytterligare exception_table argument. Användning av dessa funktioner bör undvikas om det är möjligt. För att få ett anpassat kodobjekt: skapa ett kodobjekt med hjälp av kompilatorn och få sedan en modifierad version med metoden replace.

  • PyCodeObject har inte längre fälten co_code, co_varnames, co_cellvars och co_freevars. Använd istället PyCode_GetCode(), PyCode_GetVarnames(), PyCode_GetCellvars() respektive PyCode_GetFreevars() för att komma åt dem via C API. (Bidrag från Brandt Bucher i bpo-46841 och Ken Jin i gh-92154 och gh-94936.)

  • De gamla trashcan-makrot (Py_TRASHCAN_SAFE_BEGIN/Py_TRASHCAN_SAFE_END) är nu föråldrade. De bör ersättas av de nya makrona Py_TRASHCAN_BEGIN och Py_TRASHCAN_END.

    En tp_dealloc-funktion som har de gamla makron, till exempel:

    statiskt void
    mytype_dealloc(mytype *p)
    {
        PyObject_GC_UnTrack(p);
        Py_TRASHCAN_SAFE_BEGIN(p);
        ...
        Py_TRASHCAN_SAFE_END
    }
    

    bör övergå till de nya makron enligt följande:

    statiskt void
    mytype_dealloc(mytype *p)
    {
        PyObject_GC_UnTrack(p);
        Py_TRASHCAN_BEGIN(p, mytype_dealloc)
        ...
        Py_TRASHCAN_END
    }
    

    Observera att Py_TRASHCAN_BEGIN har ett andra argument som bör vara den deallokeringsfunktion som den ingår i.

    För att stödja äldre Python-versioner i samma kodbas kan du definiera följande makron och använda dem i hela koden (källa: dessa har kopierats från kodbasen mypy):

    #if PY_VERSION_HEX >= 0x03080000
    # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc)
    # define CPy_TRASHCAN_END(op) Py_TRASHCAN_END
    #else
    # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op)
    # define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op)
    #endif
    
  • Funktionen PyType_Ready() ger nu upphov till ett fel om en typ definieras med flaggan Py_TPFLAGS_HAVE_GC inställd men inte har någon traversefunktion (PyTypeObject.tp_traverse). (Bidrag från Victor Stinner i bpo-44263.)

  • Heap-typer med Py_TPFLAGS_IMMUTABLETYPE flaggan kan nu ärva PEP 590 vectorcall protokollet. Tidigare var detta endast möjligt för static types. (Bidrag från Erlend E. Aasland i bpo-43908)

  • Eftersom Py_TYPE() har ändrats till en statisk inline-funktion, måste Py_TYPE(obj) = new_type ersättas med Py_SET_TYPE(obj, new_type): se funktionen Py_SET_TYPE() (tillgänglig sedan Python 3.9). För bakåtkompatibilitet kan detta makro användas:

    #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE)
    statisk inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type)
    { ob->ob_type = typ; }
    #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)
    #endif
    

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

  • Eftersom Py_SIZE() har ändrats till en statisk inline-funktion, måste Py_SIZE(obj) = new_size ersättas med Py_SET_SIZE(obj, new_size): se funktionen Py_SET_SIZE() (tillgänglig sedan Python 3.9). För bakåtkompatibilitet kan detta makro användas:

    #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE)
    statisk inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size)
    { ob->ob_size = size; }
    #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)
    #endif
    

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

  • <Python.h> inkluderar inte längre huvudfilerna <stdlib.h>, <stdio.h>, <errno.h> och <string.h> när makrot Py_LIMITED_API är inställt på 0x030b0000 (Python 3.11) eller högre. C-tillägg bör uttryckligen inkludera huvudfilerna efter #include <Python.h>. (Bidrag från Victor Stinner i bpo-45434.)

  • De icke-begränsade API-filerna cellobject.h, classobject.h, code.h, context.h, funcobject.h, genobject.h och longintrepr.h har flyttats till katalogen Include/cpython. Dessutom har huvudfilen eval.h tagits bort. Dessa filer får inte inkluderas direkt, eftersom de redan finns i Python.h: Include Files. Om de har inkluderats direkt, överväg att inkludera Python.h istället. (Bidrag från Victor Stinner i bpo-35134.)

  • Makrot PyUnicode_CHECK_INTERNED() har uteslutits från det begränsade C API:et. Det var aldrig användbart där, eftersom det använde interna strukturer som inte är tillgängliga i det begränsade C API:et. (Bidrag från Victor Stinner i bpo-46007.)

  • Följande ramfunktioner och -typer är nu direkt tillgängliga med #include <Python.h>, det är inte längre nödvändigt att lägga till #include <frameobject.h>:

    (Bidrag från Victor Stinner i gh-93937.)

  • Strukturmedlemmarna PyFrameObject har tagits bort från det publika C API:et.

    Även om det i dokumentationen anges att fälten PyFrameObject kan ändras när som helst, har de varit stabila under lång tid och använts i flera populära tillägg.

    I Python 3.11 omorganiserades ramstrukturen för att möjliggöra prestandaoptimeringar. Vissa fält togs bort helt och hållet, eftersom de var detaljer i den gamla implementeringen.

    PyFrameObject-fält :

    Python frame-objektet skapas nu på ett lättsamt sätt. En bieffekt är att medlemmen f_back inte får nås direkt, eftersom dess värde nu också beräknas på ett slött sätt. Funktionen PyFrame_GetBack() måste anropas istället.

    Avläsningsprogram som använde f_locals direkt måste anropa PyFrame_GetLocals() istället. De behöver inte längre anropa PyFrame_FastToLocalsWithError() eller PyFrame_LocalsToFast(), i själva verket bör de inte anropa dessa funktioner. Den nödvändiga uppdateringen av ramen hanteras nu av den virtuella maskinen.

    Kod som definierar PyFrame_GetCode() på Python 3.8 och äldre:

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame)
    {
        Py_INCREF(frame->f_code);
        returnera frame->f_code;
    }
    #endif
    

    Kod som definierar PyFrame_GetBack() på Python 3.8 och äldre:

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame)
    {
        Py_XINCREF(ram->f_back);
        returnera frame->f_back;
    }
    #endif
    

    Eller använd pythoncapi_compat-projektet för att få dessa två funktioner på äldre Python-versioner.

  • Ändringar av strukturmedlemmarna i PyThreadState:

    Kod som definierar PyThreadState_GetFrame() på Python 3.8 och äldre:

    #if PY_VERSION_HEX < 0x030900B1
    static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate)
    {
        Py_XINCREF(tstate->frame);
        return tstate->frame;
    }
    #endif
    

    Kod som definierar PyThreadState_EnterTracing() och PyThreadState_LeaveTracing() på Python 3.10 och äldre:

    #if PY_VERSION_HEX < 0x030B00A2
    static inline void PyThreadState_EnterTracing(PyThreadState *tstate)
    {
        tstate->tracing++;
    #if PY_VERSION_HEX >= 0x030A00A1
        tstate->cframe->use_tracing = 0;
    #else
        tstate->use_tracing = 0;
    #endif
    }
    
    static inline void PyThreadState_LeaveTracing(PyThreadState *tstate)
    {
        int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL);
        tstate->tracing--;
    #if PY_VERSION_HEX >= 0x030A00A1
        tstate->cframe->use_tracing = use_tracing;
    #else
        tstate->use_tracing = use_tracing;
    #endif
    }
    #endif
    

    Eller använd the pythoncapi-compat project för att få dessa funktioner på gamla Python-funktioner.

  • Distributörer uppmuntras att bygga Python med det optimerade Blake2-biblioteket libb2.

  • Fältet PyConfig.module_search_paths_set måste nu vara satt till 1 för att initieringen ska använda PyConfig.module_search_paths för att initiera sys.path. Annars kommer initieringen att räkna om sökvägen och ersätta alla värden som lagts till i module_search_paths.

  • PyConfig_Read() beräknar inte längre den första sökvägen och fyller inte i några värden i PyConfig.module_search_paths. För att beräkna standardsökvägar och sedan ändra dem, avsluta initialiseringen och använd PySys_GetObject() för att hämta sys.path som ett Python-listobjekt och ändra det direkt.

Föråldrat

  • Avveckla följande funktioner för att konfigurera Python-initialiseringen:

    • PySys_AddWarnOptionUnicode()

    • PySys_AddWarnOption()

    • PySys_AddXOption()

    • PySys_HasWarnOptions()

    • PySys_SetArgvEx()

    • PySys_SetArgv()

    • PySys_SetPath()

    • Py_SetPath()

    • Py_SetProgramName()

    • Py_SetPythonHome()

    • Py_SetStandardStreamEncoding()

    • _Py_SetProgramFullPath()

    Använd det nya PyConfig API:et i Python Initialization Configuration istället (PEP 587). (Bidrag från Victor Stinner i gh-88279.)

  • Avveckla ob_shash-medlemmen i PyBytesObject. Använd PyObject_Hash() istället. (Bidrag från Inada Naoki i bpo-46864.)

Väntar på borttagning i Python 3.12

Följande C API:er har utgått i tidigare Python-utgåvor och kommer att tas bort i Python 3.12.

  • PyUnicode_AS_DATA()

  • PyUnicode_AS_UNICODE()

  • PyUnicode_AsUnicodeAndSize()

  • PyUnicode_AsUnicode()

  • PyUnicode_FromUnicode()

  • PyUnicode_GET_DATA_SIZE()

  • PyUnicode_GET_SIZE()

  • PyUnicode_GetSize()

  • PyUnicode_IS_COMPACT()

  • PyUnicode_IS_READY()

  • PyUnicode_READY()

  • PyUnicode_WSTR_LENGTH()

  • _PyUnicode_AsUnicode()

  • PyUnicode_WCHAR_KIND

  • PyUnicodeObject

  • PyUnicode_InternImmortal()

Borttagen

  • PyFrame_BlockSetup() och PyFrame_BlockPop() har tagits bort. (Bidrag från Mark Shannon i bpo-40222.)

  • Ta bort följande matematiska makron med hjälp av variabeln errno:

    • Py_ADJUST_ERANGE1()

    • Py_ADJUST_ERANGE2()

    • Py_OVERFLOWED()

    • Py_SET_ERANGE_IF_OVERFLOW()

    • Py_SET_ERRNO_ON_MATH_ERROR()

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

  • Ta bort makron Py_UNICODE_COPY() och Py_UNICODE_FILL(), föråldrade sedan Python 3.3. Använd PyUnicode_CopyCharacters() eller memcpy() (wchar_t*-sträng), och PyUnicode_Fill() funktioner istället. (Bidrag från Victor Stinner i bpo-41123.)

  • Ta bort huvudfilen pystrhex.h. Den innehåller endast privata funktioner. C-tillägg bör endast inkludera huvudfilen <Python.h>. (Bidrag från Victor Stinner i bpo-45434.)

  • Ta bort makrot Py_FORCE_DOUBLE(). Det användes av makrot Py_IS_INFINITY(). (Bidrag från Victor Stinner i bpo-45440.)

  • Följande objekt är inte längre tillgängliga när Py_LIMITED_API är definierat:

    Dessa ingår inte i begränsat API.

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

  • Uteslut PyWeakref_GET_OBJECT() från det begränsade C API:et. Det fungerade aldrig eftersom PyWeakReference-strukturen är ogenomskinlig i det begränsade C API:et. (Bidrag från Victor Stinner i bpo-35134.)

  • Ta bort makrot PyHeapType_GET_MEMBERS(). Det exponerades i det offentliga C API:et av misstag, det får endast användas av Python internt. Använd medlemmen PyTypeObject.tp_members istället. (Bidrag från Victor Stinner i bpo-40170.)

  • Ta bort makrot HAVE_PY_SET_53BIT_PRECISION (flyttat till det interna C API:et). (Bidrag från Victor Stinner i bpo-45412.)

  • Ta bort Py_UNICODE-kodar-API:erna, eftersom de har varit föråldrade sedan Python 3.3, används lite och är ineffektiva i förhållande till de rekommenderade alternativen.

    De borttagna funktionerna är:

    • PyUnicode_Encode()

    • PyUnicode_EncodeASCII()

    • PyUnicode_EncodeLatin1()

    • PyUnicode_EncodeUTF7`()

    • PyUnicode_EncodeUTF8`()

    • PyUnicode_EncodeUTF16`()

    • PyUnicode_EncodeUTF32`()

    • PyUnicode_EncodeUnicodeEscape()

    • PyUnicode_EncodeRawUnicodeEscape()

    • PyUnicode_EncodeCharmap()

    • PyUnicode_TranslateCharmap()

    • PyUnicode_EncodeDecimal()

    • PyUnicode_TransformDecimalToASCII()

    Se PEP 624 för detaljer och migrationsvägledning. (Bidrag från Inada Naoki i bpo-44029.)

Viktiga ändringar i 3.11.4

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.)

Viktiga ändringar i 3.11.5

OpenSSL

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