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
marshalhar 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
pickleprotocol 4 (PEP 3154).multiprocessinghar nu ett alternativ för att undvika att använda os.fork på Unix (bpo-8713).emailhar en ny undermodul,contentmanager, och en nyMessage-underklass (EmailMessage) som förenklar MIME-hanteringen (bpo-18891).Modulerna
inspectochpydockan 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
ipaddresshar 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).
multiprocessinghar 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.SSLContexthar 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
surrogatepassanvä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
intaccepterar 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 modulernainspectochpydoc.__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:
class NumbersTest(unittest.TestCase):
def test_even(self):
for i in range(6):
with 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-configkan 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,%Soch%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 returnerar0vid framgång och\-1vid 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.pathvarken innehåller skriptets katalog eller användarens katalogsite-packages, och allaPYTHON*miljövariabler ignoreras (det innebär både\-soch\-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
\--versionskrivs 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
.pyi 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 avgcovoch lcov.Alternativet
\-Rtill python regression test suite kontrollerar nu även för minnesallokeringsläckor, medsys.getallocatedblocks(). (Bidrag från Antoine Pitrou i bpo-13390.)python -mfungerar 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
pyvenvaccepterar nu alternativet\--copiesfö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
pyvenvaccepterar också alternativet\--without-pipfö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,lzmaochgzipopenstö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,collectionsochlocaleoch 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.LZMAFilehar 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
VirtualAllocistället för CRTmallociobmalloc. 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(); allaxxxLoaderABCload_modulemetoder (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_modulemetod (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
impvä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.MD5som 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 enDeprecationWarningoch 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
plistlibreadPlist(),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ändabyteskonstruktören.Nyckel
sysconfigSOär föråldrad och har ersatts avEXT_SUFFIX.Läget
Usom 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 tillXMLParserskickas 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/TextMateochMisc/vimhar tagits bort (se devguide för förslag på vad som kan användas istället).Makrot
SOi makefilen har tagits bort (det ersattes av makrotSHLIB_SUFFIXochEXT_SUFFIX) (bpo-16754).Fältet
PyThreadState.tick_counterhar tagits bort; dess värde har varit meningslöst sedan Python 3.2, när den ”nya GIL” introducerades (bpo-19199).PyLoaderochPyPycLoaderhar tagits bort frånimportlib. (Bidrag från Taras Lyapun i bpo-15641.)Argumentet strict till
HTTPConnectionochHTTPSConnectionhar tagits bort. HTTP 0.9-stil ”Simple Responses” stöds inte längre.De föråldrade
urllib.request.Requestgetter- och setter-metodernaadd_data,has_data,get_data,get_type,get_host,get_selector,set_proxy,get_origin_req_hostochis_unverifiablehar tagits bort (använd direkt attributåtkomst istället).Stöd för laddning av den föråldrade
TYPE_INT64har 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 ettTypeErroristä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 ettTypeErrorom 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.bjunkochx in sm.bpopular, där sm är ettSequenceMatcher-objekt (bpo-13248).
Uppstädning av kod¶
Den oanvända och odokumenterade interna klassen
Scannerhar tagits bort från modulenpydoc.Den privata och i praktiken oanvända modulen
_gestalthar tagits bort, tillsammans med de privataplatform-funktionerna_mac_ver_lookup,_mac_ver_gstaltoch_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
PATHalls om den anges till ett tomt värde. Men att sättaPYTHONPATHtill ett tomt värde var inte likvärdigt med att inte sätta den alls: att sättaPYTHONPATHtill ett tomt värde var likvärdigt med att sätta den till., vilket leder till förvirring när man resonerar analogt med hurPATHfungerar. 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 tillstdoutistället förstderr(för problemlista se Övriga förbättringar ovan).
Ändringar i Python API¶
De ABC:er som definieras i
importlib.abcger nu antingen upphov till lämpligt undantag eller returnerar ett standardvärde istället för att ge upphov tillNotImplementedErrori 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ådeNotImplementedErroreller det lämpliga undantaget efter behov.Modultypen initierar nu attributen
__package__och__loader__tillNonesom 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 tillFileExistsErrorom 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 tillImportErrornär källkoden som laddas utlöser ettSyntaxErrorellerUnicodeDecodeError. EftersomImportErrorendast ä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.PathFinderskickar nu vidare den aktuella arbetskatalogen till objekt isys.path_hooksför den tomma strängen. Detta resulterar i attsys.path_importer_cachealdrig innehåller'', vilket innebär att iterering genomsys.path_importer_cachebaserat påsys.pathinte 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\-manvä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
HTTPConnectionochHTTPSConnectionä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 ettOSErrormedENOTCONNnärSSLSocketinte är ansluten, istället för det tidigare beteendet att ge upphov till ettAttributeError. Dessutom kommergetpeercert()att ge upphov till ettValueErrorom handskakningen ännu inte har genomförts.base64.b32decode()ger nu upphov till ettbinascii.Errornär indatasträngen innehåller icke-b32-alphabet tecken, istället för ettTypeError. Detta speciellaTypeErrormissades när de andraTypeErrorkonverterades. (Bidrag från Serhiy Storchaka i bpo-18011.) Observera: denna ändring tillämpades också oavsiktligt i Python 3.3.3.Attributet
filestä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
readellerwritepå ett stängt SSL-uttag ger nu upphov till ett informativtValueErroristället för det tidigare mer mystiskaAttributeError(bpo-9177).slice.indices()producerar inte längre ettOverflowErrorför stora värden. Som en konsekvens av denna korrigering gerslice.indices()nu upphov till ettValueErrorom det ges en negativ längd; tidigare returnerade det nonsensvärden (bpo-14794).Konstruktorn
complex, till skillnad från funktionernacmath, accepterade felaktigt värdenafloatom objektets specialmetod__complex__returnerade ett värde. Detta ger nu upphov till ettTypeError. (bpo-16290.)Konstruktorn
inti 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.namereturnerar 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.TestSuitenu tappar referenser till tester efter att de har körts, kan testprogram som återanvänder enTestSuitefö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).unittestanvänder nuargparsefö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
HTMLParserhar för närvarandeFalsesom standard för bakåtkompatibilitet, men kommer så småningom att ändras tillTruesom 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 uppSOi resultatet av ett anrop tillsysconfig.get_config_vars()är föråldrat. Denna nyckel bör ersättas avEXT_SUFFIXellerSHLIB_SUFFIX, beroende på sammanhanget (bpo-19555).Alla anrop till
openfunktioner som specificerarUbö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 iTextIOWrapperför att använda dess newline-argument (bpo-15204).Om du använder
pyvenvi ett skript och vill att pip inte ska installeras måste du lägga till\--without-pipi 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).doctestletar 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.abchar omarbetats något som en del av Pythons uppstartsförbättringar. Som en konsekvens av detta är det inte längre så att import avcollectionsautomatiskt 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 nuTypeErrornär dess msg argument inte är satt. Tidigare returnerades endastNULLutan att något undantag angavs.Resultatet av anropet
PyOS_ReadlineFunctionPointermåste nu vara en sträng som allokerats avPyMem_RawMalloc()ellerPyMem_RawRealloc(), ellerNULLom 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)