Vad är nytt i Python 3.4¶
- Författare:
R. David Murray <rdmurray@bitdance.com> (redaktör)
I den här artikeln förklaras de nya funktionerna i Python 3.4 jämfört med 3.3. Python 3.4 släpptes den 16 mars 2014. För fullständig information, se changelog.
Se även
PEP 429 – Python 3.4 Utgivningsschema
Sammanfattning – Release Highlights¶
Nya syntaxfunktioner:
Inga nya syntaxfunktioner har lagts till i Python 3.4.
Andra nya funktioner:
kommandoradsalternativ för isolated mode (bpo-16499).
förbättringar i hanteringen av codecs som inte är textkodningar (flera frågor).
En ModuleSpec-typ för importsystemet (PEP 451). (Påverkar importörsförfattare.)
Formatet
marshal
har gjorts mer kompakt och effektivt (bpo-16475).
Nya biblioteksmoduler:
selectors
: Hög nivå och effektiv I/O-multiplexering, byggd påselect
-modulens primitiver (del av PEP 3156).statistics
: Ett grundläggande numeriskt stabilt statistikbibliotek (PEP 450).
Betydligt förbättrade biblioteksmoduler:
Ny
pickle
protocol 4 (PEP 3154).multiprocessing
har nu ett alternativ för att undvika att använda os.fork på Unix (bpo-8713).email
har en ny undermodul,contentmanager
, och en nyMessage
-underklass (EmailMessage
) som förenklar MIME-hanteringen (bpo-18891).Modulerna
inspect
ochpydoc
kan nu göra korrekt introspektion av en mycket större mängd anropsbara objekt, vilket förbättrar utdata från Pythonshelp()
-system.API:et för modulen
ipaddress
har förklarats stabilt
Förbättringar av säkerheten:
Gör nyskapade filbeskrivare icke-ärftliga (PEP 446) för att undvika läckage av filbeskrivare till underordnade processer.
Nytt kommandoradsalternativ för isolated mode, (bpo-16499).
multiprocessing
har nu ett alternativ för att undvika att använda os.fork på Unix. spawn och forkserver är säkrare eftersom de undviker att dela data med underordnade processer.multiprocessing
-barnprocesser i Windows ärver inte längre alla förälderns ärvbara handtag, bara de nödvändiga.En ny
hashlib.pbkdf2_hmac()
-funktion tillhandahåller PKCS#5 password-based key derivation function 2.Hämtning av certifikat från Windows systemets cert-arkiv stöd för
ssl
.Klassen
ssl.SSLContext
har en många förbättringar.Alla moduler i standardbiblioteket som stöder SSL stöder nu verifiering av servercertifikat, inklusive matchning av värdnamn (
ssl.match_hostname()
) och CRL:er (listor över återkallade certifikat, sessl.SSLContext.load_verify_locations()
).
Förbättringar av CPython-implementeringen:
Med hjälp av PEP 442, i de flesta fall modulglobaler sätts inte längre till None under slutförande (bpo-18214).
Läs vidare för en omfattande lista över användarorienterade ändringar, inklusive många andra mindre förbättringar, CPython-optimeringar, avskrivningar och potentiella portningsproblem.
Nya funktioner¶
PEP 453: Explicit bootstrapping av PIP i Python-installationer¶
Bootstrapping pip som standard¶
Den nya modulen ensurepip
(definierad i PEP 453) tillhandahåller en plattformsoberoende standardmekanism för att starta upp pip-installationsprogrammet i Python-installationer och virtuella miljöer. Den version av pip
som ingår i Python 3.4.0 är pip
1.5.4, och framtida underhållsutgåvor av 3.4.x kommer att uppdatera den medföljande versionen till den senaste versionen av pip
som är tillgänglig vid tidpunkten för skapandet av releasekandidat.
Som standard installeras kommandona pipX
och pipX.Y
på alla plattformar (där X.Y står för versionen av Python-installationen), tillsammans med Python-paketet pip
och dess beroenden. I Windows och i virtuella miljöer på alla plattformar installeras även det oversionerade kommandot pip
. På andra plattformar hänvisar det systemomfattande kommandot pip
unversioned vanligtvis till den separat installerade Python 2-versionen.
Kommandoradsverktyget pyvenv
och modulen venv`
använder modulen ensurepip`
för att göra pip
lättillgängligt i virtuella miljöer. När kommandoradsverktyget används installeras pip
som standard, medan installation av pip
måste begäras uttryckligen när modulen venv
API används.
För CPython source builds på POSIX-system, bootstrappar kommandona make install
och make altinstall
pip
som standard. Detta beteende kan kontrolleras genom configure-alternativ och åsidosättas genom Makefile-alternativ.
På Windows och Mac OS X installerar CPython-installatörerna nu som standard pip
tillsammans med CPython själv (användare kan välja bort att installera det under installationsprocessen). Windows-användare måste välja de automatiska PATH
-ändringarna för att pip
ska vara tillgängligt från kommandoraden som standard, annars kan det fortfarande nås via Python-startprogrammet för Windows som py -m pip
.
Som diskuteras i PEP kan plattformspaketörer välja att inte installera dessa kommandon som standard, så länge som de, när de anropas, ger tydliga och enkla anvisningar om hur de installeras på den plattformen (vanligtvis med hjälp av systempakethanteraren).
Anteckning
För att undvika konflikter mellan parallella Python 2- och Python 3-installationer startas endast de versionerade kommandona pip3
och pip3.4
som standard när ensurepip
anropas direkt - alternativet --default-pip
behövs för att även begära det oversionerade kommandot pip
. pyvenv
och Windows-installationsprogrammet säkerställer att det okvalificerade kommandot pip
görs tillgängligt i dessa miljöer, och pip
kan alltid anropas via -m
-omkopplaren istället för direkt för att undvika tvetydighet på system med flera Python-installationer.
Förändringar i dokumentation¶
Som en del av denna förändring har avsnitten Installera Python-moduler och Distribuera Python-moduler i dokumentationen helt omarbetats till korta dokument om att komma igång och vanliga frågor. Den mesta förpackningsdokumentationen har nu flyttats ut till Python Packaging Authoritys underhållna Python Packaging User Guide och dokumentationen för de enskilda projekten.
Men eftersom den här migreringen för närvarande fortfarande är ofullständig, finns de äldre versionerna av dessa guider fortfarande tillgängliga som Bygga C- och C++-tillägg med setuptools och Bygga C- och C++-tillägg med setuptools.
Se även
- PEP 453 – Explicit bootstrapping av pip i Python-installationer
PEP skriven av Donald Stufft och Nick Coghlan, implementerad av Donald Stufft, Nick Coghlan, Martin von Löwis och Ned Deily.
PEP 446: Nyskapade filbeskrivare är inte ärftliga¶
PEP 446 gör nyskapade filbeskrivare icke-ärftliga. I allmänhet är detta det beteende som ett program vill ha: när en ny process startas kan det leda till alla möjliga svårfunna buggar och potentiellt till säkerhetsproblem om filer som för närvarande är öppna också är öppna i den nya processen.
Det finns dock tillfällen då arv är önskvärt. För att stödja dessa fall finns följande nya funktioner och metoder tillgängliga:
Se även
- PEP 446 – Gör nyskapade filbeskrivare icke-ärftliga
PEP skrivet och implementerat av Victor Stinner.
Förbättringar av Codec-hantering¶
Sedan den först introducerades har modulen codecs
alltid varit avsedd att fungera som ett typneutralt dynamiskt kodnings- och avkodningssystem. Men dess nära koppling till Pythons textmodell, särskilt de typbegränsade bekvämlighetsmetoderna för de inbyggda typerna str
, bytes
och bytearray
, har historiskt sett dolt detta faktum.
Som ett viktigt steg i att klargöra situationen är bekvämlighetsfunktionerna codecs.encode()
och codecs.decode()
nu korrekt dokumenterade i Python 2.7, 3.3 och 3.4. Dessa funktioner har funnits i modulen codecs
(och har täckts av regressionstestsviten) sedan Python 2.4, men var tidigare endast upptäckbara genom introspektion under körning.
Till skillnad från bekvämlighetsmetoderna för str
, bytes
och bytearray
stöder codecs
bekvämlighetsfunktioner godtyckliga codecs i både Python 2 och Python 3, snarare än att vara begränsade till Unicode-textkodningar (i Python 3) eller basstrings
<-> basstrings
-konverteringar (i Python 2).
I Python 3.4 kan tolken identifiera de kända icke-textkodningar som finns i standardbiblioteket och hänvisa användare till dessa allmänna bekvämlighetsfunktioner när det är lämpligt:
>>> b"abcdef".decode("hex")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs
>>> "hello".encode("rot13")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs
>>> open("foo.txt", encoding="hex")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs
I en relaterad ändring, när det är möjligt utan att bryta bakåtkompatibiliteten, är undantag som uppstår under kodnings- och avkodningsoperationer inslagna i ett kedjat undantag av samma typ som nämner namnet på den codec som är ansvarig för att producera felet:
>>> import codecs
>>> codecs.decode(b"abcdefgh", "hex")
Traceback (most recent call last):
File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
return (binascii.a2b_hex(input), len(input))
binascii.Error: Non-hexadecimal digit found
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)
>>> codecs.encode("hello", "bz2")
Traceback (most recent call last):
File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
return (bz2.compress(input), len(input))
File "/usr/lib/python3.4/bz2.py", line 498, in compress
return comp.compress(data) + comp.flush()
TypeError: 'str' does not support the buffer interface
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)
Slutligen, som exemplen ovan visar, har dessa förbättringar gjort det möjligt att återställa de praktiska alias för icke-Unicode-codecs som själva återställdes i Python 3.2. Detta innebär att kodning av binära data till och från dess hexadecimala representation (till exempel) nu kan skrivas som:
>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'
De binär- och texttransformationer som finns i standardbiblioteket beskrivs närmare i Binära transformationer och Text omvandlas.
(Bidrag från Nick Coghlan i bpo-7475, bpo-17827, bpo-17828 och bpo-19619.)
PEP 451: En ModuleSpec-typ för importsystemet¶
PEP 451 tillhandahåller en inkapsling av informationen om en modul som importmaskineriet kommer att använda för att ladda den (det vill säga en modulspecifikation). Detta hjälper till att förenkla både importimplementationen och flera importrelaterade API:er. Ändringen är också en språngbräda för flera framtida importrelaterade förbättringar.
De ändringar från PEP som vänder sig till allmänheten är helt bakåtkompatibla. Dessutom bör de vara transparenta för alla utom importörsförfattare. Metoderna för nyckelsökare och laddare har utgått, men de kommer att fortsätta att fungera. Nya importörer bör använda de nya metoder som beskrivs i PEP. Befintliga importörer bör uppdateras för att implementera de nya metoderna. Se avsnittet Föråldrat för en lista över metoder som bör ersättas och deras ersättare.
Andra språkliga förändringar¶
Några mindre ändringar som gjorts i Python-språkets kärna är:
Unicode-databasen uppdaterad till UCD version 6.3.
min()
ochmax()
accepterar nu ett default nyckelordsargument som kan användas för att ange det värde de returnerar om den iterabel de utvärderar inte har några element. (Bidrag från Julian Berman i bpo-18111.)Modulobjekt är nu svagt refererbara.
Modulens
__file__
-attribut (och relaterade värden) ska nu alltid innehålla absoluta sökvägar som standard, med undantag för__main__.__file__
när ett skript har exekverats direkt med en relativ sökväg. (Bidrag från Brett Cannon i bpo-18416.)Alla UTF-*-codecs (utom UTF-7) avvisar nu surrogat under både kodning och avkodning om inte felhanteraren
surrogatepass
används, med undantag för UTF-16-avkodaren (som accepterar giltiga surrogatpar) och UTF-16-kodaren (som producerar dem vid kodning av icke-BMP-tecken). (Bidrag från Victor Stinner, Kang-Hao (Kenny) Lu och Serhiy Storchaka i bpo-12892.)Ny tysk EBCDIC codec
cp273
. (Bidrag från Michael Bierenfeld och Andrew Kuchling i bpo-1097797.)Ny ukrainsk codec
cp1125
. (Bidrag från Serhiy Storchaka i bpo-19668.)bytes
.join() ochbytearray
.join() accepterar nu godtyckliga buffertobjekt som argument. (Bidrag från Antoine Pitrou i bpo-15958.)Konstruktorn
int
accepterar nu alla objekt som har en__index__
-metod för sitt base-argument. (Bidrag från Mark Dickinson i bpo-16772.)Frame-objekt har nu en
clear()
-metod som rensar alla referenser till lokala variabler från ramen. (Bidrag från Antoine Pitrou i bpo-17934.)memoryview
är nu registrerad som enSequence
, och stödjerreversed()
builtin. (Bidrag från Nick Coghlan och Claudiu Popa i bpo-18690 och bpo-19078.)Signaturer som rapporteras av
help()
har modifierats och förbättrats i flera fall som ett resultat av införandet av Argument Clinic och andra ändringar i modulernainspect
ochpydoc
.__length_hint__()
är nu en del av den formella språkspecifikationen (se PEP 424). (Bidrag från Armin Ronacher i bpo-16148.)
Nya moduler¶
asyncio¶
Den nya modulen asyncio
(definierad i PEP 3156) tillhandahåller en standardiserad pluggbar modell för händelseslingor i Python, vilket ger ett gediget stöd för asynkron IO i standardbiblioteket och gör det enklare för andra implementeringar av händelseslingor att samverka med standardbiblioteket och varandra.
För Python 3.4 anses denna modul vara ett provisoriskt API.
Se även
- PEP 3156 – Asynkront IO-stöd återstartat: modulen ”asyncio”
PEP skrivs och genomförandet leds av Guido van Rossum.
säkerställa pip¶
Den nya modulen ensurepip
är den primära infrastrukturen för implementeringen av PEP 453. I normala fall behöver slutanvändarna inte interagera med den här modulen, men den kan användas för att manuellt starta upp pip
om den automatiska uppstarten till en installation eller virtuell miljö inte fungerar.
ensurepip
innehåller en buntad kopia av pip
, uppdaterad från och med den första releasekandidaten för den version av CPython som den levereras med (detta gäller både underhållsreleaser och funktionsreleaser). ensurepip
har inte tillgång till internet. Om installationen har tillgång till Internet, efter att ensurepip
har körts, kan den medföljande pip
användas för att uppgradera pip
till en nyare version än den medföljande. (Observera att en sådan uppgraderad version av pip
anses vara ett separat installerat paket och kommer inte att tas bort om Python avinstalleras)
Modulen heter ensure pip eftersom den inte gör någonting om den anropas när pip
redan är installerat. Den har också ett alternativ --upgrade
som gör att den installerar den medföljande kopian av pip
om den befintliga installerade versionen av pip
är äldre än den medföljande kopian.
enum¶
Den nya modulen enum
(definierad i PEP 435) ger en standardimplementering av uppräkningstyper, vilket gör att andra moduler (t.ex. socket
) kan ge mer informativa felmeddelanden och bättre felsökningsstöd genom att ersätta opaka heltalskonstanter med bakåtkompatibla uppräkningsvärden.
Se även
- PEP 435 – Lägga till en Enum-typ i Pythons standardbibliotek
PEP skriven av Barry Warsaw, Eli Bendersky och Ethan Furman, implementerad av Ethan Furman.
sökväg¶
Den nya modulen pathlib
erbjuder klasser som representerar sökvägar i filsystemet med semantik som är lämplig för olika operativsystem. Sökvägsklasserna är uppdelade i rena sökvägar, som tillhandahåller rena beräkningsoperationer utan I/O, och konkreta sökvägar, som ärver från rena sökvägar men också tillhandahåller I/O-operationer.
För Python 3.4 anses denna modul vara ett provisoriskt API.
Se även
- PEP 428 – Pathlib-modulen – objektorienterade sökvägar i filsystemet
PEP skrivet och genomfört av Antoine Pitrou.
väljare¶
Den nya modulen selectors
(skapad som en del av implementeringen av PEP 3156) möjliggör högnivå och effektiv I/O-multiplexering, byggd på select
-modulens primitiver.
statistik¶
Den nya modulen statistics
(definierad i PEP 450) erbjuder en del grundläggande statistikfunktioner direkt i standardbiblioteket. Denna modul stöder beräkning av medelvärde, median, läge, varians och standardavvikelse för en dataserie.
Se även
- PEP 450 – Lägga till en statistikmodul i standardbiblioteket
PEP skrivet och implementerat av Steven D’Aprano
tracemalloc¶
Den nya modulen tracemalloc
(definierad i PEP 454) är ett felsökningsverktyg för att spåra minnesblock som allokerats av Python. Den ger följande information:
Spåra var ett objekt allokerades
Statistik över allokerade minnesblock per filnamn och radnummer: total storlek, antal och genomsnittlig storlek på allokerade minnesblock
Beräkna skillnaderna mellan två ögonblicksbilder för att upptäcka minnesläckor
Se även
- PEP 454 – Lägg till en ny tracemalloc-modul för att spåra Python-minnesallokeringar
PEP skrivet och implementerat av Victor Stinner
Förbättrade moduler¶
abc¶
Ny funktion abc.get_cache_token()
kan användas för att veta när cacher som påverkas av ändringar i objektgrafen ska ogiltigförklaras. (Bidrag från Łukasz Langa i bpo-16832.)
Den nya klassen ABC
har ABCMeta
som metaklass. Att använda ABC
som basklass har i stort sett samma effekt som att ange metaclass=abc.ABCMeta
, men är enklare att skriva och lättare att läsa. (Bidrag från Bruno Dupuis i bpo-16049.)
aifc¶
Metoden getparams()
returnerar nu en namngiven tupel istället för en vanlig tupel. (Bidrag från Claudiu Popa i bpo-17818.)
aifc.open()
har nu stöd för kontexthanteringsprotokollet: när det används i ett with
-block kommer close()
-metoden för det returnerade objektet att anropas automatiskt i slutet av blocket. (Bidrag från Serhiy Storchacha i bpo-16486.)
Metoderna writeframesraw()
och writeframes()
accepterar nu alla bytes-like object. (Bidrag från Serhiy Storchaka i bpo-8311.)
argparse¶
Klassen FileType
accepterar nu encoding och errors argument, som skickas vidare till open()
. (Bidrag från Lucas Maystre i bpo-11175.)
audioop¶
audioop
stöder nu 24-bitars samplingar. (Bidrag från Serhiy Storchaka i bpo-12866.)
Ny byteswap()
-funktion konverterar big-endian-samplingar till little-endian och vice versa. (Bidrag från Serhiy Storchaka i bpo-19641.)
Alla audioop
-funktioner accepterar nu alla bytesliknande objekt. Strängar accepteras inte: de fungerade inte tidigare, nu ger de upphov till ett fel direkt. (Bidrag från Serhiy Storchaka i bpo-16685.)
base64¶
Kodnings- och avkodningsfunktionerna i base64
accepterar nu alla bytesliknande objekt i fall där det tidigare krävdes en instans av bytes
eller bytearray
. (Bidrag från Nick Coghlan i bpo-17839.)
Nya funktioner a85encode()
, a85decode()
, b85encode()
, och b85decode()
ger möjlighet att koda och avkoda binärdata från och till Ascii85
respektive git/mercurial Base85
-formaten. Funktionerna i a85
har alternativ som kan användas för att göra dem kompatibla med olika varianter av kodningen Ascii85
, inklusive Adobe-varianten. (Bidrag från Martin Morrison, Mercurial-projektet, Serhiy Storchaka och Antoine Pitrou i bpo-17618.)
samlingar¶
Metoden ChainMap.new_child()
accepterar nu ett m-argument som anger den underordnade mappningen som ska läggas till i kedjan. Detta gör att en befintlig mappning och/eller en anpassad mappningstyp kan användas för barnet. (Bidrag från Vinay Sajip i bpo-16613.)
färgämnen¶
Antalet siffror i koefficienterna för RGB — YIQ-konverteringarna har utökats så att de stämmer överens med FCC NTSC-versionerna. Förändringen i resultat bör vara mindre än 1% a och kan bättre matcha resultat som finns på andra ställen. (Bidrag från Brian Landers och Serhiy Storchaka i bpo-14323.)
contextlib¶
Den nya contextlib.suppress
kontexthanteraren hjälper till att klargöra avsikten med kod som avsiktligt undertrycker undantag från ett enda uttalande. (Bidrag från Raymond Hettinger i bpo-15806 och Zero Piraeus i bpo-19266.)
Den nya kontexthanteraren contextlib.redirect_stdout()
gör det enklare för verktygsskript att hantera oflexibla API:er som skriver utdata till sys.stdout
och inte ger några alternativ för att omdirigera den. Med hjälp av kontexthanteraren kan utdata från sys.stdout
omdirigeras till valfri annan ström eller, i kombination med io.StringIO
, till en sträng. Det senare kan vara särskilt användbart, till exempel för att fånga utdata från en funktion som skrevs för att implementera ett kommandoradsgränssnitt. Det rekommenderas endast för verktygsskript eftersom det påverkar det globala tillståndet för sys.stdout
. (Bidrag från Raymond Hettinger i bpo-15805.)
Dokumentationen contextlib
har också uppdaterats med en discussion om skillnaderna mellan single use, reusable och reentrant context managers.
dbm¶
dbm.open()
-objekt har nu stöd för kontexthanteringsprotokollet. När det används i en with
-sats kommer databasobjektets close
-metod att anropas automatiskt i slutet av blocket. (Bidrag från Claudiu Popa och Nick Coghlan i bpo-19282.)
dis¶
Funktionerna show_code()
, dis()
, distb()
och disassemble()
accepterar nu ett file-argument som endast innehåller nyckelord och som styr var de skriver sina utdata.
Modulen dis
är nu uppbyggd kring en klass Instruction
som ger objektorienterad tillgång till detaljerna i varje enskild bytecode-operation.
En ny metod, get_instructions()
, tillhandahåller en iterator som emitterar instruktionsflödet för en viss del av Python-koden. Det är alltså nu möjligt att skriva ett program som inspekterar och manipulerar ett bytecode-objekt på andra sätt än de som tillhandahålls av dis
-modulen själv. Till exempel:
>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
... print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE
De olika visningsverktygen i modulen dis
har skrivits om för att använda dessa nya komponenter.
Dessutom finns en ny applikationsvänlig klass Bytecode
som ger ett objektorienterat API för att inspektera bytecode i både läsbar form och för att iterera över instruktioner. Konstruktorn Bytecode
tar samma argument som get_instruction()
gör (plus en valfri current_offset), och det resulterande objektet kan itereras för att producera Instruction
-objekt. Men den har också en dis
-metod, som motsvarar anropet dis
på konstruktörsargumentet, men returneras som en sträng med flera rader:
>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
... print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()
[' 1 0 LOAD_FAST 0 (x)',
' --> 3 LOAD_CONST 1 (1)',
' 6 BINARY_ADD',
' 7 RETURN_VALUE']
Bytecode
har också en klassmetod, from_traceback()
, som ger möjlighet att manipulera en traceback (det vill säga, print(Bytecode.from_traceback(tb).dis())
är likvärdigt med distb(tb)
).
(Bidrag från Nick Coghlan, Ryan Kelly och Thomas Kluyver i bpo-11816 och Claudiu Popa i bpo-17916.)
Ny funktion stack_effect()
beräknar effekten på Python-stacken av en given opcode och argument, information som inte är tillgänglig på annat sätt. (Bidrag från Larry Hastings i bpo-19722.)
doctest¶
En ny alternativflagga, FAIL_FAST
, stoppar testkörningen så snart det första felet upptäcks. (Bidrag från R. David Murray och Daniel Urban i bpo-16522.)
Kommandoradsgränssnittet doctest
använder nu argparse
och har två nya alternativ, -o
och -f
. med -o
kan doctest options anges på kommandoraden, och -f
är en förkortning för -o FAIL_FAST
(för att motsvara det liknande alternativ som stöds av unittest
CLI). (Bidrag från R. David Murray i bpo-11390.)
doctest
kommer nu att hitta doctests i tilläggsmodulen __doc__
strängar. (Bidrag från Zachary Ware i bpo-3158.)
e-post¶
as_string()
accepterar nu ett policy-argument för att åsidosätta standardpolicyn för meddelandet när en strängrepresentation av det genereras. Detta innebär att as_string
nu kan användas under fler omständigheter, istället för att behöva skapa och använda en generator
för att skicka formateringsparametrar till dess flatten
-metod. (Bidrag från R. David Murray i bpo-18600.)
Ny metod as_bytes()
tillagd för att producera en bytesrepresentation av meddelandet på ett sätt som liknar hur as_string
producerar en strängrepresentation. Den accepterar inte maxheaderlen-argumentet, men däremot unixfrom- och policy-argumenten. Metoden Message
__bytes__()
anropar den, vilket innebär att bytes(mymsg)
nu kommer att ge det intuitiva resultatet: ett bytesobjekt som innehåller det fullständigt formaterade meddelandet. (Bidrag från R. David Murray i bpo-18600.)
Meddelandet Message.set_param()
accepterar nu ett replace nyckelordsargument. När det anges kommer den associerade rubriken att uppdateras utan att ändra dess plats i listan över rubriker. För bakåtkompatibilitet är standardinställningen False
. (Bidrag från R. David Murray i bpo-18891.)
Ett par nya underklasser till Message
har lagts till (EmailMessage
och MIMEPart
), tillsammans med en ny undermodul, contentmanager
och ett nytt policy
-attribut content_manager
. All dokumentation finns för närvarande i den nya modulen, som läggs till som en del av email:s nya provisional API. Dessa klasser tillhandahåller ett antal nya metoder som gör det mycket enklare att extrahera innehåll från och infoga innehåll i e-postmeddelanden. För detaljer, se contentmanager
dokumentation och email: Exempel. Dessa API-tillägg fullbordar huvuddelen av det arbete som planerades som en del av email6-projektet. Det nuvarande provisoriska API:et är planerat att bli slutgiltigt i Python 3.5 (eventuellt med några mindre tillägg inom området felhantering). (Bidrag från R. David Murray i bpo-18891.)
filecmp¶
En ny clear_cache()
-funktion gör det möjligt att rensa filecmp
-jämförelsecachen, som använder os.stat()
-information för att avgöra om filen har ändrats sedan den senaste jämförelsen. Detta kan till exempel användas om filen kan ha ändrats och kontrollerats igen på kortare tid än upplösningen av ett visst filsystems fält för filändringstid. (Bidrag från Mark Levitt i bpo-18149.)
Det nya modulattributet DEFAULT_IGNORES
innehåller en lista över kataloger som används som standardvärde för parametern ignore i funktionen dircmp()
. (Bidrag från Eli Bendersky i bpo-15442.)
functools¶
Den nya deskriptorn partialmethod()
gör det möjligt att använda partiella argument i deskriptorer, precis som partial()
gör för vanliga anropsbara metoder. Den nya deskriptorn gör det också lättare att få godtyckliga anropbara metoder (inklusive partial()
-instanser) att bete sig som normala instansmetoder när de ingår i en klassdefinition. (Bidrag från Alon Horev och Nick Coghlan i bpo-4331.)
Den nya singledispatch()
-dekoratorn ger stöd för generiska funktioner med enkel distribution till Pythons standardbibliotek. Där objektorienterad programmering fokuserar på att gruppera flera operationer på en gemensam uppsättning data i en klass, fokuserar en generisk funktion på att gruppera flera implementeringar av en operation som gör att den kan arbeta med olika typer av data.
Se även
- PEP 443 – Generiska funktioner för enstaka leverans
PEP skrivet och genomfört av Łukasz Langa.
total_ordering()
stöder nu ett returvärde av NotImplemented
från den underliggande jämförelsefunktionen. (Bidrag från Katie Miller i bpo-10042.)
En ren Python-version av partial()
-funktionen finns nu i stdlib; i CPython åsidosätts den av den C-accelererade versionen, men den är tillgänglig för andra implementationer att använda. (Bidrag från Brian Thorne i bpo-12428.)
gc¶
Den nya funktionen get_stats()
returnerar en lista med tre lexikon per generation som innehåller statistik över samlingar sedan tolken startades. (Bidrag från Antoine Pitrou i bpo-16351.)
klot¶
En ny funktion escape()
ger ett sätt att undkomma specialtecken i ett filnamn så att de inte blir en del av globbing-expansionen utan istället matchas bokstavligen. (Bidrag från Serhiy Storchaka i bpo-8402.)
hashlib¶
En ny hashlib.pbkdf2_hmac()
-funktion tillhandahåller PKCS#5 lösenordsbaserad nyckeldrivningsfunktion 2. (Bidrag från Christian Heimes i bpo-18582.)
Attributet name
för hashlib
-hashobjekt är nu ett gränssnitt som stöds formellt. Det har alltid funnits i CPythons hashlib
(även om det inte returnerade gemena namn för alla hashar som stöds), men det var inte ett offentligt gränssnitt och därför har vissa andra Python-implementationer inte tidigare stött det. (Bidrag från Jason R. Coombs i bpo-18532.)
hmac¶
hmac
accepterar nu bytearray
såväl som bytes
för argumentet key till funktionen new()
, och parametern msg till både funktionen new()
och metoden update()
accepterar nu alla typer som stöds av modulen hashlib
. (Bidrag från Jonas Borgström i bpo-18240.)
Argumentet digestmod till funktionen hmac.new()
kan nu vara vilket hash digest-namn som helst som känns igen av hashlib
. Dessutom är det nuvarande beteendet där värdet på digestmod är standardvärdet MD5
föråldrat: i en framtida version av Python kommer det inte att finnas något standardvärde. (Bidrag från Christian Heimes i bpo-17276.)
Med tillägget av attributen block_size
och name
(och den formella dokumentationen av attributet digest_size
), överensstämmer nu modulen hmac
helt med API:t PEP 247. (Bidrag från Christian Heimes i bpo-18775.)
html¶
Ny funktion unescape()
konverterar HTML5-teckenreferenser till motsvarande Unicode-tecken. (Bidrag från Ezio Melotti i bpo-2927.)
HTMLParser
accepterar ett nytt nyckelordsargument convert_charrefs som, när det är True
, automatiskt konverterar alla teckenreferenser. För bakåtkompatibilitet är dess värde som standard False
, men det kommer att ändras till True
i en framtida version av Python, så du uppmanas att ställa in det uttryckligen och uppdatera din kod för att använda den här nya funktionen. (Bidrag från Ezio Melotti i bpo-13633.)
Argumentet strict i HTMLParser
är nu föråldrat. (Bidrag från Ezio Melotti i bpo-15114.)
http¶
send_error()
accepterar nu en valfri ytterligare explain parameter som kan användas för att ge en utökad felbeskrivning, som åsidosätter den hårdkodade standardbeskrivningen om det finns en sådan. Denna utökade felbeskrivning formateras med hjälp av attributet error_message_format
och skickas som brödtext i felsvaret. (Bidrag från Karl Cow i bpo-12921.)
http.server
kommandoradsgränssnitt har nu ett -b/--bind
-alternativ som gör att servern lyssnar på en specifik adress. (Bidrag från Malte Swart i bpo-17764.)
idlelib och IDLE¶
Eftersom idlelib implementerar IDLE:s skal och redigerare och inte är avsett att importeras av andra program, förbättras det för varje utgåva. Se Lib/idlelib/NEWS.txt
för en kumulativ lista över ändringar sedan 3.3.0, samt ändringar som görs i framtida 3.4.x utgåvor. Denna fil är också tillgänglig från IDLE:s dialogruta.
importlib¶
ABC:s InspectLoader
definierar en ny metod, source_to_code()
som accepterar källdata och en sökväg och returnerar ett kodobjekt. Standardimplementeringen är likvärdig med compile(data, path, 'exec', dont_inherit=True)
. (Bidrag från Eric Snow och Brett Cannon i bpo-15627.)
InspectLoader
har nu också en standardimplementation för metoden get_code()
. Det kommer dock normalt att vara önskvärt att åsidosätta standardimplementationen av prestandaskäl. (Bidrag från Brett Cannon i bpo-18072.)
Funktionen reload()
har flyttats från imp
till importlib
som en del av imp
modulen deprecation. (Bidrag från Berker Peksag i bpo-18193.)
importlib.util
har nu ett MAGIC_NUMBER
-attribut som ger tillgång till bytekodsversionsnumret. Detta ersätter funktionen get_magic()
i den utfasade modulen imp
. (Bidrag från Brett Cannon i bpo-18192.)
De nya funktionerna importlib.util
cache_from_source()
och source_from_cache()
ersätter funktionerna med samma namn i den föråldrade modulen imp
. (Bidrag från Brett Cannon i bpo-18194.)
importlib
bootstrap NamespaceLoader
överensstämmer nu med InspectLoader
ABC, vilket innebär att runpy
och python -m
nu kan användas med namespace-paket. (Bidrag från Brett Cannon i bpo-18058.)
importlib.util
har en ny funktion decode_source()
som avkodar källkod från bytes med hjälp av universal newline processing. Detta är användbart för att implementera InspectLoader.get_source()
-metoder.
importlib.machinery.ExtensionFileLoader
har nu en get_filename()
-metod. Detta utelämnades oavsiktligt i den ursprungliga implementationen. (Bidrag från Eric Snow i bpo-19152.)
inspektera¶
Modulen inspect
erbjuder nu ett grundläggande kommandoradsgränssnitt för att snabbt visa källkod och annan information för moduler, klasser och funktioner. (Bidrag från Claudiu Popa och Nick Coghlan i bpo-18626.)
unwrap()
gör det enkelt att lösa upp kedjor av omslagsfunktioner som skapats av functools.wraps()
(och alla andra API:er som sätter attributet __wrapped__
på en omslagsfunktion). (Bidrag från Daniel Urban, Aaron Iles och Nick Coghlan i bpo-13266.)
Som en del av implementeringen av den nya modulen enum
har modulen inspect
nu betydligt bättre stöd för anpassade __dir__
-metoder och dynamiska klassattribut som tillhandahålls genom metaklasser. (Bidrag från Ethan Furman i bpo-18929 och bpo-19030.)
getfullargspec()
och getargspec()
använder nu API:et signature()
. Detta gör att de kan stödja ett mycket bredare spektrum av anropbara objekt, inklusive sådana med attributet __signature__
, sådana med metadata som tillhandahålls av argumentkliniken, functools.partial()
-objekt och mer. Observera att till skillnad från signature()
ignorerar dessa funktioner fortfarande attributen __wrapped__
och rapporterar det redan bundna första argumentet för bundna metoder, så det är fortfarande nödvändigt att uppdatera din kod för att använda signature()
direkt om dessa funktioner önskas. (Bidrag från Yury Selivanov i bpo-17481.)
signature()
har nu stöd för CPython-funktioner av typen duck, vilket ger stöd för funktioner kompilerade med Cython. (Bidrag från Stefan Behnel och Yury Selivanov i bpo-17159.)
ipadress¶
ipaddress
lades till i standardbiblioteket i Python 3.3 som ett provisoriskt API. Med lanseringen av Python 3.4 har denna kvalifikation tagits bort: ipaddress
betraktas nu som ett stabilt API, som omfattas av de normala kraven för standardbiblioteket för att upprätthålla bakåtkompatibilitet.
En ny is_global
egenskap är True
om en adress är globalt dirigerbar. (Bidrag från Peter Moody i bpo-17400.)
loggning¶
TimedRotatingFileHandler
har en ny atTime parameter som kan användas för att ange när på dygnet rollover ska ske. (Bidrag från Ronald Oussoren i bpo-9556.)
SocketHandler
och DatagramHandler
har nu stöd för Unix domänuttag (genom att sätta port till None
). (Bidrag från Vinay Sajip i commit ce46195b56a9.)
fileConfig()
accepterar nu en underklassinstans av configparser.RawConfigParser
för parametern fname. Detta gör det lättare att använda en konfigurationsfil när loggningskonfigurationen bara är en del av den övergripande programkonfigurationen, eller när programmet ändrar konfigurationen innan den skickas till fileConfig()
. (Bidrag från Vinay Sajip i bpo-16110.)
Loggningskonfigurationsdata som tas emot från en socket via funktionen logging.config.listen()
kan nu valideras innan de bearbetas genom att ange en verifieringsfunktion som argument till det nya nyckelordsargumentet verify. (Bidrag från Vinay Sajip i bpo-15452.)
marshal¶
Standardversionen av marshal
har ökats till 3. Koden som implementerar den nya versionen återställer Python2-beteendet att endast registrera en kopia av internerade strängar och bevara interneringen vid deserialisering, och utökar denna ”en kopia”-förmåga till alla objekttyper (inklusive hantering av rekursiva referenser). Detta minskar både storleken på .pyc
-filer och mängden minne som en modul upptar i minnet när den laddas från en .pyc
(eller .pyo
) fil. (Bidrag från Kristján Valur Jónsson i bpo-16475, med ytterligare hastighetsökningar av Antoine Pitrou i bpo-19219.)
mmap¶
mmap-objekt är nu svagt refererbara. (Bidrag från Valerie Lambert i bpo-4885.)
multiprocessing¶
På Unix har två nya startmetoder, spawn
och forkserver
, lagts till för att starta processer som använder multiprocessing
. Dessa gör blandningen av processer med trådar mer robust, och metoden spawn
matchar den semantik som multiprocessing alltid har använt i Windows. Ny funktion get_all_start_methods()
rapporterar alla startmetoder som finns tillgängliga på plattformen, get_start_method()
rapporterar den aktuella startmetoden och set_start_method()
ställer in startmetoden. (Bidrag från Richard Oudkerk i bpo-8713.)
multiprocessing
har nu också konceptet context
, som avgör hur barnprocesser skapas. Ny funktion get_context()
returnerar ett sammanhang som använder en angiven startmetod. Den har samma API som själva modulen multiprocessing
, så du kan använda den för att skapa Pool
och andra objekt som kommer att fungera i det sammanhanget. Detta gör att ett ramverk och en applikation eller olika delar av samma applikation kan använda multiprocessing utan att störa varandra. (Bidrag från Richard Oudkerk i bpo-18999.)
Förutom när den gamla startmetoden fork används, ärver inte längre barnprocesser onödiga handtag/filbeskrivare från sina föräldrar (del av bpo-8713).
multiprocessing
förlitar sig nu på runpy
(som implementerar -m
-omkopplaren) för att initiera __main__
på rätt sätt i underordnade processer när startmetoderna spawn
eller forkserver
används. Detta löser några kantfall där kombinationen av multiprocessing, kommandoradsbytet -m
och explicit relativ import kunde orsaka obskyra fel i underordnade processer. (Bidrag från Nick Coghlan i bpo-19946.)
operator¶
Den nya funktionen length_hint()
ger en implementation av specifikationen för hur specialmetoden __length_hint__()
skall användas, som en del av den formella specifikationen PEP 424 för denna språkfunktion. (Bidrag från Armin Ronacher i bpo-16148.)
Det finns nu en ren Python-version av modulen operator
tillgänglig för referens och för användning av alternativa implementationer av Python. (Bidrag från Zachary Ware i bpo-16694.)
os¶
Det finns nya funktioner för att hämta och ställa in inheritable flag för en filbeskrivning (os.get_inheritable()
, os.set_inheritable()
) eller ett Windows-handtag (os.get_handle_inheritable()
, os.set_handle_inheritable()
).
Den nya funktionen cpu_count()
rapporterar antalet tillgängliga processorer på plattformen som Python körs på (eller None
om antalet inte kan bestämmas). Funktionen multiprocessing.cpu_count()
är nu implementerad i termer av denna funktion). (Bidrag från Trent Nelson, Yogesh Chaudhari, Victor Stinner och Charles-François Natali i bpo-17914.)
os.path.samestat()
är nu tillgänglig på Windows-plattformen (och os.path.samefile()
-implementationen delas nu mellan Unix och Windows). (Bidrag från Brian Curtin i bpo-11939.)
os.path.ismount()
känner nu igen volymer som är monterade under en enhetsrot i Windows. (Bidrag från Tim Golden i bpo-9035.)
os.open()
stöder två nya flaggor på plattformar som tillhandahåller dem, O_PATH
(oöppnad filbeskrivare) och O_TMPFILE
(namnlös temporär fil; från och med version 3.4.0 endast tillgänglig på Linux-system med en kärnversion av 3.11 eller nyare som har uapi-headers). (Bidrag från Christian Heimes i bpo-18673 respektive Benjamin Peterson.)
pdb¶
pdb
har förbättrats för att hantera generatorer, yield
och yield from
på ett mer användbart sätt. Detta är särskilt användbart vid felsökning av asyncio
-baserade program. (Bidrag från Andrew Svetlov och Xavier de Gaye i bpo-16596.)
Kommandot print
har tagits bort från pdb
, vilket återställer åtkomsten till Python print()
-funktionen från pdb-kommandoraden. Python2:s pdb
hade inget print
-kommando, utan när man skrev print
utfördes print
-satsen. I Python3 gjordes print
av misstag till ett alias för kommandot pdb p
. p
skriver dock ut repr
av sitt argument, inte str
som kommandot print
i Python2 gjorde. Än värre var att Python3-kommandot pdb print
skuggade Python3-funktionen print
, vilket gjorde den otillgänglig vid pdb
-prompten. (Bidrag från Connor Osborn i bpo-18764.)
gurka¶
pickle
har nu stöd för (men använder inte som standard) ett nytt pickle-protokoll, protokoll 4. Detta nya protokoll tar upp ett antal problem som fanns i tidigare protokoll, t.ex. serialisering av nästlade klasser, mycket stora strängar och behållare samt klasser vars __new__()
-metod endast tar nyckelordsargument. Det ger också vissa effektivitetsförbättringar.
Se även
- PEP 3154 – Pickle protokoll 4
PEP skriven av Antoine Pitrou och implementerad av Alexandre Vassalotti.
plistlib¶
plistlib
har nu ett API som liknar standardmönstret för stdlib-serialiseringsprotokoll, med nya funktioner load()
, dump()
, loads()
och dumps()
. (Det äldre API:et är nu föråldrat.) Förutom det redan stödda XML-plistformatet (FMT_XML
), stöds nu även det binära plistformatet (FMT_BINARY
). (Bidrag från Ronald Oussoren och andra i bpo-14455.)
poplib¶
Två nya metoder har lagts till i poplib
: capa()
, som returnerar listan över funktioner som annonseras av POP-servern, och stls()
, som växlar en POP3-session i klartext till en krypterad POP3-session om POP-servern stöder det. (Bidrag från Lorenzo Catucci i bpo-4473.)
tryck¶
Modulen pprint
:s klass PrettyPrinter
och dess funktioner pformat()
och pprint()
har ett nytt alternativ, compact, som styr hur utdata formateras. Om compact för närvarande sätts till True
innebär det att sekvenser skrivs ut med så många sekvenselement som ryms inom bredd på varje (indragen) rad. (Bidrag från Serhiy Storchaka i bpo-19132.)
Långa strängar omsluts nu med Pythons normala syntax för radfortsättning. (Bidrag från Antoine Pitrou i bpo-17150.)
pty¶
pty.spawn()
returnerar nu statusvärdet från os.waitpid()
på barnprocessen, istället för None
. (Bidrag från Gregory P. Smith.)
pydoc¶
Modulen pydoc
är nu baserad direkt på introspektions-API:t inspect.signature()
, vilket gör att den kan tillhandahålla signaturinformation för ett större antal anropsbara objekt. Den här ändringen innebär också att __wrapped__
-attribut nu tas med i beräkningen när hjälpinformation visas. (Bidrag från Larry Hastings i bpo-19674.)
Modulen pydoc
visar inte längre parametern self
för redan bundna metoder. Istället strävar den efter att alltid visa den exakta aktuella signaturen för den medföljande anropbara koden. (Bidrag från Larry Hastings i bpo-20710.)
Förutom de ändringar som har gjorts i pydoc
direkt, har dess hantering av anpassade __dir__
-metoder och olika beskrivningsbeteenden också förbättrats avsevärt genom de underliggande ändringarna i modulen inspect
.
Eftersom inbyggda help()
baseras på pydoc
, påverkar ovanstående ändringar även beteendet hos help()
.
re¶
Nya fullmatch()
-funktionen och regex.fullmatch()
-metoden förankrar mönstret i båda ändarna av den sträng som ska matchas. Detta ger ett sätt att vara explicit om målet med matchningen, vilket undviker en klass av subtila buggar där $
-tecken går förlorade under kodändringar eller tillägg av alternativ till ett befintligt reguljärt uttryck. (Bidrag från Matthew Barnett i bpo-16203.)
Återgivningen av regex objects innehåller nu mönstret och flaggorna; återgivningen av match objects innehåller nu början, slutet och den del av strängen som matchade. (Bidrag från Hugo Lopes Tavares och Serhiy Storchaka i bpo-13592 och bpo-17087.)
resurs¶
Den nya funktionen prlimit()
, tillgänglig på Linux-plattformar med en kärnversion av 2.6.36 eller senare och glibc av 2.13 eller senare, ger möjlighet att fråga efter eller ställa in resursgränser för andra processer än den som gör anropet. (Bidrag från Christian Heimes i bpo-16595.)
I Linux-kärnan version 2.6.36 eller senare finns det också några nya Linux-specifika konstanter: RLIMIT_MSGQUEUE
, RLIMIT_NICE
, RLIMIT_RTPRIO
, RLIMIT_RTTIME
och RLIMIT_SIGPENDING
. (Bidrag från Christian Heimes i bpo-19324.)
På FreeBSD version 9 och senare finns det några nya FreeBSD-specifika konstanter: RLIMIT_SBSIZE
, RLIMIT_SWAP
, och RLIMIT_NPTS
. (Bidrag från Claudiu Popa i bpo-19343.)
välj¶
epoll
-objekt har nu stöd för kontexthanteringsprotokollet. När det används i en with
-sats kommer close()
-metoden att anropas automatiskt i slutet av blocket. (Bidrag från Serhiy Storchaka i bpo-16488.)
devpoll
-objekt har nu metoderna fileno()
och close()
, samt ett nytt attribut closed
. (Bidrag från Victor Stinner i bpo-18794.)
hylla¶
Shelf
-instanser kan nu användas i with
-satser, och kommer automatiskt att stängas i slutet av with
-blocket. (Bidrag från Filip Gruszczyński i bpo-13896.)
shutil¶
copyfile()
ger nu upphov till en specifik Error
-underklass, SameFileError
, när källan och destinationen är samma fil, vilket gör det möjligt för ett program att vidta lämpliga åtgärder vid detta specifika fel. (Bidrag från Atsuo Ishimoto och Hynek Schlawack i bpo-1492704.)
smtpd¶
Klasserna SMTPServer
och SMTPChannel
accepterar nu ett map nyckelordsargument som, om det anges, skickas in till asynchat.async_chat
som dess map argument. Detta gör att ett program kan undvika att påverka den globala socketkartan. (Bidrag från Vinay Sajip i bpo-11959.)
smtplib¶
SMTPException
är nu en underklass till OSError
, vilket gör att både fel på socketnivå och fel på SMTP-protokollnivå kan fångas upp i en try/except-sats av kod som bara bryr sig om huruvida ett fel inträffade eller inte. (Bidrag från Ned Jackson Lovely i bpo-2118.)
kortplats¶
Socket-modulen stöder nu CAN_BCM
-protokollet på plattformar som stöder det. (Bidrag från Brian Thorne i bpo-15359.)
Socket-objekt har nya metoder för att hämta eller ställa in sin inheritable flag, get_inheritable()
och set_inheritable()
.
Konstanterna socket.AF_*
och socket.SOCK_*
är nu uppräkningsvärden med hjälp av den nya modulen enum
. Detta gör att meningsfulla namn kan skrivas ut under felsökning, istället för ”magiska siffror” i heltal.
Konstanten AF_LINK
är nu tillgänglig på BSD och OSX.
inet_pton()
och inet_ntop()
stöds nu i Windows. (Bidrag från Atsuo Ishimoto i bpo-7171.)
sqlite3¶
En ny boolesk parameter till funktionen connect()
, uri, kan användas för att indikera att parametern database är en uri
(se SQLite URI documentation). (Bidrag från poq i bpo-13773.)
ssl¶
PROTOCOL_TLSv1_1
och PROTOCOL_TLSv1_2
(stöd för TLSv1.1 och TLSv1.2) har lagts till; stöd för dessa protokoll är endast tillgängligt om Python är länkat med OpenSSL 1.0.1 eller senare. (Bidrag från Michele Orrù och Antoine Pitrou i bpo-16692.)
Den nya funktionen create_default_context()
tillhandahåller ett standardiserat sätt att erhålla en SSLContext
vars inställningar är avsedda att vara en rimlig balans mellan kompatibilitet och säkerhet. Dessa inställningar är strängare än de standardinställningar som tillhandahålls av SSLContext
-konstruktören och kan justeras i framtiden, utan föregående avskrivning, om säkerhetskraven för bästa praxis ändras. Den nya rekommenderade bästa praxis för att använda stdlib-bibliotek som stöder SSL är att använda create_default_context()
för att erhålla ett SSLContext
-objekt, modifiera det vid behov och sedan skicka det som context-argumentet för lämpligt stdlib-API. (Bidrag från Christian Heimes i bpo-19689.)
SSLContext
method load_verify_locations()
accepterar ett nytt valfritt argument cadata, som kan användas för att tillhandahålla PEM- eller DER-kodade certifikat direkt via strängar respektive bytes. (Bidrag från Christian Heimes i bpo-18138.)
Den nya funktionen get_default_verify_paths()
returnerar en namngiven tupel av de sökvägar och miljövariabler som metoden set_default_verify_paths()
använder för att ställa in OpenSSL:s standard cafile
och capath
. Detta kan vara till hjälp vid felsökning av problem med standardverifiering. (Bidrag från Christian Heimes i bpo-18143.)
SSLContext
har en ny metod, cert_store_stats()
, som rapporterar antalet laddade X.509
-certifikat, X.509 CA
-certifikat och listor över återkallade certifikat (crl
), samt en metod get_ca_certs()
som returnerar en lista över laddade CA
-certifikat. (Bidrag från Christian Heimes i bpo-18147.)
Om OpenSSL 0.9.8 eller senare är tillgängligt har SSLContext
ett nytt attribut verify_flags
som kan användas för att styra certifikatverifieringsprocessen genom att ställa in det på en kombination av de nya konstanterna VERIFY_DEFAULT
, VERIFY_CRL_CHECK_LEAF
, VERIFY_CRL_CHECK_CHAIN
, eller VERIFY_X509_STRICT
. OpenSSL gör inte någon CRL-verifiering som standard. (Bidrag från Christien Heimes i bpo-8813.)
Ny SSLContext
-metod load_default_certs()
laddar en uppsättning standardcertifikat för ”certifikatutfärdare” (CA) från standardplatser, som varierar beroende på plattform. Det kan användas för att ladda både TLS-certifikat för webbserverautentisering (purpose=
SERVER_AUTH
) som en klient kan använda för att verifiera en server och certifikat som en server kan använda för att verifiera klientcertifikat (purpose=
CLIENT_AUTH
). (Bidrag från Christian Heimes i bpo-19292.)
Två nya funktioner som endast finns i Windows, enum_certificates()
och enum_crls()
, gör det möjligt att hämta certifikat, certifikatinformation och CRL:er från Windows certifikatarkiv. (Bidrag från Christian Heimes i bpo-17134.)
Stöd för SNI (Server Name Indication) på serversidan med hjälp av den nya metoden ssl.SSLContext.set_servername_callback()
. (Bidrag från Daniel Black i bpo-8109.)
Den ordbok som returneras av SSLSocket.getpeercert()
innehåller ytterligare X509v3
tilläggsobjekt: crlDistributionPoints
, calIssuers
och OCSP
URI:er. (Bidrag från Christian Heimes i bpo-18379.)
stat¶
Modulen stat
backas nu upp av en C-implementation i _stat
. En C-implementering krävs eftersom de flesta värden inte är standardiserade och är plattformsberoende. (Bidrag från Christian Heimes i bpo-11016.)
Modulen stöder de nya flaggorna ST_MODE
, S_IFDOOR
, S_IFPORT
och S_IFWHT
. (Bidrag från Christian Hiemes i bpo-11016.)
struktur¶
Ny funktion iter_unpack
och en ny struct.Struct.iter_unpack()
-metod för kompilerade format ger strömmad uppackning av en buffert som innehåller upprepade instanser av ett visst dataformat. (Bidrag från Antoine Pitrou i bpo-17804.)
delprocess¶
check_output()
accepterar nu ett input-argument som kan användas för att ange innehållet i stdin
för det kommando som körs. (Bidrag från Zack Weinberg i bpo-16624.)
getstatus()
och getstatusoutput()
fungerar nu på Windows. Denna ändring gjordes faktiskt oavsiktligt i 3.3.4. (Bidrag från Tim Golden i bpo-10197.)
sunau¶
Metoden getparams()
returnerar nu en namngiven tupel istället för en vanlig tupel. (Bidrag från Claudiu Popa i bpo-18901.)
sunau.open()
stöder nu kontexthanteringsprotokollet: när det används i ett with
block, kommer close
metoden för det returnerade objektet att anropas automatiskt i slutet av blocket. (Bidrag från Serhiy Storchaka i bpo-18878.)
AU_write.setsampwidth()
stöder nu 24 bitars samplingar, vilket ger stöd för att skriva 24 samplingar med modulen. (Bidrag från Serhiy Storchaka i bpo-19261.)
Metoderna writeframesraw()
och writeframes()
accepterar nu alla bytes-like object. (Bidrag från Serhiy Storchaka i bpo-8311.)
system¶
Den nya funktionen sys.getallocatedblocks()
returnerar det aktuella antalet block som tolken har allokerat. (I CPython med standardinställningen --with-pymalloc
är detta allokeringar som görs via API:et PyObject_Malloc()
) Detta kan vara användbart för att spåra minnesläckor, speciellt om det är automatiserat via en testsvit. (Bidrag från Antoine Pitrou i bpo-13390.)
När Python-tolken startar i interactive mode, kontrollerar den om det finns ett __interactivehook__
-attribut i sys
-modulen. Om attributet finns anropas dess värde utan argument precis innan det interaktiva läget startas. Kontrollen görs efter att filen PYTHONSTARTUP
har lästs, så det kan ställas in där. Modulen site
sets it till en funktion som möjliggör tabbkomplettering och historiksparande (i ~/.python-history
) om plattformen stöder readline
. Om du inte vill ha det här (nya) beteendet kan du åsidosätta det i PYTHONSTARTUP
, sitecustomize
eller usercustomize
genom att ta bort det här attributet från sys
(eller ställa in det på någon annan callable). (Bidrag från Éric Araujo och Antoine Pitrou i bpo-5845.)
tarfil¶
Modulen tarfile
har nu stöd för en enkel Kommandoradsgränssnitt när den anropas som ett skript direkt eller via -m
. Detta kan användas för att skapa och extrahera tarfile-arkiv. (Bidrag från Berker Peksag i bpo-13477.)
textbrytning¶
Klassen TextWrapper
har två nya attribut/konstruktörsargument: max_lines
, som begränsar antalet rader i utdata, och placeholder
, som är en sträng som kommer att visas i slutet av utdata om den har avkortats på grund av max_lines. En ny bekvämlighetsfunktion shorten()
bygger vidare på dessa möjligheter och komprimerar alla blanksteg i indata till enstaka blanksteg och producerar en enda rad med en given bredd som slutar med platshållaren (som standard [...]
). (Bidrag från Antoine Pitrou och Serhiy Storchaka i bpo-18585 och bpo-18725.)
gängning¶
Objektet Thread
som representerar huvudtråden kan erhållas från den nya funktionen main_thread()
. Under normala förhållanden kommer detta att vara den tråd från vilken Python-tolken startades. (Bidrag från Andrew Svetlov i bpo-18882.)
spårning¶
En ny traceback.clear_frames()
-funktion tar ett traceback-objekt och rensar de lokala variablerna i alla de frames som den refererar till, vilket minskar mängden minne som förbrukas. (Bidrag från Andrew Kuchling i bpo-1565525.)
typer¶
En ny DynamicClassAttribute()
-deskriptor ger möjlighet att definiera ett attribut som fungerar normalt när det söks upp via ett instansobjekt, men som dirigeras till klassen __getattr__
när det söks upp via klassen. Detta gör att man kan ha egenskaper som är aktiva på en klass och ha virtuella attribut på klassen med samma namn (se Enum
för ett exempel). (Bidrag från Ethan Furman i bpo-19030.)
urllib¶
urllib.request
stöder nu data:
URL:er via DataHandler
-klassen. (Bidrag från Mathias Panzenböck i bpo-16423.)
Den http-metod som kommer att användas av en Request
-klass kan nu specificeras genom att ange ett method
-klassattribut på underklassen. (Bidrag från Jason R Coombs i bpo-18978.)
Request
-objekt är nu återanvändbara: om attributen full_url
eller data
ändras, uppdateras alla relevanta interna egenskaper. Detta innebär t.ex. att det nu är möjligt att använda samma request
-objekt i mer än ett OpenerDirector.open()
-anrop med olika data-argument, eller att modifiera en request
’s url
i stället för att beräkna den från början. Det finns också en ny remove_header()
-metod som kan användas för att ta bort headers från en Request
. (Bidrag från Alexey Kachayev i bpo-16464, Daniel Wozniak i bpo-17485, och Damien Brecht och Senthil Kumaran i bpo-17272.)
HTTPError
-objekt har nu ett headers
-attribut som ger tillgång till de HTTP-svarshuvuden som är associerade med felet. (Bidrag från Berker Peksag i bpo-15701.)
unittest¶
Klassen TestCase
har en ny metod, subTest()
, som producerar en kontexthanterare vars with
-block blir ett ”sub-test”. Denna kontexthanterare gör det möjligt för en testmetod att dynamiskt generera undertest genom att t.ex. anropa kontexthanteraren subTest
i en loop. En enda testmetod kan därmed producera ett obegränsat antal separat identifierade och separat räknade tester, som alla kommer att köras även om ett eller flera av dem misslyckas. Till exempel:
klass NumbersTest(unittest.TestCase):
def test_even(self):
för i i intervall(6):
med self.subTest(i=i):
self.assertEqual(i % 2, 0)
kommer att resultera i sex deltester, var och en identifierad i unittest verbose-utdata med en etikett som består av variabelnamnet i
och ett visst värde för den variabeln (i=0
, i=1
, etc). Se Särskiljande av testiterationer med hjälp av deltest för den fullständiga versionen av detta exempel. (Bidrag från Antoine Pitrou i bpo-16997.)
unittest.main()
accepterar nu en iterabel av testnamn för defaultTest, där den tidigare endast accepterade ett enda testnamn som en sträng. (Bidrag från Jyrki Pulliainen i bpo-15132.)
Om SkipTest
aktiveras under testupptäckt (dvs. på modulnivå i testfilen), rapporteras det nu som en skip istället för ett fel. (Bidrag från Zach Ware i bpo-16935.)
discover()
sorterar nu de upptäckta filerna för att ge konsekvent testordning. (Bidrag från Martin Melin och Jeff Ramnani i bpo-16709.)
TestSuite
släpper nu referenser till tester så snart testet har körts, om testet är framgångsrikt. På Python-tolkar som gör garbage collection, gör detta att testerna kan garbage collectas om inget annat har en referens till testet. Det är möjligt att åsidosätta detta beteende genom att skapa en TestSuite
-underklass som definierar en anpassad _removeTestAtIndex
-metod. (Bidrag från Tom Wardill, Matt McClure och Andrew Svetlov i bpo-11798.)
En ny kontexthanterare för testpåståenden, assertLogs()
, säkerställer att ett visst kodblock skickar ett loggmeddelande med modulen logging
. Som standard kan meddelandet komma från vilken logger som helst och ha en prioritet på INFO
eller högre, men både loggarens namn och en alternativ lägsta loggningsnivå kan anges. Objektet som returneras av kontexthanteraren kan efterfrågas för LogRecord
s och/eller formaterade meddelanden som loggades. (Bidrag från Antoine Pitrou i bpo-18937.)
Test discovery fungerar nu med namespace-paket (Bidrag från Claudiu Popa i bpo-17457.)
unittest.mock
-objekt inspekterar nu sina specifikationssignaturer när de matchar anrop, vilket innebär att ett argument nu kan matchas med antingen position eller namn, istället för bara med position. (Bidrag från Antoine Pitrou i bpo-17015.)
mock_open()
-objekt har nu metoderna readline
och readlines
. (Bidrag från Toshio Kuratomi i bpo-17467.)
ven¶
venv
innehåller nu aktiveringsskript för skalen csh
och fish
. (Bidrag från Andrew Svetlov i bpo-15417.)
EnvBuilder
och bekvämlighetsfunktionen create()
tar ett nytt nyckelordsargument with_pip, som standard är False
, som kontrollerar om EnvBuilder
säkerställer att pip
är installerat i den virtuella miljön eller inte. (Bidrag från Nick Coghlan i bpo-19552 som en del av PEP 453-implementationen)
våg¶
Metoden getparams()
returnerar nu en namedtuple istället för en vanlig tuple. (Bidrag från Claudiu Popa i bpo-17487.)
wave.open()
stöder nu protokollet för kontexthantering. (Bidrag från Claudiu Popa i bpo-17616.)
wave
kan nu skriva utdata till filer som inte kan sökas. (Bidrag från David Jones, Guilherme Polo och Serhiy Storchaka i bpo-5202.)
Metoderna writeframesraw()
och writeframes()
accepterar nu alla bytes-like object. (Bidrag från Serhiy Storchaka i bpo-8311.)
svagref¶
Ny WeakMethod
-klass simulerar svaga referenser till bundna metoder. (Bidrag från Antoine Pitrou i bpo-14631.)
Ny finalize
-klass gör det möjligt att registrera en återuppringning som ska anropas när ett objekt samlas in, utan att behöva hantera livscykeln för själva den svaga referensen. (Bidrag från Richard Oudkerk i bpo-15528.)
Den eventuella återuppringning som är associerad med en ref
visas nu via attributet __callback__
. (Bidrag från Mark Dickinson i bpo-17643.)
xml.etree¶
En ny parser, XMLPullParser
, gör det möjligt för en icke-blockerande applikation att parsa XML-dokument. Ett exempel kan ses på Pull API för icke-blockerande parsing. (Bidrag från Antoine Pitrou i bpo-17741.)
Funktionerna xml.etree.ElementTree
tostring()
och tostringlist()
, samt ElementTree
write()
method, har nu en short_empty_elements keyword-only parameter som ger kontroll över om element utan innehåll skrivs i förkortad (<tag />
) eller utökad (<tag></tag>
) form. (Bidrag från Ariel Poliak och Serhiy Storchaka i bpo-14377.)
zip-fil¶
Metoden writepy()
i klassen PyZipFile
har ett nytt alternativ filterfunc som kan användas för att styra vilka kataloger och filer som läggs till i arkivet. Detta kan t.ex. användas för att utesluta testfiler från arkivet. (Bidrag från Christian Tismer i bpo-19274.)
Parametern allowZip64 till ZipFile
och PyZipfile
är nu True
som standard. (Bidrag från William Mallard i bpo-17201.)
Ändringar i CPython-implementeringen¶
PEP 445: Anpassning av CPythons minnesallokatorer¶
PEP 445 lägger till nya gränssnitt på C-nivå för att anpassa minnesallokeringen i CPython-tolken.
Se även
- PEP 445 – Lägg till nya API:er för att anpassa Pythons minnesallokatorer
PEP skrivet och implementerat av Victor Stinner.
PEP 442: Slutförande av säkert objekt¶
PEP 442 tar bort de nuvarande begränsningarna och konstigheterna med objektavslut i CPython. Med den kan objekt med __del__()
-metoder, liksom generatorer med finally
-klausuler, slutföras när de är en del av en referenscykel.
Som en del av denna förändring sätts modulglobaler inte längre med våld till None
under tolkens avstängning i de flesta fall, utan förlitar sig istället på den normala driften av den cykliska skräpsamlaren. Detta undviker en hel klass av tolkningsavstängningsfel, vanligtvis involverande __del__
-metoder, som har plågat Python sedan den cykliska GC först introducerades.
Se även
- PEP 442 – Slutförande av säkert objekt
PEP skrivet och genomfört av Antoine Pitrou.
PEP 456: Säker och utbytbar hashalgoritm¶
PEP 456 följer upp tidigare säkerhetsfixar som gjorts på Pythons hash-algoritm för att hantera vissa DOS-attacker som API:er som vänder sig till allmänheten och som stöds av ordboksuppslagningar kan utsättas för. (Se bpo-14621 för starten av den aktuella förbättringsrundan.) PEP:n förenar CPythons hashkod för att göra det lättare för en pakettillverkare att ersätta en annan hashalgoritm, och byter Pythons standardimplementation till en SipHash-implementation på plattformar som har en 64-bitars datatyp. Eventuella prestandaskillnader i jämförelse med den äldre FNV-algoritmen är triviala.
PEP:n lägger till ytterligare fält i sys.hash_info
named tuple för att beskriva den hashalgoritm som används av den binärfil som körs för tillfället. I övrigt ändrar PEP:n inte några befintliga CPython API:er.
PEP 436: Argumentklinik¶
”Argument Clinic” (PEP 436) är nu en del av CPythons byggprocess och kan användas för att förenkla processen med att definiera och underhålla korrekta signaturer för builtins och standardbibliotekets tilläggsmoduler som implementeras i C.
Vissa tilläggsmoduler i standardbiblioteket har konverterats för att använda Argument Clinic i Python 3.4, och pydoc
och inspect
har uppdaterats i enlighet med detta.
Det förväntas att signaturmetadata för programmatisk introspektion kommer att läggas till ytterligare anropbara filer som implementeras i C som en del av Python 3.4 underhållsversioner.
Anteckning
Argument Clinic PEP är inte helt uppdaterad med läget för implementationen. Detta har ansetts acceptabelt av release manager och core development team i det här fallet, eftersom Argument Clinic inte kommer att göras tillgängligt som ett offentligt API för tredjepartsbruk i Python 3.4.
Se även
- PEP 436 – Argumentkliniken DSL
PEP skrivet och implementerat av Larry Hastings.
Andra ändringar i Build och C API¶
Den nya
PyType_GetSlot()
-funktionen har lagts till i det stabila ABI:t, vilket gör det möjligt att hämta funktionspekare från namngivna typslots när man använder det begränsade API:t. (Bidrag från Martin von Löwis i bpo-17162.)Det nya
Py_SetStandardStreamEncoding()
förinitialiserings-API:et gör det möjligt för applikationer som bäddar in CPython-tolken att på ett tillförlitligt sätt tvinga fram en viss kodning och felhantering för standardströmmarna. (Bidrag från Bastien Montagne och Nick Coghlan i bpo-16129.)De flesta Python C API:er som inte muterar strängargument är nu korrekt markerade som att de accepterar
const char *
istället förchar *
. (Bidrag från Serhiy Storchaka i bpo-1772673.)En ny shell-version av
python-config
kan användas även när en python-tolk inte är tillgänglig (t.ex. i cross compilation-scenarier).PyUnicode_FromFormat()
stöder nu bredd- och precisionsspecifikationer för%s
,%A
,%U
,%V
,%S
och%R
. (Bidrag från Ysj Ray och Victor Stinner i bpo-7330.)Den nya funktionen
PyStructSequence_InitType2()
kompletterar den befintliga funktionenPyStructSequence_InitType()
. Skillnaden är att den returnerar0
vid framgång och-1
vid misslyckande.CPython-källan kan nu kompileras med hjälp av funktionerna för kontroll av adresssäkerheten i de senaste versionerna av GCC och clang: de falska larmen i allokatorn för små objekt har tystnat. (Bidrag från Dhiru Kholia i bpo-18596.)
Windows-versionen använder nu Address Space Layout Randomization och Data Execution Prevention. (Bidrag från Christian Heimes i bpo-16632.)
Den nya funktionen
PyObject_LengthHint()
är C API-motsvarigheten tilloperator.length_hint()
. (Bidrag från Armin Ronacher i bpo-16148.)
Övriga förbättringar¶
Kommandot python har ett nytt option,
-I
, som gör att det körs i ”isolerat läge”, vilket innebär attsys.path
varken innehåller skriptets katalog eller användarens katalogsite-packages
, och allaPYTHON*
miljövariabler ignoreras (det innebär både-s
och-E
). Andra begränsningar kan också komma att tillämpas i framtiden, med målet att isolera exekveringen av ett skript från användarens miljö. Detta är till exempel lämpligt när Python används för att köra ett systemskript. På de flesta POSIX-system kan och bör det användas i#!
-raden i systemskript. (Bidrag från Christian Heimes i bpo-16499.)Tabbkomplettering är nu aktiverad som standard i den interaktiva tolken på system som stöder
readline
. Historik är också aktiverat som standard, och skrivs till (och läses från) filen~/.python-history
. (Bidrag från Antoine Pitrou och Éric Araujo i bpo-5845.)När Python-tolken anropas med
--version
skrivs nu versionen ut till standardutmatningen istället för standardfelet (bpo-18338). Liknande ändringar gjordes iargparse
(bpo-18920) och andra moduler som har skriptliknande anropsfunktioner (bpo-18922).Installationsprogrammet för CPython i Windows lägger nu till
.py
i variabelnPATHEXT`
när tillägg registreras, vilket gör att användare kan köra ett pythonskript i Windows kommandotolk genom att bara skriva dess namn utan tillägget.py
. (Bidrag från Paul Moore i bpo-18569.)Ett nytt
make
-mål coverage-report kommer att bygga python, köra testsviten och generera en HTML-täckningsrapport för C-kodbasen med hjälp avgcov
och lcov.Alternativet
-R
till python regression test suite kontrollerar nu även för minnesallokeringsläckor, medsys.getallocatedblocks()
. (Bidrag från Antoine Pitrou i bpo-13390.)python -m
fungerar nu med namespace-paket.Modulen
stat
är nu implementerad i C, vilket innebär att den hämtar värdena för sina konstanter från C-headerfilerna, istället för att ha värdena hårdkodade i pythonmodulen som tidigare var fallet.Att ladda flera python-moduler från en enda OS-modul (
.so
,.dll
) fungerar nu korrekt (tidigare returnerades den första python-modulen i filen). (Bidrag från Václav Šmilauer i bpo-16421.)En ny opcode,
LOAD_CLASSDEREF
, har lagts till för att åtgärda en bugg i laddningen av fria variabler i klasskroppar som kunde utlösas av vissa användningar av __prepare__. (Bidrag från Benjamin Peterson i bpo-17853.)Ett antal MemoryError-relaterade krascher identifierades och åtgärdades av Victor Stinner med hjälp av hans PEP 445-baserade verktyg
pyfailmalloc
(bpo-18408, bpo-18520).Kommandot
pyvenv
accepterar nu alternativet--copies
för att använda kopior i stället för symlänkar även på system där symlänkar är standard. (Bidrag från Vinay Sajip i bpo-18807.)Kommandot
pyvenv
accepterar också alternativet--without-pip
för att undertrycka den annars automatiska uppstarten av pip i den virtuella miljön. (Bidrag från Nick Coghlan i bpo-19552 som en del av implementeringen av PEP 453)Kodningsnamnet är nu valfritt i värdeuppsättningen för miljövariabeln
PYTHONIOENCODING
. Detta gör det möjligt att bara ställa in felhanteraren utan att ändra standardkodningen. (Bidrag från Serhiy Storchaka i bpo-18818.)Modulfunktionerna
bz2
,lzma
ochgzip
open
stöder nu lägetx
(exklusivt skapande). (Bidrag från Tim Heaney och Vajrasky Kok i bpo-19201, bpo-19222 och bpo-19223.)
Betydande optimeringar¶
UTF-32-avkodaren är nu 3x till 4x snabbare. (Bidrag från Serhiy Storchaka i bpo-14625.)
Kostnaden för hashkollisioner för set är nu reducerad. Varje hashtabellsprobe kontrollerar nu en serie på varandra följande, intilliggande nyckel/hash-par innan den fortsätter att göra slumpmässiga prober genom hashtabellen. Detta utnyttjar cache-lokalitet för att göra kollisionsupplösning billigare. Kollisionslösningsschemat kan beskrivas som en hybrid av linjär sondering och öppen adressering. Antalet ytterligare linjära sonderingar är som standard nio. Detta kan ändras vid kompilering genom att definiera LINEAR_PROBES till valfritt värde. Ställ in LINEAR_PROBES=0 för att stänga av linjär probning helt och hållet. (Bidrag från Raymond Hettinger i bpo-18771.)
Tolken startar ungefär 30% faster. Ett par åtgärder leder till den ökade hastigheten. Tolken laddar färre moduler vid uppstart, t.ex. importeras inte längre modulerna
re
,collections
ochlocale
och deras beroenden som standard. Modulen marshal har förbättrats för att ladda kompilerad Python-kod snabbare. (Bidrag från Antoine Pitrou, Christian Heimes och Victor Stinner i bpo-19219, bpo-19218, bpo-19209, bpo-19205 och bpo-9548.)bz2.BZ2File
är nu lika snabb eller snabbare än Python2-versionen i de flesta fall.lzma.LZMAFile
har också optimerats. (Bidrag från Serhiy Storchaka och Nadeem Vawda i bpo-16034.)random.getrandbits()
är 20%-40% snabbare för små heltal (det vanligaste användningsfallet). (Bidrag från Serhiy Storchaka i bpo-16674.)Genom att dra nytta av det nya lagringsformatet för strängar är betning av strängar nu betydligt snabbare. (Bidrag från Victor Stinner och Antoine Pitrou i bpo-15596.)
Ett prestandaproblem i
io.FileIO.readall()
har lösts. Detta påverkar särskilt Windows, och snabbar upp fallet med piping av betydande mängder data genomsubprocess
. (Bidrag från Richard Oudkerk i bpo-15758.)html.escape()
är nu 10x snabbare. (Bidrag från Matt Bryant i bpo-18020.)I Windows används nu den inbyggda
VirtualAlloc
istället för CRTmalloc
iobmalloc
. Artificiella benchmarks visar på en minnesbesparing på ca 3%.os.urandom()
använder nu en latent öppnad persistent filbeskrivare för att undvika att använda många filbeskrivare när den körs parallellt från flera trådar. (Bidrag från Antoine Pitrou i bpo-18756.)
Föråldrat¶
Detta avsnitt täcker olika API:er och andra funktioner som har utgått i Python 3.4 och som kommer att tas bort i Python 3.5 eller senare. I de flesta (men inte alla) fall kommer användningen av de föråldrade API:erna att producera en DeprecationWarning
när tolken körs med deprecation-varningar aktiverade (till exempel genom att använda -Wd
).
Avvecklingar i Python API¶
Som nämnts i PEP 451: En ModuleSpec-typ för importsystemet, är ett antal
importlib
-metoder och funktioner föråldrade:importlib.find_loader()
ersätts avimportlib.util.find_spec()
;importlib.machinery.PathFinder.find_module()
ersätts avimportlib.machinery.PathFinder.find_spec()
;importlib.abc.MetaPathFinder.find_module()
ersätts avimportlib.abc.MetaPathFinder.find_spec()
;importlib.abc.PathEntryFinder.find_loader()
ochfind_module()
ersätts avimportlib.abc.PathEntryFinder.find_spec()
; allaxxxLoader
ABCload_module
metoder (importlib.abc.Loader.load_module()
,importlib.abc.InspectLoader.load_module()
,importlib.abc.FileLoader.load_module()
,importlib.abc.SourceLoader.load_module()
) bör inte längre implementeras, istället bör laddare implementera enexec_module
metod (importlib.abc.Loader.exec_module()
,importlib.abc.InspectLoader.exec_module()
importlib.abc.SourceLoader.exec_module()
) och låta importsystemet ta hand om resten; ochimportlib.abc.Loader.module_repr()
,importlib.util.module_for_loader()
,importlib.util.set_loader()
, ochimportlib.util.set_package()
behövs inte längre eftersom deras funktioner nu hanteras automatiskt av importsystemet.Modulen
imp
väntar på att tas bort. För att behålla kompatibiliteten med Python 2/3 kodbaser, är modulens borttagning för närvarande inte planerad.Modulen
formatter
är under avveckling och kommer att tas bort i Python 3.6.MD5
som standard digestmod för funktionenhmac.new()
är föråldrad. Python 3.6 kommer att kräva ett explicit digestnamn eller konstruktör som digestmod-argument.Den interna
Netrc
-klassen iftplib
-modulen har dokumenterats som föråldrad i sin dokumentsträng under en längre tid. Den avger nu enDeprecationWarning
och kommer att tas bort helt i Python 3.5.Det odokumenterade endtime-argumentet till
subprocess.Popen.wait()
borde inte ha exponerats och används förhoppningsvis inte; det är föråldrat och kommer med största sannolikhet att tas bort i Python 3.5.Argumentet strict i
HTMLParser
är föråldrat.Funktionerna
plistlib
readPlist()
,writePlist()
,readPlistFromBytes()
, ochwritePlistToBytes()
är utdaterade till förmån för motsvarande nya funktionerload()
,dump()
,loads()
, ochdumps()
.Data()
är föråldrad till förmån för att bara användabytes
konstruktören.Nyckel
sysconfig
SO
är föråldrad och har ersatts avEXT_SUFFIX
.Läget
U
som accepteras av olikaopen
-funktioner är föråldrat. I Python3 gör det inget användbart och bör ersättas av lämpliga användningar avio.TextIOWrapper
(om det behövs) och dess newline-argument.Argumentet parser i
xml.etree.ElementTree.iterparse()
har utgått, liksom argumentet html iXMLParser()
. För att förbereda borttagandet av det senare bör alla argument tillXMLParser
skickas med nyckelord.
Föråldrade funktioner¶
Att köra IDLE — Python-redigerare och skal med flaggan
-n
(ingen underprocess) är föråldrat. Funktionen kommer dock inte att tas bort förrän bpo-18823 är löst.Site-modulen som lägger till en ”site-python”-katalog i sys.path, om den finns, är föråldrad (bpo-19375).
Borttagen¶
Operativsystem som inte längre stöds¶
Stöd för följande operativsystem har tagits bort från käll- och byggverktygen:
Borttagning av API och funktioner¶
Följande föråldrade och tidigare utfasade API:er och funktioner har tagits bort:
De ounderhållna katalogerna
Misc/TextMate
ochMisc/vim
har tagits bort (se devguide för förslag på vad som kan användas istället).Makrot
SO
i makefilen har tagits bort (det ersattes av makrotSHLIB_SUFFIX
ochEXT_SUFFIX
) (bpo-16754).Fältet
PyThreadState.tick_counter
har tagits bort; dess värde har varit meningslöst sedan Python 3.2, när den ”nya GIL” introducerades (bpo-19199).PyLoader
ochPyPycLoader
har tagits bort frånimportlib
. (Bidrag från Taras Lyapun i bpo-15641.)Argumentet strict till
HTTPConnection
ochHTTPSConnection
har tagits bort. HTTP 0.9-stil ”Simple Responses” stöds inte längre.De föråldrade
urllib.request.Request
getter- och setter-metodernaadd_data
,has_data
,get_data
,get_type
,get_host
,get_selector
,set_proxy
,get_origin_req_host
ochis_unverifiable
har tagits bort (använd direkt attributåtkomst istället).Stöd för laddning av den föråldrade
TYPE_INT64
har tagits bort frånmarshal
. (Bidrag från Dan Riti i bpo-15480.)inspect.Signature
: parametrar som endast är positionella måste nu ha ett giltigt namn.object.__format__()
accepterar inte längre icke-tomma formatsträngar, den ger nu upphov till ettTypeError
istället. Att använda en icke-tom sträng har varit föråldrat sedan Python 3.2. Denna ändring har gjorts för att förhindra en situation där tidigare fungerande (men felaktig) kod skulle börja misslyckas om ett objekt fick en __format__-metod, vilket innebär att din kod nu kan ge upphov till ettTypeError
om du använder en's'
-formatkod med objekt som inte har en __format__-metod som hanterar den. Se bpo-7994 för bakgrund.difflib.SequenceMatcher.isbjunk()
ochdifflib.SequenceMatcher.isbpopular()
var föråldrade i 3.2 och har nu tagits bort: användx in sm.bjunk
ochx in sm.bpopular
, där sm är ettSequenceMatcher
-objekt (bpo-13248).
Uppstädning av kod¶
Den oanvända och odokumenterade interna klassen
Scanner
har tagits bort från modulenpydoc
.Den privata och i praktiken oanvända modulen
_gestalt
har tagits bort, tillsammans med de privataplatform
-funktionerna_mac_ver_lookup
,_mac_ver_gstalt
och_bcd2str
, som bara skulle ha anropats på dåligt fungerande OSX-system (se bpo-18393).De hårdkodade kopiorna av vissa
stat
-konstanter som ingick itarfile
-modulens namnrymd har tagits bort.
Portning till Python 3.4¶
I det här avsnittet listas tidigare beskrivna ändringar och andra buggfixar som kan kräva ändringar i din kod.
Ändringar i beteendet för kommandot ”python¶
I ett posix-skal är det likvärdigt med att inte ange miljövariabeln
PATH
alls om den anges till ett tomt värde. Men att sättaPYTHONPATH
till ett tomt värde var inte likvärdigt med att inte sätta den alls: att sättaPYTHONPATH
till ett tomt värde var likvärdigt med att sätta den till.
, vilket leder till förvirring när man resonerar analogt med hurPATH
fungerar. Beteendet överensstämmer nu med posix-konventionen förPATH
.Utdata [X refs, Y blocks] från en debug (
--med-pydebug
) -byggnad av CPython-tolken är nu avstängd som standard. Den kan återaktiveras med hjälp av alternativet-X showrefcount
. (Bidrag från Ezio Melotti i bpo-17323.)Python-kommandot och de flesta stdlib-skript (samt
argparse
) skickar nu ut--version
-information tillstdout
istället förstderr
(för problemlista se Övriga förbättringar ovan).
Ändringar i Python API¶
De ABC:er som definieras i
importlib.abc
ger nu antingen upphov till lämpligt undantag eller returnerar ett standardvärde istället för att ge upphov tillNotImplementedError
i blindo. Detta kommer endast att påverka kod som anroparsuper()
och som faller igenom hela vägen till ABC. För kompatibilitet, fånga bådeNotImplementedError
eller det lämpliga undantaget efter behov.Modultypen initierar nu attributen
__package__
och__loader__
tillNone
som standard. För att avgöra om dessa attribut har ställts in på ett bakåtkompatibelt sätt, använd t.ex.getattr(module, '__loader__', None) is not None
. (bpo-17115.)importlib.util.module_for_loader()
ställer nu in__loader__
och__package__
villkorslöst för att korrekt stödja omlastning. Om detta inte är önskvärt måste du ställa in dessa attribut manuellt. Du kan användaimportlib.util.module_to_load()
för modulhantering.Import återställer nu relevanta attribut (t.ex.
__name__
,__loader__
,__package__
,__file__
,__cached__
) villkorslöst när den laddas om. Observera att detta återställer ett pre-3.3-beteende i och med att det innebär att en modul hittas på nytt när den laddas om (bpo-19413).Frusna paket sätter inte längre
__path__
till en lista som innehåller paketnamnet, utan nu till en tom lista. Det tidigare beteendet kunde leda till att importsystemet gjorde fel sak vid import av undermoduler om det också fanns en katalog med samma namn som det frysta paketet. Det korrekta sättet att avgöra om en modul är ett paket eller inte är att användahasattr(module, '__path__')
(bpo-18065).Frysta moduler definierar inte längre attributet
__file__
. Det är semantiskt inkorrekt för frysta moduler att ange attributet eftersom de inte laddas från någon explicit plats. Om du måste veta att en modul kommer från frusen kod kan du se om modulens__spec__.location
är inställd på'frozen'
, kontrollera om laddaren är en underklass tillimportlib.machinery.FrozenImporter
, eller om Python 2-kompatibilitet är nödvändig kan du användaimp.is_frozen()
.py_compile.compile()
ger nu upphov tillFileExistsError
om filsökvägen som den skulle skriva till är en symlänk eller en icke-vanlig fil. Detta är för att varna för att importen kommer att skriva över dessa filer med en vanlig fil oavsett vilken typ av filsökväg de ursprungligen hade.importlib.abc.SourceLoader.get_source()
ger inte längre upphov tillImportError
när källkoden som laddas utlöser ettSyntaxError
ellerUnicodeDecodeError
. EftersomImportError
endast är avsett att utlösas när källkoden inte kan hittas men borde kunna det, ansågs det vara att gå för långt/överbelasta den betydelsen när källkoden hittas men är felaktigt strukturerad. Om du fångade ImportError tidigare och vill fortsätta att ignorera syntax- eller avkodningsproblem, fånga alla tre undantagen nu.functools.update_wrapper()
ochfunctools.wraps()
sätter nu attributet__wrapped__
korrekt till den funktion som omsluts, även om den funktionen också hade attributet__wrapped__
satt. Detta innebär att__wrapped__
-attribut nu korrekt länkar en stack av dekorerade funktioner snarare än att varje__wrapped__
-attribut i kedjan refererar till den innersta funktionen. Introspektionsbibliotek som antog att det tidigare beteendet var avsiktligt kan användainspect.unwrap()
för att komma åt den första funktionen i kedjan som inte har något__wrapped__
-attribut.inspect.getfullargspec()
har omimplementerats ovanpåinspect.signature()
och hanterar därför en mycket större variation av anropsbara objekt än tidigare. Det förväntas att ytterligare inbyggda och tilläggsmodulers anropbara objekt kommer att få signaturmetadata under Python 3.4-seriens gång. Kod som antar attinspect.getfullargspec()
kommer att misslyckas på icke-Python-kallobjekt kan behöva justeras i enlighet med detta.importlib.machinery.PathFinder
skickar nu vidare den aktuella arbetskatalogen till objekt isys.path_hooks
för den tomma strängen. Detta resulterar i attsys.path_importer_cache
aldrig innehåller''
, vilket innebär att iterering genomsys.path_importer_cache
baserat påsys.path
inte kommer att hitta alla nycklar. En moduls__file__
när den importeras i den aktuella arbetskatalogen kommer nu också att ha en absolut sökväg, inklusive när-m
används med tolken (utom för__main__.__file__
när ett skript har exekverats direkt med en relativ sökväg) (Bidrag från Brett Cannon i bpo-18416). anges på kommandoraden) (bpo-18416).Borttagandet av strict-argumentet till
HTTPConnection
ochHTTPSConnection
ändrar betydelsen av de återstående argumenten om du anger dem positionellt i stället för med nyckelord. Om du har varit uppmärksam på deprecation-varningar bör din kod redan ange eventuella ytterligare argument via nyckelord.Strängar mellan
from __future__ import ...
-satser ger nu alltid upphov till ettSyntaxError
. Tidigare, om det inte fanns någon ledande docstring, kunde en mellanliggande sträng ibland ignoreras. Detta gör att CPython överensstämmer med språkspecifikationen; Jython och PyPy gjorde det redan. (bpo-17434).ssl.SSLSocket.getpeercert()
ochssl.SSLSocket.do_handshake()
ger nu upphov till ettOSError
medENOTCONN
närSSLSocket
inte är ansluten, istället för det tidigare beteendet att ge upphov till ettAttributeError
. Dessutom kommergetpeercert()
att ge upphov till ettValueError
om handskakningen ännu inte har genomförts.base64.b32decode()
ger nu upphov till ettbinascii.Error
när indatasträngen innehåller icke-b32-alphabet tecken, istället för ettTypeError
. Detta speciellaTypeError
missades när de andraTypeError
konverterades. (Bidrag från Serhiy Storchaka i bpo-18011.) Observera: denna ändring tillämpades också oavsiktligt i Python 3.3.3.Attributet
file
stängs nu automatiskt när den skapandecgi.FieldStorage
-instansen garbage collected. Om du drog ut filobjektet separat fråncgi.FieldStorage
-instansen och inte höll instansen vid liv, bör du antingen lagra helacgi.FieldStorage
-instansen eller läsa innehållet i filen innancgi.FieldStorage
-instansen garbage collected.Anrop av
read
ellerwrite
på ett stängt SSL-uttag ger nu upphov till ett informativtValueError
istället för det tidigare mer mystiskaAttributeError
(bpo-9177).slice.indices()
producerar inte längre ettOverflowError
för stora värden. Som en konsekvens av denna korrigering gerslice.indices()
nu upphov till ettValueError
om det ges en negativ längd; tidigare returnerade det nonsensvärden (bpo-14794).Konstruktorn
complex
, till skillnad från funktionernacmath
, accepterade felaktigt värdenafloat
om objektets specialmetod__complex__
returnerade ett värde. Detta ger nu upphov till ettTypeError
. (bpo-16290.)Konstruktorn
int
i 3.2 och 3.3 accepterar felaktigtfloat
-värden för parametern base. Det är osannolikt att någon gjorde detta, men om så är fallet kommer det nu att ge upphov till ettTypeError
(bpo-16772).Standardvärden för argument som endast innehåller nyckelord utvärderas nu efter standardvärden för vanliga nyckelordsargument, istället för före. Förhoppningsvis har ingen skrivit någon kod som är beroende av det tidigare buggiga beteendet (bpo-16967).
Föråldrade trådtillstånd rensas nu efter
fork()
. Detta kan leda till att vissa systemresurser frigörs som tidigare felaktigt hölls vid liv för evigt (t.ex. databasanslutningar i trådlokal lagring). (bpo-17094.)Parameternamn i
__annotations__
-dikter manglas nu korrekt, på samma sätt som__kwdefaults__
. (Bidrag från Yury Selivanov i bpo-20625.)hashlib.hash.name
returnerar nu alltid identifieraren med små bokstäver. Tidigare hade vissa inbyggda hashar namn med versaler, men nu när det är ett formellt offentligt gränssnitt har namngivningen gjorts konsekvent (bpo-18532).Eftersom
unittest.TestSuite
nu tappar referenser till tester efter att de har körts, kan testprogram som återanvänder enTestSuite
för att köra om en uppsättning tester misslyckas. Testsviter bör inte återanvändas på det här sättet eftersom det innebär att tillstånd behålls mellan testkörningar, vilket bryter testisoleringen somunittest
är utformad för att tillhandahålla. Men om bristen på isolering anses acceptabel kan det gamla beteendet återställas genom att skapa enTestSuite
-underklass som definierar en_removeTestAtIndex
-metod som inte gör någonting (seTestSuite.__iter__()
) (bpo-11798).unittest
använder nuargparse
för kommandoradsanalys. Det finns vissa ogiltiga kommandoformer som tidigare fungerade och som inte längre tillåts; i teorin bör detta inte orsaka problem med bakåtkompatibilitet eftersom de otillåtna kommandoformerna inte var meningsfulla och troligen inte används.Funktionerna
re.split()
,re.findall()
, ochre.sub()
, samt metodernagroup()
ochgroups()
förmatch
-objekt returnerar nu alltid ett bytes-objekt när strängen som ska matchas är ett bytes-like object. Tidigare matchade returtypen indatatypen, så om din kod var beroende av att returvärdet var, säg, enbytearray
, måste du ändra din kod.audioop
-funktioner ger nu upphov till ett fel omedelbart om de får stränginmatning, istället för att misslyckas slumpmässigt senare (bpo-16685).Det nya argumentet convert_charrefs till
HTMLParser
har för närvarandeFalse
som standard för bakåtkompatibilitet, men kommer så småningom att ändras tillTrue
som standard. Det rekommenderas att du lägger till detta nyckelord, med lämpligt värde, till allaHTMLParser
-anrop i din kod (bpo-13633).Eftersom argumentet digestmod till funktionen
hmac.new()
i framtiden inte kommer att ha någon standard, bör alla anrop tillhmac.new()
ändras så att de uttryckligen anger en digestmod (bpo-17276).Att anropa
sysconfig.get_config_var()
med nyckelnSO
, eller att leta uppSO
i resultatet av ett anrop tillsysconfig.get_config_vars()
är föråldrat. Denna nyckel bör ersättas avEXT_SUFFIX
ellerSHLIB_SUFFIX
, beroende på sammanhanget (bpo-19555).Alla anrop till
open
funktioner som specificerarU
bör modifieras.U
är ineffektivt i Python3 och kommer så småningom att ge upphov till ett fel om det används. Beroende på funktionen kan motsvarigheten till dess gamla Python2-beteende uppnås genom att använda antingen ett newline-argument, eller om nödvändigt genom att paketera strömmen iTextIOWrapper
för att använda dess newline-argument (bpo-15204).Om du använder
pyvenv
i ett skript och vill att pip inte ska installeras måste du lägga till--without-pip
i din kommandoupprop.Standardbeteendet för
json.dump()
ochjson.dumps()
när ett indrag anges har ändrats: det producerar inte längre efterföljande mellanslag efter kommatecken i slutet av rader. Detta kommer endast att ha betydelse om du har tester som gör jämförelser av sådana utdata med känsligt blanksteg (bpo-16333).doctest
letar nu efter doctests i tilläggsmodulens__doc__
strängar, så om din doctest-testupptäckt inkluderar tilläggsmoduler som har saker som ser ut som doctests i dem kan du se testfel som du aldrig sett tidigare när du kör dina tester (bpo-3158).Modulen
collections.abc
har omarbetats något som en del av Pythons uppstartsförbättringar. Som en konsekvens av detta är det inte längre så att import avcollections
automatiskt importerarcollections.abc
. Om ditt program var beroende av den (odokumenterade) implicita importen, måste du lägga till en explicitimport collections.abc
(bpo-20784).
Förändringar i C API¶
PyEval_EvalFrameEx()
,PyObject_Repr()
ochPyObject_Str()
, tillsammans med några andra interna C API:er, innehåller nu ett felsökningsuttalande som säkerställer att de inte används i situationer där de tyst kan kasta bort ett för närvarande aktivt undantag. I fall där det aktiva undantaget förväntas och önskas kasseras (till exempel för att det redan har sparats lokalt medPyErr_Fetch()
eller avsiktligt ersätts med ett annat undantag), kommer ett uttryckligtPyErr_Clear()
-anrop att behövas för att undvika att påståendet utlöses när dessa operationer anropas (direkt eller indirekt) och körs mot en version av Python som är kompilerad med påståenden aktiverade.PyErr_SetImportError()
sätter nuTypeError
när dess msg argument inte är satt. Tidigare returnerades endastNULL
utan att något undantag angavs.Resultatet av anropet
PyOS_ReadlineFunctionPointer
måste nu vara en sträng som allokerats avPyMem_RawMalloc()
ellerPyMem_RawRealloc()
, ellerNULL
om ett fel inträffade, istället för en sträng som allokerats avPyMem_Malloc()
ellerPyMem_Realloc()
(bpo-16742)PyThread_set_key_value()
sätter nu alltid värdet. I Python 3.3 gjorde funktionen ingenting om nyckeln redan fanns (om det aktuella värdet är en pekare som inte ärNULL
).Fältet
f_tstate
(thread state) iPyFrameObject
-strukturen har tagits bort för att åtgärda ett fel: se bpo-14432 för motiveringen.
Ändrat i 3.4.3¶
PEP 476: Aktivera certifikatverifiering som standard för stdlib http-klienter¶
http.client
och moduler som använder den, t.ex. urllib.request
och xmlrpc.client
, kommer nu att verifiera att servern presenterar ett certifikat som är signerat av en CA i plattformens trust store och vars värdnamn matchar det värdnamn som begärs som standard, vilket avsevärt förbättrar säkerheten för många applikationer.
För applikationer som kräver det gamla tidigare beteendet kan de skicka en alternativ context:
import urllib.request
import ssl
# This disables all verification
context = ssl._create_unverified_context()
# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib.request.urlopen("https://invalid-cert", context=context)