Vad är nytt i Python 3.7

Redigerare:

Elvis Pranskevichus <elvis@magic.io>

I den här artikeln förklaras de nya funktionerna i Python 3.7 jämfört med 3.6. Python 3.7 släpptes den 27 juni 2018. För fullständig information, se changelog.

Sammanfattning – Release Highlights

Nya syntaxfunktioner:

  • PEP 563, uppskjuten utvärdering av typannoteringar.

Bakåtkompatibla syntaxändringar:

Nya biblioteksmoduler:

Nya inbyggda funktioner:

Förbättringar av Python-datamodellen:

  • PEP 562, anpassning av åtkomst till modulattribut.

  • PEP 560, kärnstöd för typning av moduler och generiska typer.

  • bevarandet av insättningsordning för dict-objekt has been declared vara en officiell del av Pythons språkspecifikation.

Betydande förbättringar i standardbiblioteket:

Förbättringar av CPython-implementeringen:

Förbättringar av C API:

  • PEP 539, nytt C API för trådlokal lagring

Förbättringar av dokumentationen:

Denna utgåva innehåller betydande prestandaförbättringar inom många områden. Avsnittet Optimeringar listar dem i detalj.

För en lista över ändringar som kan påverka kompatibiliteten med tidigare Python-utgåvor, se avsnittet Portning till Python 3.7.

Nya funktioner

PEP 563: Uppskjuten utvärdering av annoteringar

Tillkomsten av typtips i Python avslöjade två uppenbara användbarhetsproblem med funktionaliteten för anteckningar som lades till i PEP 3107 och förfinades ytterligare i PEP 526:

  • annoteringar kunde bara använda namn som redan fanns tillgängliga i det aktuella området, med andra ord stödde de inte framåtriktade referenser av något slag; och

  • annotera källkod hade negativa effekter på starttiden för Python-program.

Båda dessa problem åtgärdas genom att utvärderingen av annoteringar skjuts upp. Istället för att kompilera kod som exekverar uttryck i annotationer vid deras definitionstid lagrar kompilatorn annotationen i en strängform som motsvarar AST för uttrycket i fråga. Om det behövs kan annotationer lösas vid körning med typing.get_type_hints(). I det vanliga fallet där detta inte krävs är annotationerna billigare att lagra (eftersom korta strängar internaliseras av tolken) och gör starttiden snabbare.

När det gäller användbarhet stöder annoteringar nu framåtriktade referenser, vilket gör följande syntax giltig:

klass C:
    @klassmetod
    def from_string(cls, source: str) -> C:
        ...

    def validate_b(self, obj: B) -> bool:
        ...

klass B:
    ...

Eftersom denna ändring bryter kompatibiliteten måste det nya beteendet aktiveras per modul i Python 3.7 med hjälp av en __future__ import:

från __future__ importera anteckningar

Det kommer att bli standard i Python 3.10.

Se även

PEP 563 – Uppskjuten utvärdering av annoteringar

PEP skrivet och genomfört av Łukasz Langa.

PEP 538: Legacy C Locale-tvång

En pågående utmaning inom Python 3-serien har varit att fastställa en förnuftig standardstrategi för hantering av textkodningsantagandet ”7-bitars ASCII” som för närvarande impliceras av användningen av standard C- eller POSIX-locale på icke-Windows-plattformar.

PEP 538 uppdaterar standardtolkens kommandoradsgränssnitt för att automatiskt tvinga den lokala till en tillgänglig UTF-8-baserad lokal enligt beskrivningen i dokumentationen för den nya miljövariabeln PYTHONCOERCECLOCALE. Att automatiskt ställa in LC_CTYPE på det här sättet innebär att både kärntolken och C-tillägg med lokalmedvetenhet (t.ex. readline) kommer att anta att UTF-8 används som standardtextkodning, i stället för ASCII.

Definitionen av plattformsstöd i PEP 11 har också uppdaterats för att begränsa stödet för fulltexthantering till lämpligt konfigurerade icke-ASCII-baserade lokalspråk.

Som en del av den här ändringen är standardfelhanteraren för stdin och stdout nu surrogateescape (i stället för strict) när någon av de definierade coercion-mållokalerna används (för närvarande C.UTF-8, C.utf8 och UTF-8). Standardfelhanteraren för stderr fortsätter att vara backslashreplace, oavsett språkdräkt.

Locale coercion är tyst som standard, men för att hjälpa till att felsöka potentiellt locale-relaterade integrationsproblem, kan explicita varningar (emitteras direkt på stderr) begäras genom att ställa in PYTHONCOERCECLOCALE=warn. Denna inställning kommer också att få Pythons körtid att avge en varning om den äldre C-localen förblir aktiv när kärntolken initieras.

Medan PEP 538:s locale coercion har fördelen att även påverka tilläggsmoduler (som GNU readline), liksom barnprocesser (inklusive de som kör icke-Python-applikationer och äldre versioner av Python), har det nackdelen att det kräver att en lämplig mål locale finns på det körande systemet. För att bättre hantera fallet där ingen lämplig mållokal finns tillgänglig (som till exempel på RHEL/CentOS 7), implementerar Python 3.7 också PEP 540: Tvingat UTF-8-läge för körtid.

Se även

PEP 538 – Omvandling av den gamla C-localen till en UTF-8-baserad locale

PEP skrivet och genomfört av Nick Coghlan.

PEP 540: Tvingat UTF-8-läge för körtid

Den nya kommandoradsoptionen -X utf8 och miljövariabeln PYTHONUTF8 kan användas för att aktivera Python UTF-8 Mode.

I UTF-8-läge ignorerar CPython locale-inställningarna och använder UTF-8-kodning som standard. Felhanteringen för strömmarna sys.stdin och sys.stdout är inställd på surrogateescape.

Det påtvingade UTF-8-läget kan användas för att ändra texthanteringsbeteendet i en inbäddad Python-tolk utan att ändra locale-inställningarna i en inbäddad applikation.

Medan PEP 540:s UTF-8-läge har fördelen att fungera oavsett vilka lokala som finns tillgängliga på det system som körs, har det nackdelen att det inte har någon effekt på tilläggsmoduler (som GNU readline), barnprocesser som kör icke-Python-applikationer och barnprocesser som kör äldre versioner av Python. För att minska risken för att korrumpera textdata när man kommunicerar med sådana komponenter implementerar Python 3.7 även PEP 540: Tvingat UTF-8-läge för körtid).

UTF-8-läget är aktiverat som standard när locale är C eller POSIX, och funktionen PEP 538 locale coercion misslyckas med att ändra det till ett UTF-8-baserat alternativ (oavsett om misslyckandet beror på att PYTHONCOERCECLOCALE=0 har angetts, LC_ALL har angetts eller att det saknas en lämplig mål locale).

Se även

PEP 540 – Lägg till ett nytt UTF-8-läge

PEP skrivet och implementerat av Victor Stinner

PEP 553: Inbyggd breakpoint()

Python 3.7 innehåller den nya inbyggda funktionen breakpoint() som ett enkelt och konsekvent sätt att komma in i Pythons felsökare.

Inbyggda breakpoint() anropar sys.breakpointhook(). Som standard importerar den senare pdb och anropar sedan pdb.set_trace(), men genom att binda sys.breakpointhook() till den funktion du väljer kan breakpoint() komma in i vilken felsökare som helst. Dessutom kan miljövariabeln PYTHONBREAKPOINT sättas till den anropbara funktionen för den felsökare du väljer. Ställ in PYTHONBREAKPOINT=0 för att helt inaktivera inbyggd breakpoint().

Se även

PEP 553 – Inbyggd brytpunkt()

PEP skrivet och genomfört av Barry Warsaw

PEP 539: Nytt C API för trådlokal lagring

Medan Python tillhandahåller ett C API för stöd för trådlokal lagring, har det befintliga Thread Local Storage (TLS) API använt int för att representera TLS-nycklar på alla plattformar. Detta har i allmänhet inte varit något problem för plattformar med officiellt stöd, men det är varken POSIX-kompatibelt eller portabelt i någon praktisk mening.

PEP 539 ändrar detta genom att tillhandahålla ett nytt Thread Specific Storage (TSS) API till CPython som ersätter användningen av det befintliga TLS API inom CPython-tolken, samtidigt som det befintliga API:et avskrivs. TSS API använder en ny typ Py_tss_t istället för int för att representera TSS-nycklar - en opak typ vars definition kan bero på den underliggande TLS-implementeringen. Därför kommer detta att göra det möjligt att bygga CPython på plattformar där den inbyggda TLS-nyckeln definieras på ett sätt som inte säkert kan kastas till int.

Observera att på plattformar där den ursprungliga TLS-nyckeln är definierad på ett sätt som inte säkert kan kastas till int, kommer alla funktioner i det befintliga TLS API:et att vara no-op och omedelbart returnera fel. Detta indikerar tydligt att det gamla API:et inte stöds på plattformar där det inte kan användas på ett tillförlitligt sätt och att inga ansträngningar kommer att göras för att lägga till sådant stöd.

Se även

PEP 539 – Ett nytt C-API för trådlokal lagring i CPython

PEP skriven av Erik M. Bray; implementation av Masayuki Yamamoto.

PEP 562: Anpassning av åtkomst till modulattribut

Python 3.7 tillåter att definiera __getattr__() på moduler och kommer att anropa den när ett modulattribut annars inte hittas. Det är nu också tillåtet att definiera __dir__() på moduler.

Ett typiskt exempel på när detta kan vara användbart är depreciering av modulattribut och latent laddning.

Se även

PEP 562 – Modulerna __getattr__ och __dir__

PEP skrivet och implementerat av Ivan Levkivskyi

PEP 564: Nya tidsfunktioner med nanosekundupplösning

Upplösningen hos klockor i moderna system kan överstiga den begränsade precisionen hos ett flyttalstal som returneras av funktionen time.time() och dess varianter. För att undvika förlust av precision lägger PEP 564 till sex nya ”nanosekund”-varianter av de befintliga timerfunktionerna till modulen time:

De nya funktionerna returnerar antalet nanosekunder som ett heltalsvärde.

Mätningar visar att på Linux och Windows är upplösningen för time.time_ns() ungefär 3 gånger bättre än för time.time().

Se även

PEP 564 – Lägg till nya tidsfunktioner med nanosekundupplösning

PEP skrivet och implementerat av Victor Stinner

PEP 565: Visa DeprecationWarning i __main__

Standardhanteringen av DeprecationWarning har ändrats så att dessa varningar återigen visas som standard, men endast när koden som utlöser dem körs direkt i modulen __main__. Som ett resultat bör utvecklare av skript med en enda fil och de som använder Python interaktivt återigen börja se varningar om föråldring för de API:er de använder, men varningar om föråldring som utlöses av importerade program-, biblioteks- och ramverksmoduler kommer att fortsätta att vara dolda som standard.

Som ett resultat av den här ändringen kan utvecklare i standardbiblioteket nu välja mellan tre olika varningsbeteenden för utdatering:

  • FutureWarning: visas alltid som standard, rekommenderas för varningar som är avsedda att ses av programmets slutanvändare (t.ex. för borttagna konfigurationsinställningar för programmet).

  • DeprecationWarning: visas som standard endast i __main__ och när tester körs, rekommenderas för varningar som är avsedda att ses av andra Python-utvecklare där en versionsuppgradering kan leda till ändrat beteende eller ett fel.

  • PendingDeprecationWarning: visas som standard endast när tester körs, avsedd för fall där en framtida versionsuppgradering kommer att ändra varningskategorin till DeprecationWarning eller FutureWarning.

Tidigare var både DeprecationWarning och PendingDeprecationWarning endast synliga när man körde tester, vilket innebar att utvecklare som främst skrev skript i en enda fil eller använde Python interaktivt kunde överraskas av stora förändringar i de API:er de använde.

Se även

PEP 565 – Visa DeprecationWarning i __main__

PEP skrivet och implementerat av Nick Coghlan

PEP 560: Core-stöd för modulen typing och generiska typer

Ursprungligen var PEP 484 utformad på ett sådant sätt att den inte skulle införa några ändringar i CPython-tolkens kärna. Nu används typtips och modulen typing i stor utsträckning av gemenskapen, så denna begränsning har tagits bort. PEP introducerar två speciella metoder __class_getitem__() och __mro_entries__, dessa metoder används nu av de flesta klasser och speciella konstruktioner i typing. Som ett resultat av detta har hastigheten för olika operationer med typer ökat upp till 7 gånger, de generiska typerna kan användas utan metaklasskonflikter och flera långvariga buggar i modulen typing har åtgärdats.

Se även

PEP 560 – Kärnstöd för typning av moduler och generiska typer

PEP skrivet och implementerat av Ivan Levkivskyi

PEP 552: Hash-baserade .pyc-filer

Python har traditionellt kontrollerat aktualiteten hos bytecode-cachefiler (dvs. .pyc-filer) genom att jämföra källmetadata (senast modifierade tidsstämpel och storlek) med källmetadata som sparats i cachefilens huvud när den genererades. Även om denna ogiltighetsmetod är effektiv har den sina nackdelar. När filsystemets tidsstämplar är för grova kan Python missa källuppdateringar, vilket leder till förvirring hos användaren. Att ha en tidsstämpel i cachefilen är dessutom problematiskt för reproducerbarhet i byggandet och innehållsbaserade byggsystem.

PEP 552 utökar pyc-formatet så att hashvärdet för källfilen kan användas för ogiltigförklaring istället för källfilens tidsstämpel. Sådana .pyc-filer kallas ”hashbaserade”. Som standard använder Python fortfarande tidsstämpelbaserad ogiltigförklaring och genererar inte hashbaserade .pyc-filer vid körning. Hash-baserade .pyc-filer kan genereras med py_compile eller compileall.

Hash-baserade .pyc-filer finns i två varianter: kontrollerade och okontrollerade. Python validerar kontrollerade hash-baserade .pyc-filer mot motsvarande källfiler vid körning, men gör inte detta för okontrollerade hash-baserade pyc-filer. Okontrollerade hash-baserade .pyc-filer är en användbar prestandaoptimering för miljöer där ett system utanför Python (t.ex. byggsystemet) ansvarar för att hålla .pyc-filer uppdaterade.

Se Inaktivering av cachad bytekod för mer information.

Se även

PEP 552 – Deterministisk pycs

PEP skrivet och implementerat av Benjamin Peterson

PEP 545: Översättning av Python-dokumentationen

PEP 545 beskriver processen för att skapa och underhålla översättningar av Python-dokumentationen.

Tre nya översättningar har lagts till:

Se även

PEP 545 – Översättningar av Python-dokumentationen

PEP skrivet och implementerat av Julien Palard, Inada Naoki och Victor Stinner.

Python-utvecklingsläge (-X dev)

Det nya kommandoradsalternativet -X dev eller den nya miljövariabeln PYTHONDEVMODE kan användas för att aktivera Python Development Mode. I utvecklingsläget utför Python ytterligare körtidskontroller som är för dyra för att aktiveras som standard. Se Python Development Mode dokumentation för en fullständig beskrivning.

Andra språkliga förändringar

  • Ett await-uttryck och förståelser som innehåller en async for-klausul var olagliga i uttrycken i formaterade stränglitteraler på grund av ett problem med implementationen. I Python 3.7 togs denna begränsning bort.

  • Fler än 255 argument kan nu skickas till en funktion, och en funktion kan nu ha fler än 255 parametrar. (Bidrag från Serhiy Storchaka i bpo-12844 och bpo-18896.)

  • bytes.fromhex() och bytearray.fromhex() ignorerar nu alla ASCII-teckensnitt, inte bara blanksteg. (Bidrag från Robert Xiao i bpo-28927.)

  • str, bytes och bytearray har fått stöd för den nya metoden isascii(), som kan användas för att testa om en sträng eller bytes endast innehåller ASCII-tecken. (Bidrag från INADA Naoki i bpo-32677.)

  • ImportError visar nu modulnamn och modulens __file__ sökväg när from ... import ... misslyckas. (Bidrag från Matthias Bussonnier i bpo-29546.)

  • Cirkulär import som involverar absolut import med bindning av en undermodul till ett namn stöds nu. (Bidrag från Serhiy Storchaka i bpo-30024.)

  • object.__format__(x, '') är nu likvärdigt med str(x) snarare än format(str(self), ''). (Bidrag från Serhiy Storchaka i bpo-28974.)

  • För att bättre stödja dynamiskt skapande av stackspår kan types.TracebackType nu instansieras från Python-kod, och attributet tb_nexttracebacks är nu skrivbart. (Bidrag från Nathaniel J. Smith i bpo-30579.)

  • När du använder -m switch, sys.path[0] är nu ivrigt utökad till hela startkatalogens sökväg, snarare än att lämnas som den tomma katalogen (vilket tillåter import från den aktuella arbetskatalogen vid den tidpunkt då en import inträffar) (Bidrag från Nick Coghlan i bpo-33053.)

  • Det nya alternativet -X importtime eller miljövariabeln PYTHONPROFILEIMPORTTIME kan användas för att visa tidpunkten för varje modulimport. (Bidrag från Inada Naoki i bpo-31415.)

Nya moduler

kontextvarianter

Den nya modulen contextvars och en uppsättning nya C API:er introducerar stöd för kontextvariabler. Kontextvariabler är konceptuellt lika trådlokala variabler. Till skillnad från TLS stöder kontextvariabler asynkron kod på ett korrekt sätt.

Modulerna asyncio och decimal har uppdaterats för att använda och stödja kontextvariabler direkt från start. Framför allt lagras nu den aktiva decimalkontexten i en kontextvariabel, vilket gör att decimaloperationer kan utföras med rätt kontext i asynkron kod.

Se även

PEP 567 – Kontextvariabler

PEP skrivet och implementerat av Yury Selivanov

dataklasser

Den nya dataclass()-dekoratorn ger ett sätt att deklarera dataklasser. En dataklass beskriver sina attribut med hjälp av klassvariabelannoteringar. Dess konstruktor och andra magiska metoder, t.ex. __repr__(), __eq__() och __hash__() genereras automatiskt.

Exempel:

@dataklass
klass Punkt:
    x: float
    y: float
    z: float = 0,0

p = Punkt(1,5, 2,5)
print(p) # ger "Punkt(x=1,5, y=2,5, z=0,0)"

Se även

PEP 557 – Dataklasser

PEP skrivet och implementerat av Eric V. Smith

importlib.resurser

Den nya modulen importlib.resources tillhandahåller flera nya API:er och en ny ABC för åtkomst till, öppning och läsning av resurser inuti paket. Resurser liknar i stort sett filer i paket, men de behöver inte vara faktiska filer i det fysiska filsystemet. Modulladdare kan tillhandahålla en get_resource_reader()-funktion som returnerar en importlib.abc.ResourceReader-instans för att stödja detta nya API. Inbyggda filvägsladdare och zip-filladdare stöder båda detta.

Bidrag från Barry Warsaw och Brett Cannon i bpo-32248.

Se även

importlib_resources – en PyPI-backport för tidigare Python-versioner.

Förbättrade moduler

argparse

Den nya metoden ArgumentParser.parse_intermixed_args() gör det möjligt att blanda alternativ och positionella argument. (Bidrag från paul.j3 i bpo-14191.)

asyncio

Modulen asyncio har fått många nya funktioner, användbarhets- och prestandaförbättringar. Anmärkningsvärda ändringar inkluderar:

Flera asyncio API:er har blivit deprecated.

binascii

Funktionen b2a_uu() accepterar nu ett valfritt backtick nyckelordsargument. När det är sant representeras nollor av '`' istället för mellanslag. (Bidrag från Xiang Zhang i bpo-30103.)

kalender

Klassen HTMLCalendar har nya klassattribut som underlättar anpassningen av CSS-klasser i den HTML-kalender som produceras. (Bidrag från Oz Tiram i bpo-30095.)

samlingar

collections.namedtuple() stöder nu standardvärden. (Bidrag från Raymond Hettinger i bpo-32320.)

compileall

compileall.compile_dir() fick den nya parametern invalidation_mode, som kan användas för att aktivera hash-baserad .pyc-invalidering. Invalideringsläget kan också anges på kommandoraden med det nya argumentet --invalidation-mode. (Bidrag från Benjamin Peterson i bpo-31650.)

concurrent.futures

ProcessPoolExecutor och ThreadPoolExecutor stöder nu de nya initializer och initargs konstruktorargumenten. (Bidrag från Antoine Pitrou i bpo-21423.)

ProcessPoolExecutor kan nu ta multiprocessing-kontexten via det nya argumentet mp_context. (Bidrag från Thomas Moreau i bpo-31540.)

contextlib

Den nya nullcontext() är en enklare och snabbare no-op kontexthanterare än ExitStack. (Bidrag från Jesse-Bakker i bpo-10049.)

De nya asynccontextmanager(), AbstractAsyncContextManager, och AsyncExitStack har lagts till för att komplettera deras synkrona motsvarigheter. (Bidrag från Jelle Zijlstra i bpo-29679 och bpo-30241, samt från Alexander Mohr och Ilya Kulakov i bpo-29302.)

cProfil

Kommandoraden cProfile accepterar nu -m module_name som ett alternativ till skriptsökvägen. (Bidrag från Sanyam Khurana i bpo-21862.)

kryptan

Modulen crypt har nu stöd för hashmetoden Blowfish. (Bidrag från Serhiy Storchaka i bpo-31664.)

Funktionen mksalt() tillåter nu att man anger antalet rundor för hashing. (Bidrag från Serhiy Storchaka i bpo-31702.)

datatid

Den nya metoden datetime.fromisoformat() konstruerar ett datetime-objekt från en sträng i ett av de format som matas ut av datetime.isoformat(). (Bidrag från Paul Ganssle i bpo-15873.)

Klassen tzinfo har nu stöd för förskjutningar under minuten. (Bidrag från Alexander Belopolsky i bpo-5288.)

dbm

dbm.dumb stöder nu läsning av skrivskyddade filer och skriver inte längre indexfilen när den inte har ändrats.

decimal

Modulen decimal använder nu kontextvariabler för att lagra decimalkontexten. (Bidrag från Yury Selivanov i bpo-32630.)

dis

Funktionen dis() kan nu demontera nästlade kodobjekt (koden för förståelser, generatoruttryck och nästlade funktioner samt koden som används för att bygga nästlade klasser). Det maximala djupet för demonteringens rekursion styrs av den nya parametern depth. (Bidrag från Serhiy Storchaka i bpo-11822.)

distutils

README.rst ingår nu i listan över distutils standard README:er och ingår därför i källkodsdistributioner. (Bidrag från Ryan Gonzalez i bpo-11913.)

enum

Enum lärde sig den nya klassegenskapen _ignore_, som gör det möjligt att lista namnen på egenskaper som inte bör bli enum-medlemmar. (Bidrag från Ethan Furman i bpo-31801.)

I Python 3.8 kommer försök att kontrollera för icke-Enum-objekt i Enum-klasser att ge upphov till ett TypeError (t.ex. 1 in Color); på samma sätt kommer försök att kontrollera för icke-Flag-objekt i en Flag-medlem att ge upphov till TypeError (t.ex. 1 in Perm.RW); för närvarande returnerar båda operationerna False istället och är föråldrade. (Bidrag från Ethan Furman i bpo-33217.)

functools

functools.singledispatch() stöder nu registrering av implementationer med hjälp av typannoteringar. (Bidrag från Łukasz Langa i bpo-32227.)

gc

Den nya gc.freeze()-funktionen gör det möjligt att frysa alla objekt som spåras av skräpsamlaren och utesluta dem från framtida insamlingar. Detta kan användas före ett POSIX fork()-anrop för att göra GC copy-on-write vänlig eller för att påskynda insamlingen. Den nya gc.unfreeze() funktionen reverserar denna operation. Dessutom kan gc.get_freeze_count() användas för att få fram antalet frysta objekt. (Bidrag från Li Zekun i bpo-31558.)

hmac

Modulen hmac har nu en optimerad one-shot-funktion digest(), som är upp till tre gånger snabbare än HMAC(). (Bidrag från Christian Heimes i bpo-32433.)

http.klient

HTTPConnection och HTTPSConnection stöder nu det nya argumentet blocksize för förbättrad uppladdningskapacitet. (Bidrag från Nir Soffer i bpo-31945.)

http.server

SimpleHTTPRequestHandler har nu stöd för HTTP-huvudet If-Modified-Since. Servern returnerar svarsstatus 304 om målfilen inte har modifierats efter den tid som anges i rubriken. (Bidrag från Pierre Quentel i bpo-29654.)

SimpleHTTPRequestHandler accepterar det nya argumentet directory, utöver det nya kommandoradsargumentet --directory. Med denna parameter använder servern den angivna katalogen, som standard används den aktuella arbetskatalogen. (Bidrag från Stéphane Wirtel och Julien Palard i bpo-28707.)

Den nya ThreadingHTTPServer-klassen använder trådar för att hantera förfrågningar med ThreadingMixin. Den används när http.server körs med -m. (Bidrag från Julien Palard i bpo-31639.)

idlelib och IDLE

Flera korrigeringar för autokomplettering. (Bidrag från Louie Lu i bpo-15786.)

Modulbläddraren (på Arkiv-menyn, tidigare kallad Klassbläddraren) visar nu nästlade funktioner och klasser utöver funktioner och klasser på toppnivå. (Bidrag från Guilherme Polo, Cheryl Sabella och Terry Jan Reedy i bpo-1612262.)

Dialogrutan Inställningar (Alternativ, Konfigurera IDLE) har delvis skrivits om för att förbättra både utseende och funktion. (Bidrag från Cheryl Sabella och Terry Jan Reedy i flera utgåvor)

Teckensnittsexemplet innehåller nu ett urval av icke-latinska tecken så att användarna bättre kan se effekten av att välja ett visst teckensnitt. (Bidrag från Terry Jan Reedy i bpo-13802.) Exemplet kan redigeras för att inkludera andra tecken. (Bidrag från Serhiy Storchaka i bpo-31860.)

De IDLE-funktioner som tidigare implementerades som tillägg har nu implementerats som vanliga funktioner. Deras inställningar har flyttats från fliken Extensions till andra dialogflikar. (Bidrag från Charles Wohlganger och Terry Jan Reedy i bpo-27099.)

Redigeringsalternativet för kodkontext reviderat. Rutan visar alla kontextlinjer upp till maxlinjer. Om du klickar på en kontextlinje hoppar redigeraren till den linjen. Kontextfärger för anpassade teman har lagts till på fliken Höjdpunkter i dialogrutan Inställningar. (Bidrag från Cheryl Sabella och Terry Jan Reedy i bpo-33642, bpo-33768, och bpo-33679.)

I Windows säger ett nytt API-anrop till Windows att tk skalar för DPI. På Windows 8.1+ eller 10, med oförändrade DPI-kompatibilitetsegenskaper för Python-binären och en skärmupplösning som är större än 96 DPI, bör detta göra text och linjer skarpare. I övrigt bör det inte ha någon effekt. (Bidrag från Terry Jan Reedy i bpo-33656.)

Nytt i 3.7.1:

Utdata över N rader (50 som standard) pressas ner till en knapp. N kan ändras i avsnittet PyShell på sidan Allmänt i dialogrutan Inställningar. Färre, men eventuellt extra långa, rader kan pressas genom att högerklicka på utmatningen. Pressad utdata kan expanderas på plats genom att dubbelklicka på knappen eller till urklippet eller ett separat fönster genom att högerklicka på knappen. (Bidrag från Tal Einat i bpo-1529353.)

Ändringarna ovan har backporterats till underhållsversionerna av 3.6.

NYHET i 3.7.4:

Lägg till ”Run Customized” i Run-menyn för att köra en modul med anpassade inställningar. Alla kommandoradsargument som anges läggs till i sys.argv. De visas igen i rutan för nästa anpassade körning. Man kan också undertrycka den normala omstarten av Shell-huvudmodulen. (Bidrag från Cheryl Sabella, Terry Jan Reedy och andra i bpo-5680 och bpo-37627.)

Nytt i 3.7.5:

Lägg till valfria radnummer för IDLE-redigerarens fönster. Fönster öppnas utan radnummer om inget annat anges på fliken Allmänt i konfigurationsdialogrutan. Radnummer för ett befintligt fönster visas och döljs i menyn Alternativ. (Bidrag från Tal Einat och Saimadhav Heblikar i bpo-17535.)

importlib

ABC:s importlib.abc.ResourceReader introducerades för att stödja inläsning av resurser från paket. Se även importlib.resurser. (Bidrag från Barry Warsaw, Brett Cannon i bpo-32248.)

importlib.reload() ger nu upphov till ModuleNotFoundError om modulen saknar specifikation. (Bidrag från Garvit Khatri i bpo-29851.)

importlib.find_spec() ger nu upphov till ModuleNotFoundError istället för AttributeError om den angivna överordnade modulen inte är ett paket (dvs. saknar attributet __path__). (Bidrag från Milan Oberkirch i bpo-30436.)

Den nya importlib.source_hash() kan användas för att beräkna hashvärdet för den angivna källan. En hashbaserad .pyc-fil bäddar in det värde som returneras av denna funktion.

io

Den nya TextIOWrapper.reconfigure()-metoden kan användas för att konfigurera om textflödet med de nya inställningarna. (Bidrag från Antoine Pitrou i bpo-30526 och INADA Naoki i bpo-15216.)

ipadress

De nya metoderna subnet_of() och supernet_of() i ipaddress.IPv6Network och ipaddress.IPv4Network kan användas för tester av nätverksbegränsning. (Bidrag från Michel Albert och Cheryl Sabella i bpo-20825.)

itertools

itertools.islice() accepterar nu integerliknande objekt som start-, stopp- och slice-argument. (Bidrag från Will Roberts i bpo-30537.)

lokal

Det nya monetary-argumentet till locale.format_string() kan användas för att få konverteringen att använda monetära tusentalsavgränsare och grupperingssträngar. (Bidrag från Garvit i bpo-10379.)

Funktionen locale.getpreferredencoding() returnerar nu alltid 'UTF-8' på Android eller i forced UTF-8 mode.

loggning

Logger-instanser kan nu picklas. (Bidrag från Vinay Sajip i bpo-30520.)

Den nya StreamHandler.setStream() metoden kan användas för att ersätta loggerströmmen efter att hanteraren skapats. (Bidrag från Vinay Sajip i bpo-30522.)

Det är nu möjligt att ange nyckelordsargument till hanterarkonstruktörer i konfigurationen som skickas till logging.config.fileConfig(). (Bidrag från Preston Landers i bpo-31080.)

matematik

Den nya funktionen math.remainder() implementerar remainder-operationen i IEEE 754-stil. (Bidrag från Mark Dickinson i bpo-29962.)

mimetyper

MIME-typen för .bmp har ändrats från 'image/x-ms-bmp' till 'image/bmp'. (Bidrag från Nitish Chandra i bpo-22589.)

msilib

Den nya metoden Database.Close() kan användas för att stänga databasen MSI. (Bidrag från Berker Peksag i bpo-20486.)

multiprocessing

Den nya Process.close()-metoden stänger explicit processobjektet och frigör alla resurser som är associerade med det. ValueError tas upp om den underliggande processen fortfarande körs. (Bidrag från Antoine Pitrou i bpo-30596.)

Den nya metoden Process.kill() kan användas för att avsluta processen med hjälp av signalen SIGKILL på Unix. (Bidrag från Vitor Pereira i bpo-30794.)

Icke-daemoniska trådar som skapats av Process sammanfogas nu när processen avslutas. (Bidrag från Antoine Pitrou i bpo-18966.)

os

os.fwalk() accepterar nu argumentet path som bytes. (Bidrag från Serhiy Storchaka i bpo-28682.)

os.scandir() fick stöd för file descriptors. (Bidrag från Serhiy Storchaka i bpo-25996.)

Den nya funktionen register_at_fork() gör det möjligt att registrera Python-anrop som ska köras vid processgaffeln. (Bidrag från Antoine Pitrou i bpo-16500.)

Lagt till funktionerna os.preadv() (kombinerar funktionaliteten hos os.readv() och os.pread()) och os.pwritev() (kombinerar funktionaliteten hos os.writev() och os.pwrite()). (Bidrag från Pablo Galindo i bpo-31368.)

Lägesargumentet i os.makedirs() påverkar inte längre filbehörighetsbitarna för nyskapade kataloger på mellannivå. (Bidrag från Serhiy Storchaka i bpo-19930.)

os.dup2() returnerar nu den nya filbeskrivaren. Tidigare returnerades alltid None. (Bidrag från Benjamin Peterson i bpo-32441.)

Strukturen som returneras av os.stat() innehåller nu attributet st_fstype på Solaris och dess derivat. (Bidrag från Jesús Cea Avión i bpo-32659.)

sökväg

Den nya Path.is_mount()-metoden är nu tillgänglig på POSIX-system och kan användas för att avgöra om en sökväg är en monteringspunkt. (Bidrag från Cooper Ry Lees i bpo-30897.)

pdb

pdb.set_trace() tar nu ett valfritt header argument som endast innehåller nyckelord. Om det anges skrivs det ut till konsolen precis innan felsökningen börjar. (Bidrag från Barry Warsaw i bpo-31389.)

kommandoraden pdb accepterar nu -m modulnamn som ett alternativ till skriptfil. (Bidrag från Mario Corchero i bpo-32206.)

py_kompilera

py_compile.compile() – och i förlängningen compileall – respekterar nu miljövariabeln SOURCE_DATE_EPOCH genom att ovillkorligen skapa .pyc-filer för hashbaserad validering. Detta gör det möjligt att garantera reproducerbara uppbyggnader av .pyc-filer när de skapas ivrigt. (Bidrag från Bernhard M. Wiedemann i bpo-29708.)

pydoc

Pydoc-servern kan nu binda till ett godtyckligt värdnamn som anges med det nya kommandoradsargumentet -n. (Bidrag från Feanil Patel i bpo-31128.)

Den nya SimpleQueue-klassen är en obegränsad FIFO-kö. (Bidrag från Antoine Pitrou i bpo-14976.)

re

Flaggorna re.ASCII, re.LOCALE och re.UNICODE kan sättas inom en grupps scope. (Bidrag från Serhiy Storchaka i bpo-31690.)

re.split() stöder nu uppdelning på ett mönster som r'\b', '^$' eller (?=-) som matchar en tom sträng. (Bidrag från Serhiy Storchaka i bpo-25054.)

Reguljära uttryck som kompileras med flaggan re.LOCALE är inte längre beroende av språkdräkten vid kompileringstillfället. Lokalinställningar tillämpas endast när det kompilerade reguljära uttrycket används. (Bidrag från Serhiy Storchaka i bpo-30215.)

FutureWarning sänds nu ut om ett reguljärt uttryck innehåller teckenuppsättningskonstruktioner som kommer att förändras semantiskt i framtiden, t.ex. nästlade uppsättningar och uppsättningsoperationer. (Bidrag från Serhiy Storchaka i bpo-30349.)

Kompilerade reguljära uttryck och matchningsobjekt kan nu kopieras med hjälp av copy.copy() och copy.deepcopy(). (Bidrag från Serhiy Storchaka i bpo-10076.)

signal

Det nya argumentet warn_on_full_buffer till funktionen signal.set_wakeup_fd() gör det möjligt att ange om Python ska skriva ut en varning på stderr när wakeup-bufferten svämmar över. (Bidrag från Nathaniel J. Smith i bpo-30050.)

kortplats

Den nya metoden socket.getblocking() returnerar True om uttaget är i blockeringsläge och False annars. (Bidrag från Yury Selivanov i bpo-32373.)

Den nya socket.close()-funktionen stänger den passerade socket-filbeskrivaren. Denna funktion bör användas istället för os.close() för bättre kompatibilitet mellan olika plattformar. (Bidrag från Christian Heimes i bpo-32454.)

Modulen socket exponerar nu konstanterna socket.TCP_CONGESTION (Linux 2.6.13), socket.TCP_USER_TIMEOUT (Linux 2.6.37) och socket.TCP_NOTSENT_LOWAT (Linux 3.12). (Bidrag från Omar Sandoval i bpo-26273 och Nathaniel J. Smith i bpo-29728.)

Stöd för socket.AF_VSOCK-sockets har lagts till för att möjliggöra kommunikation mellan virtuella maskiner och deras värdar. (Bidrag från Cathy Avery i bpo-27584.)

Sockets känner nu automatiskt av familj, typ och protokoll från filbeskrivaren som standard. (Bidrag från Christian Heimes i bpo-28134.)

socketserver

socketserver.ThreadingMixIn.server_close() väntar nu tills alla icke-dämontrådar har avslutats. socketserver.ForkingMixIn.server_close() väntar nu tills alla barnprocesser har avslutats.

Lägg till ett nytt klassattribut socketserver.ForkingMixIn.block_on_close till klasserna socketserver.ForkingMixIn och socketserver.ThreadingMixIn. Ställ in klassattributet till False för att få beteendet från före 3.7.

sqlite3

sqlite3.Connection exponerar nu metoden backup() när det underliggande SQLite-biblioteket är version 3.6.11 eller högre. (Bidrag från Lele Gaifax i bpo-27645.)

Argumentet database i sqlite3.connect() accepterar nu valfri path-like object, istället för bara en sträng. (Bidrag från Anders Lorentsen i bpo-31843.)

ssl

Modulen ssl använder nu OpenSSL:s inbyggda API i stället för match_hostname() för att kontrollera ett värdnamn eller en IP-adress. Värdena valideras under TLS-handskakningen. Alla fel i certifikatvalideringen, inklusive misslyckad kontroll av värdnamnet, ger nu upphov till SSLCertVerificationError och avbryter handskakningen med ett korrekt TLS-varningsmeddelande. Det nya undantaget innehåller ytterligare information. Validering av värdnamn kan anpassas med SSLContext.hostname_checks_common_name. (Bidrag från Christian Heimes i bpo-31399.)

Anteckning

Den förbättrade kontrollen av värdnamn kräver en libssl-implementation som är kompatibel med OpenSSL 1.0.2 eller 1.1. Följaktligen stöds inte OpenSSL 0.9.8 och 1.0.1 längre (se Flytt av plattformsstöd för mer information). Modulen ssl är mestadels kompatibel med LibreSSL 2.7.2 och nyare.

Modulen ssl skickar inte längre IP-adresser i SNI TLS-tillägg. (Bidrag från Christian Heimes i bpo-32185.)

match_hostname() stöder inte längre partiella jokertecken som www*.example.org. (Bidrag från Mandeep Singh i bpo-23033 och Christian Heimes i bpo-31399.)

Standardvalet av chiffersviter i modulen ssl använder nu en svartlistningsmetod snarare än en hårdkodad vitlista. Python återaktiverar inte längre chiffer som har blockerats av OpenSSL:s säkerhetsuppdateringar. Standardval av chiffersvit kan konfigureras vid kompileringstiden. (Bidrag från Christian Heimes i bpo-31429.)

Validering av servercertifikat som innehåller internationaliserade domännamn (IDN) stöds nu. Som en del av denna ändring lagrar attributet SSLSocket.server_hostname nu det förväntade värdnamnet i A-label-form ("xn--pythn-mua.org"), snarare än U-label-form ("pythön.org"). (Bidrag från Nathaniel J. Smith och Christian Heimes i bpo-28414.)

Modulen ssl har preliminärt och experimentellt stöd för TLS 1.3 och OpenSSL 1.1.1. Vid tidpunkten för Python 3.7.0-utgåvan är OpenSSL 1.1.1 fortfarande under utveckling och TLS 1.3 har inte slutförts ännu. TLS 1.3 handskakning och protokoll beter sig något annorlunda än TLS 1.2 och tidigare, se TLS 1.3. (Bidrag från Christian Heimes i bpo-32947, bpo-20995, bpo-29136, bpo-30622 och bpo-33618)

SSLSocket och SSLObject har inte längre någon offentlig konstruktor. Direkt instantiering var aldrig en dokumenterad och stödd funktion. Instanser måste skapas med SSLContext metoderna wrap_socket() och wrap_bio(). (Bidrag från Christian Heimes i bpo-32951)

OpenSSL 1.1 API:er för att ställa in den lägsta och högsta TLS-protokollversionen finns tillgängliga som SSLContext.minimum_version och SSLContext.maximum_version. Protokoll som stöds indikeras av flera nya flaggor, till exempel HAS_TLSv1_1. (Bidrag från Christian Heimes i bpo-32609.)

Lagt till ssl.SSLContext.post_handshake_auth för att aktivera och ssl.SSLSocket.verify_client_post_handshake() för att initiera TLS 1.3 post-handshake-autentisering. (Bidrag från Christian Heimes i gh-78851.)

sträng

string.Template låter dig nu välja att ändra det reguljära uttrycksmönstret för platshållare med och utan hakparenteser separat. (Bidrag från Barry Warsaw i bpo-1198569.)

delprocess

Funktionen subprocess.run() accepterar det nya nyckelordsargumentet capture_output. När det är sant kommer stdout och stderr att fångas. Detta är likvärdigt med att skicka subprocess.PIPE som stdout och stderr argument. (Bidrag från Bo Bayles i bpo-32102.)

Funktionen subprocess.run och konstruktören subprocess.Popen accepterar nu nyckelordsargumentet text som ett alias för universal_newlines. (Bidrag från Andrew Clegg i bpo-31756.)

I Windows ändrades standardvärdet för close_fds från False till True när standardhandtagen omdirigerades. Det är nu möjligt att sätta close_fds till true när standardhandtagen omdirigeras. Se subprocess.Popen. Detta innebär att close_fds nu har standardvärdet True på alla plattformar som stöds. (Bidrag från Segev Finer i bpo-19764.)

Subprocessmodulen är nu mer graciös när den hanterar KeyboardInterrupt under subprocess.call(), subprocess.run(), eller i en Popen kontexthanterare. Den väntar nu en kort stund på att barnet ska avsluta innan den fortsätter hanteringen av undantaget KeyboardInterrupt. (Bidrag från Gregory P. Smith i bpo-25942.)

system

Den nya sys.breakpointhook() hook-funktionen anropas av den inbyggda breakpoint(). (Bidrag från Barry Warsaw i bpo-31353.)

På Android returnerar den nya sys.getandroidapilevel() Android API-versionen under byggtiden. (Bidrag från Victor Stinner i bpo-28740.)

Den nya funktionen sys.get_coroutine_origin_tracking_depth() returnerar det aktuella spårningsdjupet för coroutine-ursprunget, som ställts in av den nya sys.set_coroutine_origin_tracking_depth(). asyncio har konverterats för att använda detta nya API istället för det föråldrade sys.set_coroutine_wrapper(). (Bidrag från Nathaniel J. Smith i bpo-32591.)

tid

PEP 564 lägger till sex nya funktioner med nanosekundupplösning till modulen time:

Nya klockidentifierare har lagts till:

  • time.CLOCK_BOOTTIME (Linux): Identisk med time.CLOCK_MONOTONIC, förutom att den även inkluderar den tid som systemet är avstängt.

  • time.CLOCK_PROF (FreeBSD, NetBSD och OpenBSD): Högupplöst CPU-timer per process.

  • time.CLOCK_UPTIME (FreeBSD, OpenBSD): Tid vars absoluta värde är den tid som systemet har varit igång och inte avbrutits, vilket ger en exakt mätning av drifttiden.

De nya funktionerna time.thread_time() och time.thread_time_ns() kan användas för att få CPU-tidsmätningar per tråd. (Bidrag från Antoine Pitrou i bpo-32025.)

Den nya funktionen time.pthread_getcpuclockid() returnerar klock-ID:t för den trådspecifika CPU-tidsklockan.

tkinter

Den nya tkinter.ttk.Spinbox-klassen är nu tillgänglig. (Bidrag från Alan Moore i bpo-32585.)

tracemalloc

tracemalloc.Traceback beter sig mer som vanliga tracebacks, och sorterar ramarna från äldst till nyast. Traceback.format() accepterar nu negativ limit, vilket trunkerar resultatet till de abs(limit) äldsta ramarna. För att få det gamla beteendet, använd det nya most_recent_first-argumentet till Traceback.format(). (Bidrag från Jesse Bakker i bpo-32121.)

typer

De nya klasserna WrapperDescriptorType, MethodWrapperType, MethodDescriptorType och ClassMethodDescriptorType är nu tillgängliga. (Bidrag från Manuel Krebber och Guido van Rossum i bpo-29377, och Serhiy Storchaka i bpo-32265.)

Den nya funktionen types.resolve_bases() löser MRO-poster dynamiskt enligt specifikationen i PEP 560. (Bidrag från Ivan Levkivskyi i bpo-32717.)

unicodedata

Den interna unicodedata-databasen har uppgraderats till att använda Unicode 11. (Bidrag från Benjamin Peterson.)

unittest

Det nya kommandoradsalternativet -k gör det möjligt att filtrera tester efter en namnundersträng eller ett Unix-skalliknande mönster. Till exempel, python -m unittest -k foo kör foo_tests.SomeTest.test_something, bar_tests.SomeTest.test_foo, men inte bar_tests.FooTest.test_something. (Bidrag från Jonas Haag i bpo-32071.)

unittest.mock

Attributen sentinel behåller nu sin identitet när de är copied eller pickled. (Bidrag från Serhiy Storchaka i bpo-20804.)

Den nya funktionen seal() gör det möjligt att försegla Mock-instanser, vilket gör det omöjligt att skapa ytterligare attributattrapper. Förseglingen tillämpas rekursivt på alla attribut som själva är mockar. (Bidrag från Mario Corchero i bpo-30541.)

urllib.parse

urllib.parse.quote() har uppdaterats från RFC 2396 till RFC 3986, genom att lägga till ~ till uppsättningen av tecken som aldrig citeras som standard. (Bidrag från Christian Theune och Ratnadeep Debnath i bpo-16285.)

uu

Funktionen uu.encode() accepterar nu ett valfritt backtick nyckelordsargument. När det är sant representeras nollor av '`' istället för mellanslag. (Bidrag från Xiang Zhang i bpo-30103.)

uuid

Det nya attributet UUID.is_safe förmedlar information från plattformen om huruvida genererade UUID:er genereras med en metod som är säker för flera processorer. (Bidrag från Barry Warsaw i bpo-22807.)

uuid.getnode() föredrar nu universellt administrerade MAC-adresser framför lokalt administrerade MAC-adresser. Detta ger en bättre garanti för global unikhet för UUID:er som returneras från uuid.uuid1(). Om endast lokalt administrerade MAC-adresser är tillgängliga returneras den första MAC-adress som hittas. (Bidrag från Barry Warsaw i bpo-32107.)

varningar

Initialiseringen av standardfiltren för varningar har ändrats på följande sätt:

  • varningar som aktiveras via kommandoradsalternativ (inklusive dem för -b och det nya CPython-specifika -X dev-alternativet) skickas alltid till varningsmaskineriet via attributet sys.warnoptions.

  • varningsfilter som aktiveras via kommandoraden eller miljön har nu följande prioritetsordning:

    • filtret BytesWarning för -b (eller -bb)

    • alla filter som anges med alternativet -W

    • alla filter som anges med miljövariabeln PYTHONWARNINGS

    • andra CPython-specifika filter (t.ex. filtret default som lagts till för det nya -X dev-läget)

    • eventuella implicita filter som definieras direkt av varningsmaskineriet

  • i CPython debug bygger, visas nu alla varningar som standard (den implicita filterlistan är tom)

(Bidrag från Nick Coghlan och Victor Stinner i bpo-20361, bpo-32043, och bpo-32230.)

Deprecation-varningar visas återigen som standard i skript med en fil och vid den interaktiva prompten. Se PEP 565: Visa DeprecationWarning i __main__ för detaljer. (Bidrag från Nick Coghlan i bpo-31975.)

xml

Som en åtgärd mot hämtning av DTD:er och externa entiteter bearbetar modulerna xml.dom.minidom och xml.sax inte längre externa entiteter som standard. (Bidrag från Christian Heimes i gh-61441.)

xml.etree

ElementPath-predikaten i find()-metoderna kan nu jämföra texten i den aktuella noden med [. = "text"], inte bara text i underordnade noder. Predikaten tillåter även tillägg av mellanslag för bättre läsbarhet. (Bidrag från Stefan Behnel i bpo-31648.)

xmlrpc.server

SimpleXMLRPCDispatcher.register_function kan nu användas som en dekorator. (Bidrag från Xiang Zhang i bpo-7769.)

zipapp

Funktionen create_archive() accepterar nu ett valfritt filter-argument så att användaren kan välja vilka filer som ska ingå i arkivet. (Bidrag från Irmen de Jong i bpo-31072.)

Funktionen create_archive() accepterar nu ett valfritt compressed-argument för att generera ett komprimerat arkiv. Ett kommandoradsalternativ --compress har också lagts till för att stödja komprimering. (Bidrag från Zhiming Wang i bpo-31638.)

zip-fil

ZipFile accepterar nu den nya parametern compresslevel för att styra komprimeringsnivån. (Bidrag från Bo Bayles i bpo-21417.)

Underkataloger i arkiv som skapats av ZipFile lagras nu i alfabetisk ordning. (Bidrag från Bernhard M. Wiedemann i bpo-30693.)

Ändringar i C API

Ett nytt API för trådlokal lagring har implementerats. Se PEP 539: Nytt C API för trådlokal lagring för en översikt och API för trådspecifik lagring (TSS) för en fullständig referens. (Bidrag från Masayuki Yamamoto i bpo-25658.)

Den nya kontextvariabler-funktionaliteten exponerar ett antal nya C API:er.

Den nya funktionen PyImport_GetModule() returnerar den tidigare importerade modulen med det angivna namnet. (Bidrag från Eric Snow i bpo-28411.)

Det nya makrot Py_RETURN_RICHCOMPARE underlättar skrivandet av rika jämförelsefunktioner. (Bidrag från Petr Victorin i bpo-23699.)

Det nya makrot Py_UNREACHABLE kan användas för att markera onåbara kodvägar. (Bidrag från Barry Warsaw i bpo-31338.)

tracemalloc exponerar nu ett C API genom de nya funktionerna PyTraceMalloc_Track() och PyTraceMalloc_Untrack(). (Bidrag från Victor Stinner i bpo-30054.)

De nya statiska markörerna import__find__load__start() och import__find__load__done() kan användas för att spåra modulimporter. (Bidrag från Christian Heimes i bpo-31574.)

Fälten name och doc i strukturerna PyMemberDef, PyGetSetDef, PyStructSequence_Field, PyStructSequence_Desc och wrapperbase är nu av typen const char * istället för char *. (Bidrag från Serhiy Storchaka i bpo-28761.)

Resultatet av PyUnicode_AsUTF8AndSize() och PyUnicode_AsUTF8() är nu av typen const char * istället för char *. (Bidrag från Serhiy Storchaka i bpo-28769.)

Resultatet av PyMapping_Keys(), PyMapping_Values() och PyMapping_Items() är nu alltid en lista, snarare än en lista eller en tupel. (Bidrag från Oren Milman i bpo-28280.)

Lagt till funktionerna PySlice_Unpack() och PySlice_AdjustIndices(). (Bidrag från Serhiy Storchaka i bpo-27867.)

PyOS_AfterFork() är utdaterad till förmån för de nya funktionerna PyOS_BeforeFork(), PyOS_AfterFork_Parent() och PyOS_AfterFork_Child(). (Bidrag från Antoine Pitrou i bpo-16500.)

Singletonen PyExc_RecursionErrorInst som var en del av det publika API:et har tagits bort eftersom dess medlemmar som aldrig rensas kan orsaka ett segfault under slutförandet av tolken. Bidrag från Xavier de Gaye i bpo-22898 och bpo-30697.

Lagt till C API-stöd för tidszoner med tidszonskonstruktörerna PyTimeZone_FromOffset() och PyTimeZone_FromOffsetAndName(), och tillgång till UTC-singleton med PyDateTime_TimeZone_UTC. Bidrag från Paul Ganssle i bpo-10381.

Typen av resultat för PyThread_start_new_thread() och PyThread_get_thread_ident(), och parametern id för PyThreadState_SetAsyncExc() ändrades från long till unsigned long. (Bidrag från Serhiy Storchaka i bpo-6532.)

PyUnicode_AsWideCharString() ger nu upphov till ett ValueError om det andra argumentet är NULL och strängen wchar_t* innehåller null-tecken. (Bidrag från Serhiy Storchaka i bpo-30708.)

Förändringar i startsekvensen och hanteringen av dynamiska minnesallokatorer innebär att det sedan länge dokumenterade kravet på att anropa Py_Initialize() innan de flesta C API-funktioner anropas nu används i större utsträckning, och att inte följa det kan leda till segfaults i inbäddade program. Se avsnittet Portning till Python 3.7 i det här dokumentet och avsnittet Före initialisering av Python i C API-dokumentationen för mer information.

Den nya PyInterpreterState_GetID() returnerar det unika ID:t för en given tolk. (Bidrag från Eric Snow i bpo-29102.)

Py_DecodeLocale(), Py_EncodeLocale() använder nu UTF-8-kodningen när UTF-8 mode är aktiverat. (Bidrag från Victor Stinner i bpo-29240.)

PyUnicode_DecodeLocaleAndSize() och PyUnicode_EncodeLocale() använder nu den aktuella lokala kodningen för surrogateescape felhanterare. (Bidrag från Victor Stinner i bpo-29240.)

Parametrarna start och slut i PyUnicode_FindChar() är nu justerade för att bete sig som strängskivor. (Bidrag från Xiang Zhang i bpo-28822.)

Förändringar i byggning

Stöd för att bygga --without-threads har tagits bort. Modulen threading är nu alltid tillgänglig. (Bidrag från Antoine Pitrou i bpo-31370.).

En fullständig kopia av libffi levereras inte längre för användning när modulen _ctypes byggs på UNIX-plattformar som inte är OSX. En installerad kopia av libffi krävs nu när _ctypes byggs på sådana plattformar. (Bidrag från Zachary Ware i bpo-27979.)

Byggprocessen i Windows är inte längre beroende av Subversion för att hämta in externa källor, utan ett Python-skript används för att hämta zip-filer från GitHub. Om Python 3.6 inte finns på systemet (via py -3.6) används NuGet för att ladda ner en kopia av 32-bitars Python för detta ändamål. (Bidrag från Zachary Ware i bpo-30450.)

Modulen ssl kräver OpenSSL 1.0.2 eller 1.1-kompatibla libssl. OpenSSL 1.0.1 har nått slutet av sin livstid den 2016-12-31 och stöds inte längre. LibreSSL stöds inte heller temporärt. LibreSSL-utgåvor upp till version 2.6.4 saknar nödvändiga API:er för OpenSSL 1.0.2.

Optimeringar

Omkostnaderna för att anropa många metoder i olika standardbiblioteksklasser implementerade i C har minskats avsevärt genom att porta mer kod för att använda METH_FASTCALL-konventionen. (Bidrag från Victor Stinner i bpo-29300, bpo-29507, bpo-29452, och bpo-29286.)

Olika optimeringar har minskat Pythons starttid med 10% on Linux och upp till 30% on macOS. (Bidrag från Victor Stinner, INADA Naoki i bpo-29585, och Ivan Levkivskyi i bpo-31333.)

Metodanrop är nu upp till 20% faster på grund av bytekodsändringar som undviker att skapa bundna metodinstanser. (Bidrag från Yury Selivanov och INADA Naoki i bpo-26110.)

Modulen asyncio fick ett antal anmärkningsvärda optimeringar för vanligt förekommande funktioner:

  • Funktionen asyncio.get_event_loop() har omimplementerats i C för att göra den upp till 15 gånger snabbare. (Bidrag från Yury Selivanov i bpo-32296.)

  • asyncio.Future callback-hanteringen har optimerats. (Bidrag från Yury Selivanov i bpo-32348.)

  • asyncio.gather() är nu uppe i 15% faster. (Bidrag från Yury Selivanov i bpo-32355.)

  • asyncio.sleep() är nu upp till 2 gånger snabbare när argumentet delay är noll eller negativt. (Bidrag från Andrew Svetlov i bpo-32351.)

  • Prestandaöverskottet för asyncios felsökningsläge har minskats. (Bidrag från Antoine Pitrou i bpo-31970.)

Som ett resultat av PEP 560 work, har importtiden för typing minskats med en faktor 7, och många typoperationer är nu snabbare. (Bidrag från Ivan Levkivskyi i bpo-32226.)

sorted() och list.sort() har optimerats för vanliga fall till att vara upp till 40-75% faster. (Bidrag från Elliot Gorokhovsky i bpo-28685.)

dict.copy() är nu upp till 5,5 gånger snabbare. (Bidrag från Yury Selivanov i bpo-31179.)

hasattr() och getattr() är nu ungefär 4 gånger snabbare när name inte hittas och obj inte åsidosätter object.__getattr__() eller object.__getattribute__(). (Bidrag från INADA Naoki i bpo-32544.)

Att söka efter vissa Unicode-tecken (t.ex. den ukrainska versalen ”Є”) i en sträng var upp till 25 gånger långsammare än att söka efter andra tecken. Nu är det bara 3 gånger långsammare i värsta fall. (Bidrag från Serhiy Storchaka i bpo-24821.)

Fabriken collections.namedtuple() har omimplementerats för att göra skapandet av namngivna tupler 4 till 6 gånger snabbare. (Bidrag från Jelle Zijlstra med ytterligare förbättringar av INADA Naoki, Serhiy Storchaka och Raymond Hettinger i bpo-28638.)

date.fromordinal() och date.fromtimestamp() är nu upp till 30% faster i vanliga fall. (Bidrag från Paul Ganssle i bpo-32403.)

Funktionen os.fwalk() är nu upp till 2 gånger snabbare tack vare användningen av os.scandir(). (Bidrag från Serhiy Storchaka i bpo-25996.)

Hastigheten för funktionen shutil.rmtree() har förbättrats med 20–40% tack vare användningen av funktionen os.scandir(). (Bidrag från Serhiy Storchaka i bpo-28564.)

Optimerad matchning och sökning utan skiftlägeskänslighet av regular expressions. Sökning av vissa mönster kan nu vara upp till 20 gånger snabbare. (Bidrag från Serhiy Storchaka i bpo-30285.)

re.compile() konverterar nu flags parameter till int-objekt om det är RegexFlag. Det är nu lika snabbt som Python 3.5, och snabbare än Python 3.6 med ungefär 10% de beroende på mönstret. (Bidrag från INADA Naoki i bpo-31671.)

Metoderna modify() för klasserna selectors.EpollSelector, selectors.PollSelector och selectors.DevpollSelector kan vara runt 10% faster under tung belastning. (Bidrag från Giampaolo Rodola i bpo-30014)

Constant folding har flyttats från peephole-optimeraren till den nya AST-optimeraren, som kan utföra optimeringar på ett mer konsekvent sätt. (Bidrag från Eugene Toder och INADA Naoki i bpo-29469 och bpo-11549.)

De flesta funktioner och metoder i abc har skrivits om i C. Detta gör det 1,5x snabbare att skapa abstrakta basklasser och att anropa isinstance() och issubclass() på dem. Detta minskar också Pythons starttid med upp till 10%. (Bidrag från Ivan Levkivskyi och INADA Naoki i bpo-31333)

Betydande hastighetsförbättringar av alternativa konstruktörer för datetime.date och datetime.datetime genom att använda snabbvägskonstruktörer när underklasser inte konstrueras. (Bidrag från Paul Ganssle i bpo-32403)

Jämförelsehastigheten för array.array-instanser har förbättrats avsevärt i vissa fall. Den är nu från 10x till 70x snabbare vid jämförelse av arrayer som innehåller värden av samma heltalstyp. (Bidrag från Adrian Wielgosik i bpo-24700.)

Funktionerna math.erf() och math.erfc() använder nu den (snabbare) C-biblioteksimplementationen på de flesta plattformar. (Bidrag från Serhiy Storchaka i bpo-26121.)

Andra ändringar i implementeringen av CPython

  • Spårningskrokar kan nu välja bort att ta emot line och välja att ta emot opcode-händelserna från tolken genom att ställa in motsvarande nya attribut f_trace_lines och f_trace_opcodes på den ram som spåras. (Bidrag från Nick Coghlan i bpo-31344.)

  • Åtgärdat vissa konsekvensproblem med attribut för namnrymdspaketmoduler. Namespace-modulobjekt har nu en __file__ som är inställd på None (tidigare oinställd), och deras __spec__.origin är också inställd på None (tidigare strängen "namespace"). Se bpo-32305. Dessutom är namespace-modulobjektets __spec__.loader satt till samma värde som __loader__ (tidigare var den förra satt till None). Se bpo-32303.

  • Ordlistan locals() visar nu i den lexikala ordning som variablerna definierades. Tidigare var ordningen odefinierad. (Bidrag från Raymond Hettinger i bpo-32690.)

  • Kommandot upload i distutils försöker inte längre ändra CR-tecken i slutet av raden till CRLF. Detta åtgärdar ett korruptionsproblem med sdists som slutade med en byte motsvarande CR. (Bidrag från Bo Bayles i bpo-32304.)

Föråldrat Python-beteende

Yield-uttryck (både yield och yield from-klausuler) är nu avförda i förståelser och generatoruttryck (förutom det iterabla uttrycket i for-klausulen längst till vänster). Detta säkerställer att förståelser alltid omedelbart returnerar en behållare av lämplig typ (snarare än att potentiellt returnera ett generator iterator-objekt), medan generatoruttryck inte kommer att försöka sammanfoga sin implicita utdata med utdata från något explicit yield-uttryck. I Python 3.7 avger sådana uttryck DeprecationWarning när de kompileras, i Python 3.8 kommer detta att vara ett SyntaxError. (Bidrag från Serhiy Storchaka i bpo-10544.)

Att returnera en subklass av complex från object.__complex__() är föråldrat och kommer att vara ett fel i framtida Python-versioner. Detta gör __complex__() konsekvent med object.__int__() och object.__float__(). (Bidrag från Serhiy Storchaka i bpo-28894.)

Föråldrade Python-moduler, -funktioner och -metoder

aifc

aifc.openfp() har blivit föråldrad och kommer att tas bort i Python 3.9. Använd aifc.open() istället. (Bidrag från Brian Curtin i bpo-31985.)

asyncio

Stöd för att direkt await-instanser av asyncio.Lock och andra asynciosynkroniseringsprimitiver har utgått. En asynkron kontexthanterare måste användas för att förvärva och frigöra synkroniseringsresursen. (Bidrag från Andrew Svetlov i bpo-32253.)

Metoderna asyncio.Task.current_task() och asyncio.Task.all_tasks() har utgått. (Bidrag från Andrew Svetlov i bpo-32250.)

samlingar

I Python 3.8 kommer de abstrakta basklasserna i collections.abc inte längre att exponeras i den vanliga modulen collections. Detta kommer att bidra till att skapa en tydligare skillnad mellan de konkreta klasserna och de abstrakta basklasserna. (Bidrag från Serhiy Storchaka i bpo-25988.)

dbm

dbm.dumb stöder nu läsning av skrivskyddade filer och skriver inte längre indexfilen när den inte ändras. En deprecation-varning skickas nu ut om indexfilen saknas och återskapas i lägena 'r' och 'w' (detta kommer att vara ett fel i framtida Python-utgåvor). (Bidrag från Serhiy Storchaka i bpo-28847.)

enum

I Python 3.8 kommer försök att kontrollera för icke-Enum-objekt i Enum-klasser att ge upphov till TypeError (t.ex. 1 in Color); på samma sätt kommer försök att kontrollera för icke-Flag-objekt i en Flag-medlem att ge upphov till TypeError (t.ex. 1 in Perm.RW); för närvarande returnerar båda operationerna False istället. (Bidrag från Ethan Furman i bpo-33217.)

gettext

Att använda ett icke-integralt värde för att välja pluralform i gettext är nu föråldrat. Det fungerade aldrig korrekt. (Bidrag från Serhiy Storchaka i bpo-28692.)

importlib

Metoderna MetaPathFinder.find_module() (ersatt av MetaPathFinder.find_spec()) och PathEntryFinder.find_loader() (ersatt av PathEntryFinder.find_spec()) båda föråldrade i Python 3.4 avger nu DeprecationWarning. (Bidrag från Matthias Bussonnier i bpo-29576.)

ABC:n importlib.abc.ResourceLoader har utgått till förmån för importlib.abc.ResourceReader.

lokal

locale.format() har utgått, använd locale.format_string() istället. (Bidrag från Garvit i bpo-10379.)

makväg

macpath är nu föråldrad och kommer att tas bort i Python 3.8. (Bidrag från Chi Hsuan Yen i bpo-9850.)

gängning

dummy_threading och _dummy_thread har utgått. Det är inte längre möjligt att bygga Python med avaktiverad trådning. Använd threading istället. (Bidrag från Antoine Pitrou i bpo-31370.)

kortplats

Den tysta trunkeringen av argumentvärden i socket.htons() och socket.ntohs() har utgått. I framtida versioner av Python, om det passerade argumentet är större än 16 bitar, kommer ett undantag att tas upp. (Bidrag från Oren Milman i bpo-28332.)

ssl

ssl.wrap_socket() är föråldrad. Använd ssl.SSLContext.wrap_socket() istället. (Bidrag från Christian Heimes i bpo-28124.)

sunau

sunau.openfp() har blivit föråldrad och kommer att tas bort i Python 3.9. Använd sunau.open() istället. (Bidrag från Brian Curtin i bpo-31985.)

system

Föråldrad sys.set_coroutine_wrapper() och sys.get_coroutine_wrapper().

Den odokumenterade funktionen sys.callstats() har föråldrats och kommer att tas bort i en framtida Python-version. (Bidrag från Victor Stinner i bpo-28799.)

våg

wave.openfp() har blivit föråldrad och kommer att tas bort i Python 3.9. Använd wave.open() istället. (Bidrag från Brian Curtin i bpo-31985.)

Föråldrade funktioner och typer i C API

Funktionen PySlice_GetIndicesEx() är föråldrad och ersätts med ett makro om Py_LIMITED_API inte är satt eller är satt till ett värde i intervallet mellan 0x03050400 och 0x03060000 (ej inkluderande), eller är 0x03060100 eller högre. (Bidrag från Serhiy Storchaka i bpo-27867.)

PyOS_AfterFork() har blivit föråldrad. Använd PyOS_BeforeFork(), PyOS_AfterFork_Parent() eller PyOS_AfterFork_Child() istället. (Bidrag från Antoine Pitrou i bpo-16500.)

Flytt av plattformsstöd

  • FreeBSD 9 och äldre stöds inte längre officiellt.

  • För fullständigt Unicode-stöd, inklusive i tilläggsmoduler, förväntas *nix-plattformar nu tillhandahålla minst en av C.UTF-8 (fullständig locale), C.utf8 (fullständig locale) eller UTF-8 (endast LC_CTYPE locale) som ett alternativ till den äldre ASCII-baserade C locale.

  • OpenSSL 0.9.8 och 1.0.1 stöds inte längre, vilket innebär att för att bygga CPython 3.7 med SSL/TLS-stöd på äldre plattformar som fortfarande använder dessa versioner krävs anpassade byggalternativ som länkar till en nyare version av OpenSSL.

    Det här problemet påverkar särskilt Linuxdistributionerna Debian 8 (även kallad ”jessie”) och Ubuntu 14.04 (även kallad ”Trusty”) LTS, eftersom de fortfarande använder OpenSSL 1.0.1 som standard.

    Debian 9 (”stretch”) och Ubuntu 16.04 (”xenial”), liksom de senaste utgåvorna av andra LTS Linux-utgåvor (t.ex. RHEL/CentOS 7.5, SLES 12-SP3), använder OpenSSL 1.0.2 eller senare och stöds fortfarande i standardkonfigurationen.

    CPythons egen CI-konfigurationsfil ger ett exempel på användning av SSL compatibility testing infrastructure i CPythons testsvit för att bygga och länka mot OpenSSL 1.1.0 i stället för ett föråldrat OpenSSL som tillhandahålls av systemet.

Borttagning av API och funktioner

Följande funktioner och API:er har tagits bort från Python 3.7:

  • Funktionen os.stat_float_times() har tagits bort. Den introducerades i Python 2.3 för bakåtkompatibilitet med Python 2.2, och har inte använts sedan Python 3.1.

  • Okända escapes bestående av '\' och en ASCII-bokstav i ersättningsmallar för re.sub() var föråldrade i Python 3.5, och kommer nu att orsaka ett fel.

  • Tog bort stöd för exclude-argumentet i tarfile.TarFile.add(). Det var föråldrat i Python 2.7 och 3.2. Använd filter-argumentet istället.

  • Funktionen ntpath.splitunc() var föråldrad i Python 3.1 och har nu tagits bort. Använd splitdrive() istället.

  • collections.namedtuple() har inte längre stöd för parametern verbose eller attributet _source som visade den genererade källkoden för klassen named tuple. Detta var en del av en optimering som utformats för att påskynda skapandet av klasser. (Bidrag från Jelle Zijlstra med ytterligare förbättringar av INADA Naoki, Serhiy Storchaka och Raymond Hettinger i bpo-28638.)

  • Funktionerna bool(), float(), list() och tuple() tar inte längre nyckelordsargument. Det första argumentet i int() kan nu bara skickas som ett positionellt argument.

  • Tog bort tidigare föråldrade i Python 2.4 klasserna Plist, Dict och _InternalDict i modulen plistlib. Dict-värden i resultatet av funktionerna readPlist() och readPlistFromBytes() är nu normala dicts. Du kan inte längre använda attributåtkomst för att komma åt objekt i dessa dictionaries.

  • Funktionen asyncio.windows_utils.socketpair() har tagits bort. Använd socket.socketpair()-funktionen istället, den är tillgänglig på alla plattformar sedan Python 3.5. asyncio.windows_utils.socketpair var bara ett alias till socket.socketpair på Python 3.5 och nyare.

  • asyncio exporterar inte längre modulerna selectors och _overlapped som asyncio.selectors och asyncio._overlapped. Ersätt from asyncio import selectors med import selectors.

  • Direkt instantiering av objekten ssl.SSLSocket och ssl.SSLObject är nu förbjudet. Konstruktörerna var aldrig dokumenterade, testade eller utformade som offentliga konstruktörer. Användare skulle använda ssl.wrap_socket() eller ssl.SSLContext. (Bidrag från Christian Heimes i bpo-32951.)

  • Det oanvända kommandot install_misc i distutils har tagits bort. (Bidrag från Eric N. Vander Weele i bpo-29218.)

Flytt av modul

Modulen fpectl har tagits bort. Den var aldrig aktiverad som standard, fungerade aldrig korrekt på x86-64 och ändrade Pythons ABI på ett sätt som orsakade oväntade avbrott i C-tillägg. (Bidrag från Nathaniel J. Smith i bpo-29137.)

Ändringar endast i Windows

Python-startprogrammet (py.exe) kan acceptera 32- och 64-bitarsangivelser utan att behöva ange en mindre version också. Så py -3-32 och py -3-64 blir giltiga liksom py -3.7-32, även formerna -m-64 och -m.n-64 accepteras nu för att tvinga fram 64-bitars python även om 32-bitars annars skulle ha använts. Om den angivna versionen inte är tillgänglig kommer py.exe att avsluta med ett fel. (Bidrag från Steve Barnes i bpo-30291.)

Startprogrammet kan köras som py -0 för att producera en lista över installerade pythons, med standard markerad med en asterisk. Om du kör py -0p kommer sökvägarna att inkluderas. Om py körs med en versionsangivelse som inte kan matchas skrivs även en kortformad lista över tillgängliga angivelser ut. (Bidrag från Steve Barnes i bpo-30362.)

Portning till Python 3.7

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

Förändringar i Python-beteendet

  • namnen async och await är nu reserverade nyckelord. Kod som använder dessa namn som identifierare kommer nu att ge upphov till ett SyntaxError. (Bidrag från Jelle Zijlstra i bpo-30406.)

  • PEP 479 är aktiverat för all kod i Python 3.7, vilket innebär att StopIteration-undantag som direkt eller indirekt uppstår i coroutines och generatorer omvandlas till RuntimeError-undantag. (Bidrag från Yury Selivanov i bpo-32670.)

  • object.__aiter__()-metoder kan inte längre deklareras som asynkrona. (Bidrag från Yury Selivanov i bpo-31709.)

  • På grund av ett förbiseende accepterade tidigare Python-versioner felaktigt följande syntax:

    f(1 för x i [1],)
    
    klass C(1 för x i [1]):
        pass
    

    Python 3.7 ger nu korrekt upphov till ett SyntaxError, eftersom ett generatoruttryck alltid måste vara direkt inom en uppsättning parenteser och inte kan ha ett kommatecken på båda sidor, och dupliceringen av parenteserna kan utelämnas endast vid anrop. (Bidrag från Serhiy Storchaka i bpo-32012 och bpo-32023.)

  • Vid användning av -m läggs nu den första arbetskatalogen till i sys.path, istället för en tom sträng (som dynamiskt angav den aktuella arbetskatalogen vid varje import). Alla program som kontrollerar för den tomma strängen, eller på annat sätt förlitar sig på det tidigare beteendet, måste uppdateras i enlighet med detta (t.ex. genom att även kontrollera för os.getcwd() eller os.path.dirname(__main__.__file__), beroende på varför koden kontrollerade för den tomma strängen från början).

Ändringar i Python API

  • socketserver.ThreadingMixIn.server_close() väntar nu tills alla icke-daemon-trådar har avslutats. Sätt det nya klassattributet socketserver.ThreadingMixIn.block_on_close till False för att få beteendet från före 3.7. (Bidrag från Victor Stinner i bpo-31233 och bpo-33540.)

  • socketserver.ForkingMixIn.server_close() väntar nu tills alla underordnade processer har slutförts. Ställ in det nya klassattributet socketserver.ForkingMixIn.block_on_close till False för att få beteendet från före 3.7. (Bidrag från Victor Stinner i bpo-31151 och bpo-33540.)

  • Funktionen locale.localeconv() ställer nu temporärt in LC_CTYPE locale till värdet LC_NUMERIC i vissa fall. (Bidrag från Victor Stinner i bpo-31900.)

  • pkgutil.walk_packages() ger nu upphov till ett ValueError om path är en sträng. Tidigare returnerades en tom lista. (Bidrag från Sanyam Khurana i bpo-24744.)

  • Ett formatsträngargument för string.Formatter.format() är nu positional-only. Att skicka det som ett nyckelordsargument var föråldrat i Python 3.5. (Bidrag från Serhiy Storchaka i bpo-29193.)

  • Attributen key, value och coded_value i klassen http.cookies.Morsel är nu skrivskyddade. Att tilldela dem var föråldrat i Python 3.5. Använd metoden set() för att ställa in dem. (Bidrag från Serhiy Storchaka i bpo-29192.)

  • Argumentet mode i os.makedirs() påverkar inte längre filbehörighetsbitarna för nyskapade kataloger på mellannivå. För att ställa in deras filbehörighetsbitar kan du ställa in umask innan du anropar makedirs(). (Bidrag från Serhiy Storchaka i bpo-19930.)

  • Typen struct.Struct.format är nu str istället för bytes. (Bidrag från Victor Stinner i bpo-21071.)

  • cgi.parse_multipart() accepterar nu argumenten encoding och errors och returnerar samma resultat som FieldStorage: för fält som inte är filer är värdet som associeras till en nyckel en lista med strängar, inte bytes. (Bidrag från Pierre Quentel i bpo-29979.)

  • På grund av interna förändringar i socket stöds inte anrop av socket.fromshare() på en socket skapad av socket.share i äldre Python-versioner.

  • repr för BaseException har ändrats till att inte inkludera det efterföljande kommatecknet. De flesta undantag påverkas av denna ändring. (Bidrag från Serhiy Storchaka i bpo-30399.)

  • repr för datetime.timedelta har ändrats för att inkludera nyckelordsargumenten i utdata. (Bidrag från Utkarsh Upadhyay i bpo-30302.)

  • Eftersom shutil.rmtree() nu implementeras med hjälp av funktionen os.scandir(), anropas nu den användardefinierade hanteraren onerror med det första argumentet os.scandir istället för os.listdir när listningen av katalogen misslyckas.

  • Stöd för nästlade mängder och mängdoperationer i reguljära uttryck enligt Unicode Technical Standard #18 kan komma att läggas till i framtiden. Detta skulle förändra syntaxen. För att underlätta denna framtida förändring kommer en FutureWarning att visas i tvetydiga fall för tillfället. Det inkluderar uppsättningar som börjar med en bokstavlig '[' eller innehåller bokstavliga teckensekvenser '--', '&&', '~~' och '||'. För att undvika en varning, escape dem med ett backslash. (Bidrag från Serhiy Storchaka i bpo-30349.)

  • Resultatet av att dela upp en sträng på ett regular expression som kan matcha en tom sträng har ändrats. Om du till exempel delar upp en sträng på r'\s*' kommer den nu inte bara att delas upp på blanksteg som tidigare, utan även på tomma strängar före alla tecken som inte är blanksteg och precis före slutet av strängen. Det tidigare beteendet kan återställas genom att ändra mönstret till r'\s+'. En FutureWarning har utfärdats för sådana mönster sedan Python 3.5.

    För mönster som matchar både tomma och icke-tomma strängar kan resultatet av sökningen efter alla matchningar ändras även i andra fall. Till exempel i strängen 'a\n\n' kommer mönstret r'(?m)^\s*?$' inte bara att matcha tomma strängar på position 2 och 3, utan även strängen '\n' på position 2–3. För att bara matcha tomma rader bör mönstret skrivas om till r'(?m)^[^\S\n]*$'.

    re.sub() ersätter nu tomma matchningar som ligger intill en tidigare icke-tom matchning. Till exempel re.sub('x*', '-', 'abxd') returnerar nu '-a-b--d-' istället för '-a-b-d-' (den första minustecknet mellan ’b’ och ’d’ ersätter ’x’, och det andra minustecknet ersätter en tom sträng mellan ’x’ och ’d’).

    (Bidrag från Serhiy Storchaka i bpo-25054 och bpo-32308.)

  • Ändra re.escape() till att endast undkomma regex-specialtecken istället för att undkomma alla andra tecken än ASCII-bokstäver, siffror och '_'. (Bidrag från Serhiy Storchaka i bpo-29995.)

  • tracemalloc.Traceback ramar är nu sorterade från äldst till nyast för att vara mer konsekventa med traceback. (Bidrag från Jesse Bakker i bpo-32121.)

  • På operativsystem som stöder bitflaggorna socket.SOCK_NONBLOCK eller socket.SOCK_CLOEXEC, tillämpas de inte längre av socket.type. Därför fungerar kontroller som if sock.type == socket.SOCK_STREAM som förväntat på alla plattformar. (Bidrag från Yury Selivanov i bpo-32331.)

  • I Windows ändrades standardvärdet för argumentet close_fds i subprocess.Popen från False till True vid omdirigering av standardhandtag. Om du tidigare var beroende av att handtagen ärvdes när du använde subprocess.Popen med standard io-omdirigering, måste du skicka close_fds=False för att bevara det tidigare beteendet, eller använda STARTUPINFO.lpAttributeList.

  • importlib.machinery.PathFinder.invalidate_caches() – som implicit påverkar importlib.invalidate_caches() – raderar nu poster i sys.path_importer_cache som är satta till None. (Bidrag från Brett Cannon i bpo-33169.)

  • I asyncio, loop.sock_recv(), loop.sock_sendall(), loop.sock_accept(), loop.getaddrinfo(), loop.getnameinfo() har ändrats till att vara riktiga coroutine-metoder för att matcha deras dokumentation. Tidigare returnerade dessa metoder asyncio.Future-instanser. (Bidrag från Yury Selivanov i bpo-32327.)

  • asyncio.Server.sockets returnerar nu en kopia av den interna listan över serversockets, istället för att returnera den direkt. (Bidrag från Yury Selivanov i bpo-32662.)

  • Struct.format är nu en str-instans istället för en bytes-instans. (Bidrag från Victor Stinner i bpo-21071.)

  • argparse subparsers kan nu göras obligatoriska genom att skicka required=True till ArgumentParser.add_subparsers(). (Bidrag från Anthony Sottile i bpo-26510.)

  • ast.literal_eval() är nu strängare. Addition och subtraktion av godtyckliga tal är inte längre tillåtet. (Bidrag från Serhiy Storchaka i bpo-31778.)

  • Calendar.itermonthdates kommer nu konsekvent att ge upphov till ett undantag när ett datum faller utanför intervallet 0001-01-01 till 9999-12-31. För att stödja applikationer som inte kan tolerera sådana undantag kan de nya Calendar.itermonthdays3 och Calendar.itermonthdays4 användas. De nya metoderna returnerar tupler och är inte begränsade av det intervall som stöds av datetime.date. (Bidrag från Alexander Belopolsky i bpo-28292.)

  • collections.ChainMap bevarar nu ordningen på de underliggande mappningarna. (Bidrag från Raymond Hettinger i bpo-32792.)

  • Metoden submit() i concurrent.futures.ThreadPoolExecutor och concurrent.futures.ProcessPoolExecutor ger nu upphov till ett RuntimeError om den anropas under tolkens avstängning. (Bidrag från Mark Nemec i bpo-33097.)

  • Konstruktorn configparser.ConfigParser använder nu read_dict() för att bearbeta standardvärdena, vilket gör att dess beteende överensstämmer med resten av parsern. Nycklar och värden i defaults-ordlistan som inte är strängar konverteras nu implicit till strängar. (Bidrag från James Tocknell i bpo-23835.)

  • Flera odokumenterade interna importer har tagits bort. Ett exempel är att os.errno inte längre är tillgänglig; använd import errno direkt istället. Observera att sådana odokumenterade interna importer kan tas bort när som helst utan föregående meddelande, även i mikroversioner.

Förändringar i C API

Funktionen PySlice_GetIndicesEx() anses vara osäker för sekvenser som kan ändras i storlek. Om slice-indexen inte är instanser av int, utan objekt som implementerar metoden __index__(), kan sekvensen storleksändras efter att dess längd har skickats till PySlice_GetIndicesEx(). Detta kan leda till att index returneras som inte är lika långa som sekvensen. För att undvika eventuella problem använd de nya funktionerna PySlice_Unpack() och PySlice_AdjustIndices(). (Bidrag från Serhiy Storchaka i bpo-27867.)

CPython bytecode-ändringar

Det finns två nya opkoder: LOAD_METHOD och CALL_METHOD. (Bidrag från Yury Selivanov och INADA Naoki i bpo-26110.)

Opkoden STORE_ANNOTATION har tagits bort. (Bidrag från Mark Shannon i bpo-32550.)

Ändringar endast i Windows

Filen som används för att åsidosätta sys.path heter nu <python-executable>._pth istället för 'sys.path'. Se Hitta moduler för mer information. (Bidrag från Steve Dower i bpo-28137.)

Andra ändringar i CPython-implementeringen

Som förberedelse för potentiella framtida ändringar av det offentliga CPython runtime initialiserings-API:et (se PEP 432 för ett första, men något föråldrat, utkast), har CPythons interna start- och konfigurationshanteringslogik refaktorerats avsevärt. Även om dessa uppdateringar är avsedda att vara helt transparenta för både inbäddningsapplikationer och användare av det vanliga CPython CLI, nämns de här eftersom refaktoriseringen ändrar den interna ordningen för olika operationer under tolkens uppstart och därmed kan avslöja tidigare latenta defekter, antingen i inbäddningsapplikationer eller i CPython själv. (Ursprungligen bidragit av Nick Coghlan och Eric Snow som en del av bpo-22257, och ytterligare uppdaterat av Nick, Eric och Victor Stinner i ett antal andra frågor). Några kända detaljer som påverkas:

  • PySys_AddWarnOptionUnicode() kan för närvarande inte användas av inbäddade program på grund av kravet att skapa ett Unicode-objekt före anropet av Py_Initialize. Använd PySys_AddWarnOption() istället.

  • varningsfilter som läggs till av en inbäddad applikation med PySys_AddWarnOption() bör nu mer konsekvent ha företräde framför de standardfilter som ställs in av tolken

På grund av förändringar i hur standardvarningsfiltren konfigureras, räcker det inte längre att sätta Py_BytesWarningFlag till ett värde större än ett för att både skicka ut BytesWarning-meddelanden och få dem konverterade till undantag. Istället måste flaggan sättas (för att varningarna överhuvudtaget ska skickas ut) och ett explicit error::BytesWarning-varningsfilter läggas till för att konvertera dem till undantag.

På grund av en ändring i hur docstrings hanteras av kompilatorn markeras nu den implicita return None i en funktionskropp som enbart består av en docstring som att den förekommer på samma rad som docstringen, inte på funktionens rubrikrad.

Det aktuella undantagstillståndet har flyttats från ramobjektet till co-rutinen. Detta förenklade tolken och åtgärdade ett par obskyra buggar som orsakades av att man bytte undantagstillstånd när man gick in i eller ut ur en generator. (Bidrag från Mark Shannon i bpo-25612.)

Viktiga ändringar i Python 3.7.1

Från och med 3.7.1 läser och respekterar Py_Initialize() nu konsekvent alla samma miljöinställningar som Py_Main() (i tidigare Python-versioner respekterade den en odefinierad delmängd av dessa miljövariabler, medan den i Python 3.7.0 inte läste någon av dem på grund av bpo-34247). Om detta beteende är oönskat, sätt Py_IgnoreEnvironmentFlag till 1 innan du anropar Py_Initialize().

I 3.7.1 uppdaterades C API:et för kontextvariabler för att använda PyObject-pekare. Se även bpo-34762.

I 3.7.1 ger modulen tokenize nu implicit ut en NEWLINE-token när den förses med indata som inte har en efterföljande ny rad. Detta beteende matchar nu vad C-tokenizer gör internt. (Bidrag från Ammar Askar i bpo-33899.)

Viktiga ändringar i Python 3.7.2

I 3.7.2 kopierar venv på Windows inte längre de ursprungliga binärerna, utan skapar omdirigeringsskript med namnen python.exe och pythonw.exe istället. Detta löser ett långvarigt problem där alla virtuella miljöer måste uppgraderas eller återskapas vid varje Python-uppdatering. Observera dock att den här versionen fortfarande kräver återskapande av virtuella miljöer för att få de nya skripten.

Viktiga ändringar i Python 3.7.6

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

Viktiga ändringar i Python 3.7.10

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

Anmärkningsvärda ändringar i Python 3.7.11

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)

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-tecken för ny rad n, r och tabb t bort från URL:en av parsern 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.7.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.