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:
PEP 553, den nya funktionen
breakpoint()
.
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:
Modulen
asyncio
har fått nya funktioner, betydande förbättringar av användbarhet och prestanda.Modulen
time
fick stöd för funktioner med nanosekundupplösning.
Förbättringar av CPython-implementeringen:
Undvika att använda ASCII som standardkodning för text:
PEP 552, deterministisk .pycs
PEP 565, förbättrad
DeprecationWarning
-hantering
Förbättringar av C API:
PEP 539, nytt C API för trådlokal lagring
Förbättringar av dokumentationen:
PEP 545, Översättningar av Python-dokumentationen
Nya dokumentationsöversättningar: Japanska, franska och koreanska.
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
:
tid.monotonisk_ns()
tid.process_tid_ns()
tid.tid_ns()
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 tillDeprecationWarning
ellerFutureWarning
.
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:
Japanska: https://docs.python.org/ja/
Franska: https://docs.python.org/fr/
Koreanska: https://docs.python.org/ko/
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 enasync 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()
ochbytearray.fromhex()
ignorerar nu alla ASCII-teckensnitt, inte bara blanksteg. (Bidrag från Robert Xiao i bpo-28927.)str
,bytes
ochbytearray
har fått stöd för den nya metodenisascii()
, 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ärfrom ... 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 medstr(x)
snarare änformat(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 attributettb_next
på tracebacks ä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övariabelnPYTHONPROFILEIMPORTTIME
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:
Den nya provisional
asyncio.run()
funktionen kan användas för att köra en coroutine från synkron kod genom att automatiskt skapa och förstöra eventloopen. (Bidrag från Yury Selivanov i bpo-32314.)asyncio har fått stöd för
contextvars
.loop.call_soon()
,loop.call_soon_threadsafe()
,loop.call_later()
,loop.call_at()
, ochFuture.add_done_callback()
har en ny valfri parameter som endast innehåller nyckelordet context.Tasks
spårar nu sitt sammanhang automatiskt. Se PEP 567 för mer information. (Bidrag från Yury Selivanov i bpo-32436.)Den nya funktionen
asyncio.create_task()
har lagts till som en genväg tillasyncio.get_event_loop().create_task()
. (Bidrag från Andrew Svetlov i bpo-32311.)Den nya
loop.start_tls()
-metoden kan användas för att uppgradera en befintlig anslutning till TLS. (Bidrag från Yury Selivanov i bpo-23749.)Den nya
loop.sock_recv_into()
-metoden gör det möjligt att läsa data från en socket direkt till en tillhandahållen buffert, vilket gör det möjligt att minska antalet datakopior. (Bidrag från Antoine Pitrou i bpo-31819.)Den nya funktionen
asyncio.current_task()
returnerar den aktuellaTask
-instansen och den nya funktionenasyncio.all_tasks()
returnerar en uppsättning av alla befintligaTask
-instanser i en given loop. MetodernaTask.current_task()
ochTask.all_tasks()
har utgått. (Bidrag från Andrew Svetlov i bpo-32250.)Den nya provisoriska
BufferedProtocol
-klassen gör det möjligt att implementera streamingprotokoll med manuell kontroll över mottagningsbufferten. (Bidrag från Yury Selivanov i bpo-32251.)Den nya funktionen
asyncio.get_running_loop()
returnerar den loop som körs för tillfället och ger upphov till ettRuntimeError
om ingen loop körs. Detta är i motsats tillasyncio.get_event_loop()
, som kommer att skapa en ny händelseslinga om ingen är igång. (Bidrag från Yury Selivanov i bpo-32269.)Den nya
StreamWriter.wait_closed()
coroutine-metoden gör det möjligt att vänta tills streamwritern är stängd. Den nya metodenStreamWriter.is_closing()
kan användas för att avgöra om skrivaren håller på att stängas. (Bidrag från Andrew Svetlov i bpo-32391.)Den nya
loop.sock_sendfile()
coroutine-metoden tillåter att filer skickas medos.sendfile
när det är möjligt. (Bidrag från Andrew Svetlov i bpo-32410.)De nya metoderna
Future.get_loop()
ochTask.get_loop()
returnerar instansen av den loop som en task eller en future skapades i.Server.get_loop()
gör det möjligt att göra samma sak förasyncio.Server
-objekt. (Bidrag från Yury Selivanov i bpo-32415 och Srinivas Reddy Thatiparthy i bpo-32418.)Det är nu möjligt att styra hur instanser av
asyncio.Server
börjar servera. Tidigare skulle servern börja servera omedelbart när den skapades. Det nya start_serving nyckelordsargumentet tillloop.create_server()
ochloop.create_unix_server()
, samtServer.start_serving()
ochServer.serve_forever()
kan användas för att frikoppla serverinstansiering och servering. Den nya metodenServer.is_serving()
returnerarTrue
om servern serverar.Server
-objekt är nu asynkrona kontexthanterare:srv = await loop.skapa_server(...) asynkron med srv: # lite kod # Vid denna tidpunkt är srv stängd och accepterar inte längre nya anslutningar.
(Bidrag från Yury Selivanov i bpo-32662.)
Återkallningsobjekt som returneras av
loop.call_later()
har fått den nyawhen()
-metoden som returnerar en absolut tidsstämpel för den schemalagda återkallningen. (Bidrag från Andrew Svetlov i bpo-32741.)Metoden
loop.create_datagram_endpoint()
fick stöd för Unix-sockets. (Bidrag från Quentin Dawans i bpo-31245.)Funktionerna
asyncio.open_connection()
,asyncio.start_server()
,loop.create_connection()
,loop.create_server()
,loop.create_accepted_socket()
och deras motsvarande UNIX-socketvarianter accepterar nu nyckelordsargumentet ssl_handshake_timeout. (Bidrag från Neil Aspinall i bpo-29970.)Den nya
Handle.cancelled()
-metoden returnerarTrue
om återuppringningen avbröts. (Bidrag från Marat Sharafutdinov i bpo-31943.)Asyncio-källan har konverterats till att använda syntaxen
async
/await
. (Bidrag från Andrew Svetlov i bpo-32193.)Den nya metoden
ReadTransport.is_reading()
kan användas för att bestämma transportens läsläge. Dessutom är anrop tillReadTransport.resume_reading()
ochReadTransport.pause_reading()
nu idempotenta. (Bidrag från Yury Selivanov i bpo-32356.)Loop-metoder som accepterar socket-sökvägar har nu stöd för att skicka path-like object. (Bidrag från Yury Selivanov i bpo-32066.)
I
asyncio
skapas nu TCP-sockets på Linux med flagganTCP_NODELAY
inställd som standard. (Bidrag från Yury Selivanov och Victor Stinner i bpo-27456.)Undantag som inträffar i avbrutna uppgifter loggas inte längre. (Bidrag från Yury Selivanov i bpo-30508.)
Nya klasser
WindowsSelectorEventLoopPolicy
ochWindowsProactorEventLoopPolicy
. (Bidrag från Yury Selivanov i bpo-33792.)
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.)
kö¶
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
:
tid.monotonisk_ns()
tid.process_tid_ns()
tid.tid_ns()
Nya klockidentifierare har lagts till:
time.CLOCK_BOOTTIME
(Linux): Identisk medtime.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 attributetsys.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 emotopcode
-händelserna från tolken genom att ställa in motsvarande nya attributf_trace_lines
ochf_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 tillNone
). 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
idistutils
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) ellerUTF-8
(endastLC_CTYPE
locale) som ett alternativ till den äldreASCII
-baseradeC
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örre.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ändsplitdrive()
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()
ochtuple()
tar inte längre nyckelordsargument. Det första argumentet iint()
kan nu bara skickas som ett positionellt argument.Tog bort tidigare föråldrade i Python 2.4 klasserna
Plist
,Dict
och_InternalDict
i modulenplistlib
. Dict-värden i resultatet av funktionernareadPlist()
ochreadPlistFromBytes()
ä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ändsocket.socketpair()
-funktionen istället, den är tillgänglig på alla plattformar sedan Python 3.5.asyncio.windows_utils.socketpair
var bara ett alias tillsocket.socketpair
på Python 3.5 och nyare.asyncio
exporterar inte längre modulernaselectors
och_overlapped
somasyncio.selectors
ochasyncio._overlapped
. Ersättfrom asyncio import selectors
medimport selectors
.Direkt instantiering av objekten
ssl.SSLSocket
ochssl.SSLObject
är nu förbjudet. Konstruktörerna var aldrig dokumenterade, testade eller utformade som offentliga konstruktörer. Användare skulle användassl.wrap_socket()
ellerssl.SSLContext
. (Bidrag från Christian Heimes i bpo-32951.)Det oanvända kommandot
install_misc
idistutils
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
ochawait
är nu reserverade nyckelord. Kod som använder dessa namn som identifierare kommer nu att ge upphov till ettSyntaxError
. (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 tillRuntimeError
-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 isys.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öros.getcwd()
elleros.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 klassattributetsocketserver.ThreadingMixIn.block_on_close
tillFalse
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 klassattributetsocketserver.ForkingMixIn.block_on_close
tillFalse
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 inLC_CTYPE
locale till värdetLC_NUMERIC
i vissa fall. (Bidrag från Victor Stinner i bpo-31900.)pkgutil.walk_packages()
ger nu upphov till ettValueError
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
ochcoded_value
i klassenhttp.cookies.Morsel
är nu skrivskyddade. Att tilldela dem var föråldrat i Python 3.5. Använd metodenset()
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 anroparmakedirs()
. (Bidrag från Serhiy Storchaka i bpo-19930.)Typen
struct.Struct.format
är nustr
istället förbytes
. (Bidrag från Victor Stinner i bpo-21071.)cgi.parse_multipart()
accepterar nu argumenten encoding och errors och returnerar samma resultat somFieldStorage
: 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 avsocket.fromshare()
på en socket skapad avsocket.share
i äldre Python-versioner.repr
förBaseException
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ördatetime.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 funktionenos.scandir()
, anropas nu den användardefinierade hanteraren onerror med det första argumentetos.scandir
istället föros.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 tillr'\s+'
. EnFutureWarning
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önstretr'(?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 tillr'(?m)^[^\S\n]*$'
.re.sub()
ersätter nu tomma matchningar som ligger intill en tidigare icke-tom matchning. Till exempelre.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’).Ä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 medtraceback
. (Bidrag från Jesse Bakker i bpo-32121.)På operativsystem som stöder bitflaggorna
socket.SOCK_NONBLOCK
ellersocket.SOCK_CLOEXEC
, tillämpas de inte längre avsocket.type
. Därför fungerar kontroller somif 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ånFalse
tillTrue
vid omdirigering av standardhandtag. Om du tidigare var beroende av att handtagen ärvdes när du användesubprocess.Popen
med standard io-omdirigering, måste du skickaclose_fds=False
för att bevara det tidigare beteendet, eller användaSTARTUPINFO.lpAttributeList
.importlib.machinery.PathFinder.invalidate_caches()
– som implicit påverkarimportlib.invalidate_caches()
– raderar nu poster isys.path_importer_cache
som är satta tillNone
. (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 metoderasyncio.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 enstr
-instans istället för enbytes
-instans. (Bidrag från Victor Stinner i bpo-21071.)argparse
subparsers kan nu göras obligatoriska genom att skickarequired=True
tillArgumentParser.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 intervallet0001-01-01
till9999-12-31
. För att stödja applikationer som inte kan tolerera sådana undantag kan de nyaCalendar.itermonthdays3
ochCalendar.itermonthdays4
användas. De nya metoderna returnerar tupler och är inte begränsade av det intervall som stöds avdatetime.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()
iconcurrent.futures.ThreadPoolExecutor
ochconcurrent.futures.ProcessPoolExecutor
ger nu upphov till ettRuntimeError
om den anropas under tolkens avstängning. (Bidrag från Mark Nemec i bpo-33097.)Konstruktorn
configparser.ConfigParser
använder nuread_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ändimport 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 avPy_Initialize
. AnvändPySys_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.