Vad är nytt i Python 2.7¶
- Författare:
A.M. Kuchling (amk at amk.ca)
I den här artikeln förklaras de nya funktionerna i Python 2.7. Python 2.7 släpptes den 3 juli 2010.
Hanteringen av numeriska tal har förbättrats på många sätt, både för flyttal och för klassen Decimal
. Det finns en del användbara tillägg till standardbiblioteket, t.ex. en kraftigt förbättrad modul unittest
, modulen argparse
för tolkning av kommandoradsalternativ, praktiska klasserna OrderedDict
och Counter
i modulen collections
och många andra förbättringar.
Python 2.7 är planerad att vara den sista av 2.x-utgåvorna, så vi har arbetat för att göra det till en bra utgåva på lång sikt. För att hjälpa till med porteringen till Python 3 har flera nya funktioner från Python 3.x-serien inkluderats i 2.7.
Den här artikeln försöker inte ge en fullständig specifikation av de nya funktionerna, utan ger istället en praktisk översikt. För fullständiga detaljer hänvisas till dokumentationen för Python 2.7 på https://docs.python.org. Om du vill förstå bakgrunden till utformningen och implementeringen, se PEP för en viss ny funktion eller frågan på https://bugs.python.org där en ändring diskuterades. När det är möjligt länkar ”What’s New in Python” till buggen/patch-objektet för varje ändring.
Framtiden för Python 2.x¶
Python 2.7 är den sista större utgåvan i 2.x-serien, eftersom Python-underhållarna har flyttat fokus för sina ansträngningar att utveckla nya funktioner till Python 3.x-serien. Detta innebär att medan Python 2 fortsätter att få buggfixar och uppdateras för att bygga korrekt på ny hårdvara och versioner av operativsystem som stöds, kommer det inte att finnas några nya fullständiga funktionsversioner för språket eller standardbiblioteket.
Men även om det finns en stor gemensam delmängd mellan Python 2.7 och Python 3, och många av de ändringar som är involverade i migreringen till den gemensamma delmängden, eller direkt till Python 3, kan automatiseras på ett säkert sätt, kan vissa andra ändringar (särskilt de som är förknippade med Unicode-hantering) kräva noggrant övervägande, och helst robusta automatiserade regressionstestsviter, för att migrera effektivt.
Detta innebär att Python 2.7 kommer att finnas kvar under lång tid och utgöra en stabil basplattform med stöd för produktionssystem som ännu inte har portats till Python 3. Den fullständiga förväntade livscykeln för Python 2.7-serien beskrivs i PEP 373.
Några viktiga konsekvenser av den långsiktiga betydelsen av 2,7 är:
Som nämnts ovan har 2.7-utgåvan en mycket längre period av underhåll jämfört med tidigare 2.x-versioner. Python 2.7 förväntas för närvarande fortsätta att stödjas av kärnutvecklingsteamet (få säkerhetsuppdateringar och andra buggfixar) fram till åtminstone 2020 (10 år efter den första utgåvan, jämfört med den mer typiska supportperioden på 18-24 månader).
I takt med att standardbiblioteket Python 2.7 åldras blir det allt viktigare för Python 2-användare att effektivt använda Python Package Index (antingen direkt eller via en redistributör). Förutom ett brett utbud av tredjepartspaket för olika uppgifter innehåller de tillgängliga paketen backports av nya moduler och funktioner från Python 3 standardbibliotek som är kompatibla med Python 2, samt olika verktyg och bibliotek som kan göra det lättare att migrera till Python 3. I Python Packaging User Guide finns vägledning om hur du hämtar och installerar programvara från Python Package Index.
Även om det föredragna tillvägagångssättet för att förbättra Python 2 nu är publicering av nya paket på Python Package Index, fungerar detta tillvägagångssätt inte nödvändigtvis i alla fall, särskilt de som är relaterade till nätverkssäkerhet. I undantagsfall som inte kan hanteras på lämpligt sätt genom att publicera nya eller uppdaterade paket på PyPI, kan Python Enhancement Proposal-processen användas för att argumentera för att lägga till nya funktioner direkt till Python 2 standardbibliotek. Alla sådana tillägg, och de underhållsutgåvor där de lades till, kommer att noteras i Nya funktioner i underhållsversionerna av Python 2.7 avsnittet nedan.
För projekt som vill migrera från Python 2 till Python 3, eller för biblioteks- och ramverksutvecklare som vill stödja användare av både Python 2 och Python 3, finns det en mängd olika verktyg och guider tillgängliga för att hjälpa till att bestämma ett lämpligt tillvägagångssätt och hantera några av de tekniska detaljer som är inblandade. Den rekommenderade startpunkten är Hur man portar Python 2-kod till Python 3 HOWTO-guiden.
Ändringar i hanteringen av deprecation-varningar¶
För Python 2.7 togs ett policybeslut att tysta varningar som bara är av intresse för utvecklare som standard. DeprecationWarning
och dess ättlingar ignoreras nu om inte annat begärs, vilket förhindrar användare från att se varningar som utlöses av en applikation. Den här ändringen gjordes också i den gren som blev Python 3.2. (Diskuterades på stdlib-sig och genomfördes i bpo-7319.)
I tidigare utgåvor var DeprecationWarning
-meddelanden aktiverade som standard, vilket gav Python-utvecklare en tydlig indikation på var deras kod kan brytas i en framtida större version av Python.
Det finns dock allt fler användare av Python-baserade applikationer som inte är direkt involverade i utvecklingen av dessa applikationer. DeprecationWarning
-meddelanden är irrelevanta för sådana användare, vilket gör att de oroar sig för en applikation som faktiskt fungerar korrekt och belastar applikationsutvecklare med att svara på dessa problem.
Du kan återaktivera visning av DeprecationWarning
-meddelanden genom att köra Python med -Wdefault
(kortform: -Wd
), eller genom att ställa in miljövariabeln PYTHONWARNINGS
till "default"
(eller "d"
) innan du kör Python. Python-kod kan också återaktivera dem genom att anropa warnings.simplefilter('default')
.
Modulen unittest
återaktiverar också automatiskt deprecationsvarningar när tester körs.
Python 3.1 Funktioner¶
Precis som Python 2.6 innehöll funktioner från Python 3.0, innehåller version 2.7 några av de nya funktionerna i Python 3.1. 2.x-serien fortsätter att tillhandahålla verktyg för migrering till 3.x-serien.
En partiell lista över funktioner i 3.1 som backporterades till 2.7:
Syntaxen för mängdlitteraler (
{1,2,3}
är en föränderlig mängd).Dictionary och set comprehensions (
{i: i*2 for i in range(3)}
).Flera kontexthanterare i en enda
with
-sats.En ny version av biblioteket
io
, omskriven i C för bättre prestanda.Typen ordered-dictionary som beskrivs i PEP 372: Lägga till en ordnad ordbok i samlingar.
Den nya formatangivaren
","
som beskrivs i PEP 378: Formatspecifikator för tusentalsavgränsare.Objektet
memoryview
.En liten delmängd av modulen
importlib
, beskrivs nedan.repr()
av en floatx
är kortare i många fall: den är nu baserad på den kortaste decimalsträngen som garanterat avrundar tillbaka tillx
. Precis som i tidigare versioner av Python är det garanterat attfloat(repr(x))
återställerx
.Konverteringar av float-till-sträng och sträng-till-float avrundas korrekt. Funktionen
round()
är nu också korrekt avrundad.Typen
PyCapsule
, används för att tillhandahålla ett C API för tilläggsmoduler.C API-funktionen
PyLong_AsLongAndOverflow()
.
Andra nya varningar i Python3-läge inkluderar:
operator.isCallable()
ochoperator.sequenceIncludes()
, som inte stöds i 3.x, utlöser nu varningar.Omkopplaren
-3
aktiverar nu automatiskt omkopplaren-Qwarn
som varnar för att använda klassisk division med heltal och långa heltal.
PEP 372: Lägga till en ordnad ordbok i samlingar¶
Vanliga Python-ordböcker itererar över nyckel/värde-par i godtycklig ordning. Under årens lopp har ett antal författare skrivit alternativa implementationer som kommer ihåg den ordning som nycklarna ursprungligen infogades. Baserat på erfarenheterna från dessa implementationer introducerar 2.7 en ny OrderedDict
-klass i collections
-modulen.
API:et OrderedDict
har samma gränssnitt som vanliga ordböcker men itererar över nycklar och värden i en garanterad ordning beroende på när en nyckel först infogades:
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
Om en ny post skriver över en befintlig post, lämnas den ursprungliga inmatningspositionen oförändrad:
>>> d['second'] = 4
>>> d.items()
[('first', 1), ('second', 4), ('third', 3)]
Om du tar bort en post och lägger in den igen flyttas den till slutet:
>>> del d['second']
>>> d['second'] = 5
>>> d.items()
[('first', 1), ('third', 3), ('second', 5)]
Metoden popitem()
har ett valfritt last-argument som har True
som standard. Om last är true returneras och tas bort den senast tillagda nyckeln; om det är false väljs den äldsta nyckeln:
>>> od = OrderedDict([(x,0) for x in range(20)])
>>> od.popitem()
(19, 0)
>>> od.popitem()
(18, 0)
>>> od.popitem(last=False)
(0, 0)
>>> od.popitem(last=False)
(1, 0)
Jämförelse av två ordnade ordböcker kontrollerar både nycklar och värden och kräver att inmatningsordningen var densamma:
>>> od1 = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> od2 = OrderedDict([('third', 3),
... ('first', 1),
... ('second', 2)])
>>> od1 == od2
False
>>> # Move 'third' key to the end
>>> del od2['third']; od2['third'] = 3
>>> od1 == od2
True
Jämförelse av en OrderedDict
med en vanlig ordbok ignorerar insättningsordningen och jämför bara nycklarna och värdena.
Hur fungerar OrderedDict
? Den upprätthåller en dubbelt länkad lista med nycklar och lägger till nya nycklar i listan när de infogas. En sekundär ordbok mappar nycklar till deras motsvarande listnod, så radering behöver inte gå igenom hela den länkade listan och förblir därför O(1).
Standardbiblioteket stöder nu användning av ordnade lexikon i flera moduler.
Modulen
ConfigParser
använder dem som standard, vilket innebär att konfigurationsfiler nu kan läsas, ändras och sedan skrivas tillbaka i sin ursprungliga ordning.Metoden
_asdict()
förcollections.namedtuple()
returnerar nu en ordnad ordbok där värdena visas i samma ordning som de underliggande tuple-indexen.json
-modulensJSONDecoder
-klassens konstruktor utökades med en object_pairs_hook-parameter för att tillåta attOrderedDict
-instanser byggs av avkodaren. Stöd har även lagts till för tredjepartsverktyg som PyYAML.
Se även
- PEP 372 - Lägga till en ordnad ordbok i samlingar
PEP skriven av Armin Ronacher och Raymond Hettinger; implementerad av Raymond Hettinger.
PEP 378: Formatspecifikator för tusentalsavgränsare¶
För att göra programutmatningen mer läsbar kan det vara bra att lägga till separatorer till stora tal, vilket gör att de visas som 18,446,744,073,709,551,616 istället för 18446744073709551616.
Den helt generella lösningen för att göra detta är modulen locale
, som kan använda olika separatorer (”,” i Nordamerika, ”.” i Europa) och olika gruppstorlekar, men locale
är komplicerad att använda och olämplig för flertrådade program där olika trådar producerar utdata för olika lokaler.
Därför har en enkel kommagrupperingsmekanism lagts till i det minispråk som används av metoden str.format()
. När du formaterar ett flyttal kan du helt enkelt sätta ett kommatecken mellan bredden och precisionen:
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
När du formaterar ett heltal ska du inkludera kommatecknet efter bredden:
>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'
Denna mekanism är inte anpassningsbar alls; kommatecken används alltid som avgränsare och grupperingen sker alltid i tresiffriga grupper. Komma-formateringsmekanismen är inte lika generell som locale
-modulen, men den är enklare att använda.
Se även
- PEP 378 - Formatspecifikator för tusentalsavgränsare
PEP skriven av Raymond Hettinger; implementerad av Eric Smith.
PEP 389: Modulen argparse för parsning av kommandorader¶
Modulen argparse
för parsning av kommandoradsargument har lagts till som en kraftfullare ersättning för modulen optparse
.
Detta innebär att Python nu stöder tre olika moduler för parsning av kommandoradsargument: getopt
, optparse
och argparse
. Modulen getopt
liknar C-bibliotekets funktion getopt()
, så den är fortfarande användbar om du skriver en Python-prototyp som så småningom kommer att skrivas om i C. optparse
blir överflödig, men det finns inga planer på att ta bort den eftersom det finns många skript som fortfarande använder den, och det finns inget automatiserat sätt att uppdatera dessa skript. (Att göra argparse
API konsekvent med gränssnittet i optparse
diskuterades men förkastades som alltför rörigt och svårt)
Kort sagt, om du skriver ett nytt skript och inte behöver oroa dig för kompatibilitet med tidigare versioner av Python, använd argparse
istället för optparse
.
Här är ett exempel:
import argparse
parser = argparse.ArgumentParser(description='Command-line example.')
# Add optional switches
parser.add_argument('-v', action='store_true', dest='is_verbose',
help='produce verbose output')
parser.add_argument('-o', action='store', dest='output',
metavar='FILE',
help='direct output to FILE instead of stdout')
parser.add_argument('-C', action='store', type=int, dest='context',
metavar='NUM', default=0,
help='display NUM lines of added context')
# Allow any number of additional arguments.
parser.add_argument(nargs='*', action='store', dest='inputs',
help='input filenames (default is stdin)')
args = parser.parse_args()
print args.__dict__
Om du inte åsidosätter det, läggs -h
och --help
automatiskt till och ger snyggt formaterad utdata:
-> ./python.exe argparse-example.py --help
användning: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]
Exempel på kommandorad.
positionella argument:
inputs inmatningsfilnamn (standard är stdin)
valfria argument:
-h, --help visa detta hjälpmeddelande och avsluta
-v producerar verbal utdata
-o FILE direkt utmatning till FILE istället för stdout
-C NUM visa NUM rader med extra kontext
Precis som med optparse
returneras kommandoradsväxlarna och argumenten som ett objekt med attribut som namnges av dest-parametrarna:
-> ./python.exe argparse-exempel.py -v
{"utdata": Ingen,
'is_verbose': True,
'context': 0,
'inputs': []}
-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 fil1 fil2
{'output': '/tmp/output',
'is_verbose': True,
'context': 4,
'inputs': ['file1', 'file2']}
argparse
har mycket finare validering än optparse
; du kan ange ett exakt antal argument som ett heltal, 0 eller fler argument genom att skicka '*'
, 1 eller fler genom att skicka '+'
, eller ett valfritt argument med '?'
. En parser på högsta nivån kan innehålla underparsers för att definiera underkommandon som har olika uppsättningar av switchar, som i svn commit
, svn checkout
, etc. Du kan ange ett arguments typ som FileType
, vilket automatiskt öppnar filer åt dig och förstår att '-'
betyder standardinmatning eller -utmatning.
Se även
- Dokumentation för
argparse
Dokumentationssidan för modulen argparse.
- Migrera optparse-kod till argparse
En del av Python-dokumentationen som beskriver hur man konverterar kod som använder
optparse
.- PEP 389 - argparse - Ny modul för parsning av kommandorader
PEP skrivet och implementerat av Steven Bethard.
PEP 391: Ordboksbaserad konfiguration för loggning¶
Modulen logging
är mycket flexibel; program kan definiera ett träd av loggningssubsystem, och varje logger i detta träd kan filtrera bort vissa meddelanden, formatera dem på olika sätt och skicka meddelanden till ett varierande antal hanterare.
All denna flexibilitet kan kräva en hel del konfiguration. Du kan skriva Python-satser för att skapa objekt och ställa in deras egenskaper, men en komplex konfiguration kräver utförlig men tråkig kod. logging
stöder också en fileConfig()
-funktion som analyserar en fil, men filformatet stöder inte konfiguration av filter och det är rörigare att generera programmatiskt.
Python 2.7 lägger till en dictConfig()
-funktion som använder en ordbok för att konfigurera loggning. Det finns många sätt att producera en ordbok från olika källor: konstruera en med kod; parsa en fil som innehåller JSON; eller använd ett YAML-parsingbibliotek om ett sådant är installerat. För mer information se Funktioner för konfiguration.
I följande exempel konfigureras två loggar, rotloggaren och en logger med namnet ”network”. Meddelanden som skickas till rotloggaren skickas till systemloggen med syslog-protokollet, och meddelanden till ”network”-loggaren skrivs till en network.log
-fil som roteras när loggen når 1 MB.
import logging
import logging.config
configdict = {
'version': 1, # Configuration schema in use; must be 1 for now
'formatters': {
'standard': {
'format': ('%(asctime)s %(name)-15s '
'%(levelname)-8s %(message)s')}},
'handlers': {'netlog': {'backupCount': 10,
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/logs/network.log',
'formatter': 'standard',
'level': 'INFO',
'maxBytes': 1000000},
'syslog': {'class': 'logging.handlers.SysLogHandler',
'formatter': 'standard',
'level': 'ERROR'}},
# Specify all the subordinate loggers
'loggers': {
'network': {
'handlers': ['netlog']
}
},
# Specify properties of the root logger
'root': {
'handlers': ['syslog']
},
}
# Set up configuration
logging.config.dictConfig(configdict)
# As an example, log two error messages
logger = logging.getLogger('/')
logger.error('Database not found')
netlogger = logging.getLogger('network')
netlogger.error('Connection failed')
Tre mindre förbättringar av modulen logging
, alla implementerade av Vinay Sajip, är:
Klassen
SysLogHandler
har nu stöd för syslogging över TCP. Konstruktorn har en socktype parameter som anger vilken typ av socket som ska användas, antingensocket.SOCK_DGRAM
för UDP ellersocket.SOCK_STREAM
för TCP. Standardprotokollet är fortfarande UDP.Logger
-instanser har fått engetChild()
-metod som hämtar en nedåtgående logger med hjälp av en relativ sökväg. När du till exempel hämtar en logger genom att göralog = getLogger('app')
, är anropet avlog.getChild('network.listen')
likvärdigt medgetLogger('app.network.listen')
.Klassen
LoggerAdapter
har fått enisEnabledFor()
-metod som tar en nivå och returnerar om den underliggande loggern skulle behandla ett meddelande med denna nivå av betydelse.
Se även
- PEP 391 - Ordboksbaserad konfiguration för loggning
PEP skrivet och implementerat av Vinay Sajip.
PEP 3106: Vyer i ordboken¶
Dictionary-metoderna keys()
, values()
och items()
är annorlunda i Python 3.x. De returnerar ett objekt som kallas view istället för en helt materialiserad lista.
Det är inte möjligt att ändra returvärdena för keys()
, values()
och items()
i Python 2.7 eftersom för mycket kod skulle brytas. Istället lades 3.x versionerna till under de nya namnen viewkeys()
, viewvalues()
, och viewitems()
.
>>> d = dict((i*10, chr(65+i)) for i in range(26))
>>> d
{0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'}
>>> d.viewkeys()
dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])
Vyer kan itereras över, men nyckel- och objektvyerna fungerar också som uppsättningar. Operatorn &
utför intersektion och |
utför en union:
>>> d1 = dict((i*10, chr(65+i)) for i in range(26))
>>> d2 = dict((i**.5, i) for i in range(1000))
>>> d1.viewkeys() & d2.viewkeys()
set([0.0, 10.0, 20.0, 30.0])
>>> d1.viewkeys() | range(0, 30)
set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])
Vyn håller reda på ordlistan och dess innehåll ändras när ordlistan ändras:
>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])
Observera dock att du inte kan lägga till eller ta bort nycklar medan du itererar över view:
>>> for k in vk:
... d[k*2] = k
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
Du kan använda view-metoderna i Python 2.x-kod, och 2to3-omvandlaren ändrar dem till standardmetoderna keys()
, values()
och items()
.
PEP 3137: Objektet minnesvy¶
Objektet memoryview
ger en vy över ett annat objekts minnesinnehåll som matchar gränssnittet för typen bytes
.
>>> import string
>>> m = memoryview(string.letters)
>>> m
<memory at 0x37f850>
>>> len(m) # Returns length of underlying object
52
>>> m[0], m[25], m[26] # Indexing returns one byte
('a', 'z', 'A')
>>> m2 = m[0:26] # Slicing returns another memoryview
>>> m2
<memory at 0x37f080>
Innehållet i vyn kan konverteras till en sträng av bytes eller en lista av heltal:
>>> m2.tobytes()
'abcdefghijklmnopqrstuvwxyz'
>>> m2.tolist()
[97, 98, 99, 100, 101, 102, 103, ... 121, 122]
>>>
memoryview
-objekt tillåter modifiering av det underliggande objektet om det är ett föränderligt objekt.
>>> m2[0] = 75
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> b = bytearray(string.letters) # Creating a mutable object
>>> b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = memoryview(b)
>>> mb[0] = '*' # Assign to view, changing the bytearray.
>>> b[0:5] # The bytearray has been changed.
bytearray(b'*bcde')
>>>
Andra språkliga förändringar¶
Några mindre ändringar som gjorts i Python-språkets kärna är:
Syntaxen för set-litteraler har backporterats från Python 3.x. Curly brackets används för att omge innehållet i den resulterande mutabla uppsättningen; set-litteraler skiljer sig från ordböcker genom att inte innehålla kolon och värden.
{}
fortsätter att representera en tom ordbok; användset()
för en tom uppsättning.>>> {1, 2, 3, 4, 5} set([1, 2, 3, 4, 5]) >>> set() # empty set set([]) >>> {} # empty dict {}
Återinförd av Alexandre Vassalotti; bpo-2335.
Dictionary and set comprehensions är en annan funktion som är bakåtporterad från 3.x och generaliserar list/generator comprehensions till att använda den bokstavliga syntaxen för sets och dictionaries.
>>> {x: x*x for x in range(6)} {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25} >>> {('a'*x) for x in range(6)} set(['', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])
Återinförd av Alexandre Vassalotti; bpo-2333.
Satsen
with
kan nu använda flera kontexthanterare i en och samma sats. Kontexthanterare bearbetas från vänster till höger och var och en behandlas som början på en nywith
-sats. Detta innebär att:med A() som a, B() som b: ... svit av uttalanden ...
är likvärdig med:
med A() som a: med B() som b: ... svit av uttalanden ...
Funktionen
contextlib.nested()
ger en mycket liknande funktion, så den är inte längre nödvändig och har utgått.(Föreslaget i https://codereview.appspot.com/53094; implementerat av Georg Brandl.)
Konverteringar mellan flyttal och strängar avrundas nu korrekt på de flesta plattformar. Dessa konverteringar sker på många olika ställen:
str()
på flyttal och komplexa tal; konstruktörernafloat
ochcomplex
; numerisk formatering; serialisering och deserialisering av flyttal och komplexa tal med hjälp av modulernamarshal
,pickle
ochjson
; parsning av flyttals- och imaginärlitteraler i Python-kod; ochDecimal
-till-float-konvertering.Relaterat till detta returnerar
repr()
av ett flyttal x nu ett resultat baserat på den kortaste decimalsträngen som garanterat avrundas tillbaka till x med korrekt avrundning (med avrundningsläge halv till jämn). Tidigare gav den en sträng baserad på avrundning av x till 17 decimaler.Avrundningsbiblioteket som är ansvarigt för denna förbättring fungerar på Windows- och Unix-plattformar som använder kompilatorerna gcc, icc eller suncc. Det kan finnas ett litet antal plattformar där korrekt funktion av denna kod inte kan garanteras, så koden används inte på sådana system. Du kan ta reda på vilken kod som används genom att kontrollera
sys.float_repr_style
, som kommer att varashort
om den nya koden används ochlegacy
om den inte gör det.Implementerad av Eric Smith och Mark Dickinson, med hjälp av David Gays
dtoa.c
-bibliotek; bpo-7117.Konverteringar från långa heltal och vanliga heltal till flyttal avrundas nu annorlunda och returnerar det flyttalstal som ligger närmast talet. Detta spelar ingen roll för små heltal som kan konverteras exakt, men för stora tal som oundvikligen kommer att förlora precision, approximerar Python 2.7 nu närmare. Till exempel beräknade Python 2.6 följande:
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935283e+20 >>> n - long(float(n)) 65535L
Python 2.7:s flyttalsresultat är större, men mycket närmare det sanna värdet:
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935289e+20 >>> n - long(float(n)) -1L
(Implementerad av Mark Dickinson; bpo-3166.)
Integer division är också mer exakt i sina avrundningsbeteenden. (Även implementerat av Mark Dickinson; bpo-1811.)
Implicit coercion för komplexa tal har tagits bort; tolken kommer inte längre att försöka anropa en
__coerce__()
-metod på komplexa objekt. (Borttagen av Meador Inge och Mark Dickinson; bpo-5211.)Metoden
str.format()
har nu stöd för automatisk numrering av ersättningsfälten. Detta gör att användning avstr.format()
mer liknar användning av%s
formatering:>>> '{}:{}:{}'.format(2009, 04, 'Sunday') '2009:4:Sunday' >>> '{}:{}:{day}'.format(2009, 4, day='Sunday') '2009:4:Sunday'
Den automatiska numreringen tar fälten från vänster till höger, så den första
{...}
-angivaren kommer att använda det första argumentet tillstr.format()
, nästa angivare kommer att använda nästa argument, och så vidare. Du kan inte blanda automatisk numrering och explicit numrering – antingen numrerar du alla dina specificeringsfält eller inga alls – men du kan blanda automatisk numrering och namngivna fält, som i det andra exemplet ovan. (Bidrag från Eric Smith; bpo-5237.)Komplexa tal stöder nu korrekt användning med
format()
och är som standard högerjusterade. Att ange en precision eller kommaseparering gäller både den reella och imaginära delen av talet, men en angiven fältbredd och justering tillämpas på hela den resulterande1,5+3j
-utmatningen. (Bidrag från Eric Smith; bpo-1588 och bpo-7988.)Formatkoden ’F’ formaterar nu alltid sin utdata med versaler, så den kommer nu att producera ’INF’ och ’NAN’. (Bidrag från Eric Smith; bpo-3382.)
En förändring på låg nivå: metoden
object.__format__()
utlöser nu enPendingDeprecationWarning
om den får en formatsträng, eftersom metoden__format__()
förobject
konverterar objektet till en strängrepresentation och formaterar den. Tidigare tillämpade metoden formatsträngen tyst på strängrepresentationen, men det kunde dölja misstag i Python-koden. Om du tillhandahåller formateringsinformation som en inriktning eller precision, förväntar du dig förmodligen att formateringen ska tillämpas på något objektspecifikt sätt. (Rättad av Eric Smith; bpo-7994.)Typerna
int()
ochlong()
har fått en metodbit_length
som returnerar det antal bitar som krävs för att representera argumentet i binärformat:>>> n = 37 >>> bin(n) '0b100101' >>> n.bit_length() 6 >>> n = 2**123-1 >>> n.bit_length() 123 >>> (n+1).bit_length() 124
(Bidrag från Fredrik Johansson och Victor Stinner; bpo-3439.)
Satsen
import
kommer inte längre att försöka med en absolut import om en relativ import (t.ex.from .os import sep
) misslyckas. Detta åtgärdar en bugg, men kan eventuellt bryta vissaimport
-satser som bara fungerade av misstag. (Åtgärdat av Meador Inge; bpo-7902.)Det är nu möjligt för en underklass av den inbyggda typen
unicode
att åsidosätta metoden__unicode__()
. (Implementerat av Victor Stinner; bpo-1583863.)Metoden
translate()
av typenbytearray
accepterar nuNone
som sitt första argument. (Rättad av Georg Brandl; bpo-4759.)När man använder
@classmethod
och@staticmethod
för att omsluta metoder som klass- eller statiska metoder, visar omslutningsobjektet nu den omslutna funktionen som sitt__func__
-attribut. (Bidrag från Amaury Forgeot d’Arc, efter ett förslag från George Sakkis; bpo-5982.)När en begränsad uppsättning attribut ställdes in med hjälp av
__slots__
, skulle borttagning av ett icke-inställt attribut inte ge upphov tillAttributeError
som förväntat. Fixad av Benjamin Peterson; bpo-7604.)Två nya kodningar stöds nu: ”cp720”, som främst används för arabisk text; och ”cp858”, en variant av CP 850 som lägger till eurosymbolen. (CP720 med bidrag från Alexander Belchenko och Amaury Forgeot d’Arc i bpo-1616979; CP858 med bidrag från Tim Hatch i bpo-8016.)
Objektet
file
kommer nu att sätta attributetfilename
på undantagetIOError
när man försöker öppna en katalog på POSIX-plattformar (noterat av Jan Kaliszewski; bpo-4764), och kontrollerar nu explicit för och förbjuder skrivning till skrivskyddade filobjekt istället för att lita på att C-biblioteket fångar upp och rapporterar felet (åtgärdat av Stefan Krah; bpo-5677).Pythons tokenizer översätter nu radavslut själv, så den inbyggda funktionen
compile()
accepterar nu kod som använder vilken radavslutskonvention som helst. Dessutom kräver den inte längre att koden slutar med en ny rad.Extra parenteser i funktionsdefinitioner är olagliga i Python 3.x, vilket innebär att du får ett syntaxfel från
def f((x)): pass
. I Python3-varningsläge kommer Python 2.7 nu att varna för denna udda användning. (Noterat av James Lingard; bpo-7362.)Det är nu möjligt att skapa svaga referenser till gamla klassobjekt. Klasser i ny stil var alltid svaga referenser. (Rättad av Antoine Pitrou; bpo-8268.)
När ett modulobjekt samlas in i skräp rensas modulens ordbok nu bara om ingen annan har en referens till ordboken (bpo-7140).
Förändringar av tolk¶
En ny miljövariabel, PYTHONWARNINGS
, gör det möjligt att kontrollera varningar. Den bör sättas till en sträng som innehåller varningsinställningar, motsvarande de som används med -W
, åtskilda med kommatecken. (Bidrag från Brian Curtin; bpo-7301.)
Exempelvis kommer följande inställning att skriva ut varningar varje gång de inträffar, men omvandla varningar från modulen Cookie
till ett fel. (Den exakta syntaxen för att ställa in en miljövariabel varierar mellan olika operativsystem och skal)
export PYTHONWARNINGS=all,error:::Cookie:0
Optimeringar¶
Flera prestandaförbättringar har lagts till:
En ny opcode lades till för att utföra den inledande konfigurationen för
with
-satser, genom att leta upp metoderna__enter__()
och__exit__()
. (Bidrag från Benjamin Peterson.)Skräpinsamlaren fungerar nu bättre för ett vanligt användningsmönster: när många objekt allokeras utan att något av dem avallokeras. Detta skulle tidigare ta kvadratisk tid för skräpinsamlingen, men nu minskar antalet fullständiga skräpinsamlingar i takt med att antalet objekt på heapen växer. Den nya logiken utför endast en fullständig skräpinsamling när den mellersta generationen har samlats in 10 gånger och när antalet överlevande objekt från den mellersta generationen överstiger 10% of antalet objekt i den äldsta generationen. (Föreslagen av Martin von Löwis och implementerad av Antoine Pitrou; bpo-4074.)
Garbage collector försöker undvika att spåra enkla behållare som inte kan vara en del av en cykel. I Python 2.7 är detta nu sant för tuples och dicts som innehåller atomära typer (som ints, strängar etc.). Övergångsvis kommer en dikt som innehåller tupler av atomära typer inte heller att spåras. Detta bidrar till att minska kostnaden för varje skräpplockning genom att minska antalet objekt som ska beaktas och genomkorsas av skräpplockaren. (Bidrag från Antoine Pitrou; bpo-4688.)
Långa heltal lagras nu internt antingen i basen
2**15
eller i basen2**30
, basen bestäms vid byggtiden. Tidigare lagrades de alltid i bas2**15
. Att använda bas2**30
ger betydande prestandaförbättringar på 64-bitars maskiner, men benchmarkresultaten på 32-bitars maskiner har varit blandade. Därför är standardinställningen att använda bas2**30
på 64-bitars maskiner och bas2**15
på 32-bitars maskiner; på Unix finns det ett nytt konfigurationsalternativ--enable-big-digits
som kan användas för att åsidosätta denna standardinställning.Bortsett från prestandaförbättringarna bör denna förändring vara osynlig för slutanvändarna, med ett undantag: för test- och felsökningsändamål finns det en ny structseq
sys.long_info
som ger information om det interna formatet, med antalet bitar per siffra och storleken i byte på den C-typ som används för att lagra varje siffra:>>> import sys >>> sys.long_info sys.long_info(bits_per_digit=30, sizeof_digit=4)
(Bidrag från Mark Dickinson; bpo-4258.)
En annan uppsättning ändringar gjorde långa objekt några byte mindre: 2 byte mindre på 32-bitars system och 6 byte på 64-bitars. (Bidrag från Mark Dickinson; bpo-5260.)
Divisionsalgoritmen för långa heltal har gjorts snabbare genom att strama åt den inre slingan, göra skiftningar istället för multiplikationer och fixa en onödig extra iteration. Olika riktmärken visar hastighetsökningar på mellan 50% a och 150% f eller divisioner av långa heltal och modulooperationer. (Bidrag från Mark Dickinson; bpo-5512.) Bitvisa operationer är också betydligt snabbare (initial patch av Gregory Smith; bpo-1087418).
Implementationen av
%
kontrollerar att vänsteroperanden är en Python-sträng och specialanpassar den; detta resulterar i en 1–3% perprestandaökning för program som ofta använder%
med strängar, till exempel mallbibliotek. (Implementerat av Collin Winter; bpo-5176.)Listförståelser med ett
if
villkor kompileras till snabbare bytekod. (Patch av Antoine Pitrou, back-porterad till 2.7 av Jeffrey Yasskin; bpo-4715.)Konvertering av ett heltal eller långt heltal till en decimalsträng gjordes snabbare genom att specialisera bas 10 istället för att använda en generaliserad konverteringsfunktion som stöder godtyckliga baser. (Patch av Gawain Bolton; bpo-6713.)
Metoderna
split()
,replace()
,rindex()
,rpartition()
ochrsplit()
för strängliknande typer (strängar, Unicode-strängar ochbytearray
-objekt) använder nu en snabb omvänd sökalgoritm istället för en tecken-för-tecken-sökning. Detta är ibland snabbare med en faktor 10. (Tillagd av Florent Xicluna; bpo-7462 och bpo-7622.)Modulerna
pickle
ochcPickle
internaliserar nu automatiskt strängarna som används för attributnamn, vilket minskar minnesanvändningen för objekten till följd av unpickling. (Bidrag från Jake McGuire; bpo-5084.)Modulen
cPickle
har nu specialfall för ordböcker, vilket nästan halverar tiden som krävs för att plocka dem. (Bidrag från Collin Winter; bpo-5670.)
Nya och förbättrade moduler¶
Som i varje release fick Pythons standardbibliotek ett antal förbättringar och buggfixar. Här är en partiell lista över de mest anmärkningsvärda ändringarna, sorterade alfabetiskt efter modulnamn. Se filen Misc/NEWS
i källträdet för en mer komplett lista över ändringar, eller titta igenom Subversion-loggarna för alla detaljer.
Modulen
bdb
basklass för felsökningBdb
har fått en funktion för att hoppa över moduler. Konstruktören tar nu en iterabel som innehåller glob-stil mönster somdjango.*
; felsökaren kommer inte att gå in i stack frames från en modul som matchar ett av dessa mönster. (Bidrag från Maru Newby efter ett förslag från Senthil Kumaran; bpo-5142.)Modulen
binascii
har nu stöd för buffert-API:t, så den kan användas medmemoryview
-instanser och andra liknande buffertobjekt. (Baktransporterad från 3.x av Florent Xicluna; bpo-7703.)Uppdaterad modul: Modulen
bsddb
har uppdaterats från 4.7.2devel9 till version 4.8.4 av the pybsddb package. Den nya versionen har bättre Python 3.x-kompatibilitet, olika buggfixar och lägger till flera nya BerkeleyDB-flaggor och -metoder. (Uppdaterad av Jesús Cea Avión; bpo-8156. Ändringsloggen för pybsddb kan läsas på https://hg.jcea.es/pybsddb/file/tip/ChangeLog.)Modulen
bz2
:sBZ2File
stöder nu kontexthanteringsprotokollet, så att du kan skrivamed bz2.BZ2File(...) som f:
. (Bidrag från Hagen Fürstenau; bpo-3860.)Ny klass: Klassen
Counter
i modulencollections
är användbar för att räkna data. Instanser avCounter
beter sig mestadels som ordböcker men returnerar noll om nycklar saknas istället för att ge upphov tillKeyError
:>>> from collections import Counter >>> c = Counter() >>> for letter in 'here is a sample of english text': ... c[letter] += 1 ... >>> c Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2, 'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1, 'p': 1, 'r': 1, 'x': 1}) >>> c['e'] 5 >>> c['z'] 0
Det finns ytterligare tre
Counter
-metoder.most_common()
returnerar de N vanligaste elementen och deras antal.elements()
returnerar en iterator över de ingående elementen och upprepar varje element lika många gånger som dess antal.subtract()
tar en iterabel och subtraherar ett för varje element istället för att addera; om argumentet är en ordbok eller en annanCounter
subtraheras antalet.>>> c.most_common(5) [(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)] >>> c.elements() -> 'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ', 'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i', 'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's', 's', 's', 'r', 't', 't', 'x' >>> c['e'] 5 >>> c.subtract('very heavy on the letter e') >>> c['e'] # Count is now lower -1
Bidrag från Raymond Hettinger; bpo-1696199.
Ny klass:
OrderedDict
beskrivs i det tidigare avsnittet PEP 372: Lägga till en ordnad ordbok i samlingar.Ny metod: Datatypen
deque
har nu encount()
-metod som returnerar antalet ingående element som är lika med det medföljande argumentet x, och enreverse()
-metod som reverserar elementen i deque på plats.deque
exponerar också sin maximala längd som det skrivskyddade attributetmaxlen
. (Båda funktionerna har lagts till av Raymond Hettinger.)Klassen
namedtuple
har nu en valfri parameter rename. Om rename är true kommer fältnamn som är ogiltiga eftersom de har upprepats eller inte är lagliga Python-identifierare att bytas ut mot lagliga namn som härleds från fältets position i listan över fält:>>> from collections import namedtuple >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True) >>> T._fields ('field1', '_1', '_2', 'field2')
(Tillagd av Raymond Hettinger; bpo-1818.)
Slutligen returnerar den abstrakta basklassen
Mapping
nuNotImplemented
om en mappning jämförs med en annan typ som inte är enMapping
. (Rättad av Daniel Stutzbach; bpo-8729.)Konstruktörer för parsing-klasserna i modulen
ConfigParser
tar nu en allow_no_value-parameter, med false som standard; om true tillåts alternativ utan värden. Till exempel:>>> import ConfigParser, StringIO >>> sample_config = """ ... [mysqld] ... user = mysql ... pid-file = /var/run/mysqld/mysqld.pid ... skip-bdb ... """ >>> config = ConfigParser.RawConfigParser(allow_no_value=True) >>> config.readfp(StringIO.StringIO(sample_config)) >>> config.get('mysqld', 'user') 'mysql' >>> print config.get('mysqld', 'skip-bdb') None >>> print config.get('mysqld', 'unknown') Traceback (most recent call last): ... NoOptionError: No option 'unknown' in section: 'mysqld'
(Bidrag från Mats Kindahl; bpo-7005.)
Föråldrad funktion:
contextlib.nested()
, som gör det möjligt att hantera mer än en kontexthanterare med ett endawith
-svar, har utgått eftersomwith
-svaret nu stöder flera kontexthanterare.Modulen
cookielib
ignorerar nu cookies som har ett ogiltigt versionsfält, ett som inte innehåller ett heltalsvärde. (Åtgärdat av John J. Lee; bpo-3924.)Modulen
copy
:sdeepcopy()
-funktion kopierar nu bundna instansmetoder korrekt. (Implementerat av Robert Collins; bpo-1515.)Modulen
ctypes
konverterar nu alltidNone
till en CNULL
-pekare för argument som deklarerats som pekare. (Ändrad av Thomas Heller; bpo-4606.) Det underliggande libffi-biblioteket har uppdaterats till version 3.0.9, som innehåller diverse korrigeringar för olika plattformar. (Uppdaterad av Matthias Klose; bpo-8142.)Ny metod:
datetime
-modulenstimedelta
-klass har fått entotal_seconds()
-metod som returnerar antalet sekunder i varaktigheten. (Bidrag från Brian Quinlan; bpo-5788.)Ny metod: Klassen
Decimal
har fått en klassmetodfrom_float()
som utför en exakt konvertering av ett flyttal till enDecimal
. Denna exakta konvertering strävar efter den närmaste decimala approximationen av värdet i flyttalsrepresentationen; det resulterande decimalvärdet kommer därför fortfarande att inkludera felaktigheten, om någon. For example,Decimal.from_float(0.1)
returnsDecimal('0.1000000000000000055511151231257827021181583404541015625')
. (Implementerad av Raymond Hettinger; bpo-4796.)Jämförelse av instanser av
Decimal
med flyttal ger nu förnuftiga resultat baserat på operandernas numeriska värden. Tidigare skulle sådana jämförelser falla tillbaka på Pythons standardregler för att jämföra objekt, vilket gav godtyckliga resultat baserat på deras typ. Observera att du fortfarande inte kan kombineraDecimal
och flyttal i andra operationer som t.ex. addition, eftersom du uttryckligen bör välja hur du konverterar mellan flyttal ochDecimal
. (Rättad av Mark Dickinson; bpo-2531.)Konstruktören för
Decimal
accepterar nu flyttal (tillagt av Raymond Hettinger; bpo-8257) och icke-europeiska Unicode-tecken som arabiska och indiska siffror (bidrag från Mark Dickinson; bpo-6595).De flesta av metoderna i klassen
Context
accepterar nu heltal såväl somDecimal
instanser; de enda undantagen är metodernacanonical()
ochis_canonical()
. (Patch av Juan José Conti; bpo-7633.)När man använder
Decimal
-instanser med en strängsformat()
-metod var standardjusteringen tidigare vänsterjustering. Detta har ändrats till högerjustering, vilket är mer förnuftigt för numeriska typer. (Ändrad av Mark Dickinson; bpo-6857.)Jämförelser som involverar ett signalerande NaN-värde (eller
NAN
) signalerar nuInvalidOperation
istället för att i tysthet returnera ett sant eller falskt värde beroende på jämförelseoperatorn. Tysta NaN-värden (ellerNaN
) är nu hashbara. (Rättad av Mark Dickinson; bpo-7279.)Modulen
difflib
producerar nu utdata som är mer kompatibla med moderna diff/patch-verktyg genom en liten ändring, nämligen att använda ett tabbtecken istället för mellanslag som separator i rubriken som anger filnamnet. (Fixad av Anatoly Techtonik; bpo-7585.)Distutils
sdist
-kommando regenererar nu alltid filenMANIFEST
, eftersom även om filernaMANIFEST.in
ellersetup.py
inte har ändrats, kan användaren ha skapat några nya filer som bör inkluderas. (Rättad av Tarek Ziadé; bpo-8688.)doctest
-modulensIGNORE_EXCEPTION_DETAIL
-flagga ignorerar nu namnet på den modul som innehåller det undantag som testas. (Patch av Lennart Regebro; bpo-7490.)Modulen
email
:s klassMessage
accepterar nu en Unicode-värderad nyttolast och konverterar automatiskt nyttolasten till den kodning som anges avoutput_charset
. (Tillagd av R. David Murray; bpo-1368247.)Klassen
Fraction
accepterar nu en enda float- ellerDecimal
-instans, eller två rationella tal, som argument till sin konstruktor. (Implementerad av Mark Dickinson; rationella tal tillkom i bpo-5812, och float/decimal i bpo-8294.)Jämförelser av ordningsföljd (
<
,<=
,>
,>=
) mellan bråk och komplexa tal ger nu upphov till ettTypeError
. Detta åtgärdar ett förbiseende, vilket gör attFraction
matchar de andra numeriska typerna.Ny klass:
FTP_TLS
i modulenftplib
ger säkra FTP-anslutningar med TLS-inkapsling av autentisering samt efterföljande kontroll- och dataöverföringar. (Bidrag från Giampaolo Rodola; bpo-2054.)Metoden
storbinary()
för binära uppladdningar kan nu starta om uppladdningar tack vare en tillagd rest-parameter (patch av Pablo Mouzo; bpo-6845.)Ny klassdekorator:
total_ordering()
i modulenfunctools
tar en klass som definierar en__eq__()
-metod och en av__lt__()
,__le__()
,__gt__()
eller__ge__()
och genererar de jämförelsemetoder som saknas. Eftersom metoden__cmp__()
försvinner i Python 3.x gör den här dekoratorn det enklare att definiera ordnade klasser. (Tillagd av Raymond Hettinger; bpo-5479.)Ny funktion:
cmp_to_key()
tar en gammaldags jämförelsefunktion som förväntar sig två argument och returnerar en ny anropbar funktion som kan användas som key-parameter till funktioner somsorted()
,min()
ochmax()
, etc. Den primära avsedda användningen är att hjälpa till med att göra kod kompatibel med Python 3.x. (Tillagd av Raymond Hettinger.)Ny funktion:
gc
-modulensis_tracked()
returnerar true om en given instans spåras av skräpsamlaren, false annars. (Bidrag från Antoine Pitrou; bpo-4688.)Modulen
gzip
GzipFile
har nu stöd för kontexthanteringsprotokollet, så att du kan skrivawith gzip.GzipFile(...) as f:
(bidrag från Hagen Fürstenau; bpo-3860), och den implementerar nuio.BufferedIOBase
ABC, så att du kan linda in den medio.BufferedReader
för snabbare bearbetning (bidrag från Nir Aides; bpo-7471). Det är nu också möjligt att åsidosätta den modifieringstid som registreras i en gzippad fil genom att tillhandahålla en valfri tidsstämpel till konstruktören. (Bidrag från Jacques Frechet; bpo-4272.)Filer i gzip-format kan fyllas på med nollbyte i slutet; modulen
gzip
kommer nu att använda dessa nollbyte i slutet. (Rättad av Tadek Pietraszek och Brian Curtin; bpo-2846.)Nytt attribut: Modulen
hashlib
har nu ett attributalgorithms
som innehåller en tupel som namnger de algoritmer som stöds. I Python 2.7 innehållerhashlib.algorithms
('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
. (Bidrag från Carl Chenet; bpo-7418.)Standardklassen
HTTPResponse
som används av modulenhttplib
har nu stöd för buffring, vilket resulterar i mycket snabbare läsning av HTTP-svar. (Bidrag från Kristján Valur Jónsson; bpo-4879.)Klasserna
HTTPConnection
ochHTTPSConnection
har nu stöd för en source_address-parameter, en(host, port)
2-tupel som anger den källadress som ska användas för anslutningen. (Bidrag från Eldon Ziegler; bpo-3972.)Modulen
ihooks
stöder nu relativ import. Observera attihooks
är en äldre modul för att anpassa import, ersatt av modulenimputil
som tillkom i Python 2.0. (Stöd för relativ import tillagt av Neil Schemenauer.)Modulen
imaplib
har nu stöd för IPv6-adresser. (Bidrag från Derek Morr; bpo-1655.)Ny funktion:
inspect
-modulensgetcallargs()
tar en anropbar parameter och dess positions- och nyckelordsargument och räknar ut vilken av den anropbara parametern som ska ta emot varje argument, och returnerar en ordbok som mappar argumentnamn till deras värden. Till exempel:>>> from inspect import getcallargs >>> def f(a, b=1, *pos, **named): ... pass ... >>> getcallargs(f, 1, 2, 3) {'a': 1, 'b': 2, 'pos': (3,), 'named': {}} >>> getcallargs(f, a=2, x=4) {'a': 2, 'b': 1, 'pos': (), 'named': {'x': 4}} >>> getcallargs(f) Traceback (most recent call last): ... TypeError: f() takes at least 1 argument (0 given)
Bidrag från George Sakkis; bpo-3135.
Uppdaterad modul: Biblioteket
io
har uppgraderats till den version som levereras med Python 3.1. För 3.1 skrevs I/O-biblioteket om helt i C och är 2 till 20 gånger snabbare beroende på vilken uppgift som utförs. Den ursprungliga Python-versionen döptes om till modulen_pyio
.En mindre förändring: klassen
io.TextIOBase
har nu ett attributerrors
som anger den felinställning som används för kodnings- och avkodningsfel (en av'strict'
,'replace'
,'ignore'
).Klassen
io.FileIO
ger nu upphov till ettOSError
när en ogiltig filbeskrivare skickas. (Implementerat av Benjamin Peterson; bpo-4991.) Metodentruncate()
bevarar nu filpositionen; tidigare ändrade den filpositionen till slutet av den nya filen. (Åtgärdat av Pascal Chambon; bpo-6939.)Ny funktion:
itertools.compress(data, selectors)
tar två iteratorer. Element i data returneras om motsvarande värde i selectors är true:itertools.compress('ABCDEF', [1,0,1,0,1,1]) => A, C, E, F
Ny funktion:
itertools.combinations_with_replacement(iter, r)
returnerar alla möjliga r-längdkombinationer av element från iterabeln iter. Till skillnad fråncombinations()
kan enskilda element upprepas i de genererade kombinationerna:itertools.kombinationer_med_ersättning('abc', 2) => ('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')
Observera att element behandlas som unika beroende på deras position i inmatningen, inte deras faktiska värden.
Funktionen
itertools.count()
har nu ett step-argument som tillåter inkrementering med andra värden än 1.count()
tillåter nu också nyckelordsargument och användning av värden som inte är heltal, t.ex. flyttal ellerDecimal
-instanser. (Implementerat av Raymond Hettinger; bpo-5032.)itertools.combinations()
ochitertools.product()
gav tidigare upphov tillValueError
för värden på r som var större än den ingående iterabeln. Detta ansågs vara ett specifikationsfel, så de returnerar nu en tom iterator. (Åtgärdat av Raymond Hettinger; bpo-4816.)Uppdaterad modul: Modulen
json
uppgraderades till version 2.0.9 av paketet simplejson, som innehåller ett C-tillägg som gör kodning och avkodning snabbare. (Bidrag från Bob Ippolito; bpo-4136.)För att stödja den nya
collections.OrderedDict
-typen harjson.load()
nu en valfri object_pairs_hook-parameter som kommer att anropas med alla objektlitteraler som avkodas till en lista med par. (Bidrag från Raymond Hettinger; bpo-5381.)Klassen
Maildir
i modulenmailbox
registrerar nu tidsstämpeln för de kataloger som läses och läser bara om dem igen om modifieringstiden har ändrats i efterhand. Detta förbättrar prestandan genom att onödiga kataloggenomsökningar undviks. (Rättad av A.M. Kuchling och Antoine Pitrou; bpo-1607951, bpo-6896.)Nya funktioner: Modulen
math
har fåtterf()
ocherfc()
för felfunktionen och den komplementära felfunktionen,expm1()
som beräknare**x - 1
med mer precision än att användaexp()
och subtrahera 1,gamma()
för Gamma-funktionen ochlgamma()
för den naturliga logaritmen av Gamma-funktionen. (Bidrag från Mark Dickinson och nirinA raseliarison; bpo-3366.)multiprocessing
-modulensManager*
-klasser kan nu skickas till en anropbar som anropas när en underprocess startas, tillsammans med en uppsättning argument som skickas till den anropbara. (Bidrag från lekma; bpo-5585.)Klassen
Pool
, som styr en pool av arbetsprocesser, har nu en valfri parameter maxtasksperchild. Arbetsprocesserna kommer att utföra det angivna antalet uppgifter och sedan avsluta, vilket gör attPool
startar en ny arbetsprocess. Detta är användbart om uppgifter kan läcka minne eller andra resurser, eller om vissa uppgifter gör att arbetsprocessen blir mycket stor. (Bidrag från Charles Cazabon; bpo-6963.)Modulen
nntplib
har nu stöd för IPv6-adresser. (Bidrag från Derek Morr; bpo-1664.)Nya funktioner: Modulen
os
omsluter följande POSIX-anrop:getresgid()
ochgetresuid()
, som returnerar verkliga, effektiva och sparade GID och UID;setresgid()
ochsetresuid()
, som sätter verkliga, effektiva och sparade GID och UID till nya värden;initgroups()
, som initierar gruppåtkomstlistan för den aktuella processen. (GID/UID-funktioner bidragit med av Travis H.; bpo-6508. Stöd för initgroups tillagt av Jean-Paul Calderone; bpo-7333.)Funktionen
os.fork()
återinitierar nu importlåset i barnprocessen; detta åtgärdar problem på Solaris närfork()
anropas från en tråd. (Åtgärdat av Zsolt Cserna; bpo-7242.)I modulen
os.path
bevarar nu funktionernanormpath()
ochabspath()
Unicode; om deras indatasökväg är en Unicode-sträng är returvärdet också en Unicode-sträng. (normpath()
åtgärdad av Matt Giuca i bpo-5827;abspath()
åtgärdad av Ezio Melotti i bpo-3426.)Modulen
pydoc
har nu hjälp för de olika symbolerna som Python använder. Du kan nu görahelp('<<')
ellerhelp('@')
, till exempel. (Bidrag från David Laban; bpo-4739.)re
-modulenssplit()
,sub()
ochsubn()
accepterar nu ett valfritt flags-argument, för konsekvens med de andra funktionerna i modulen. (Tillagd av Gregory P. Smith.)Ny funktion:
run_path()
i modulenrunpy
kommer att exekvera koden på ett angivet path-argument. path kan vara sökvägen till en Python-källfil (example.py
), en kompilerad bytecode-fil (example.pyc
), en katalog (./package/
) eller ett zip-arkiv (example.zip
). Om en katalog eller zip-sökväg anges kommer den att läggas till i början avsys.path
och modulen__main__`
kommer att importeras. Det förväntas att katalogen eller zip-filen innehåller en__main__.py
; om den inte gör det kan någon annan__main__.py
importeras från en plats längre fram isys.path
. Detta gör mer av maskineriet irunpy
tillgängligt för skript som vill efterlikna hur Pythons kommandorad behandlar ett explicit sökvägsnamn. (Tillagd av Nick Coghlan; bpo-6816.)Ny funktion: I modulen
shutil
tarmake_archive()
ett filnamn, en arkivtyp (zip- eller tar-format) och en sökväg till en katalog och skapar ett arkiv med katalogens innehåll. (Tillagd av Tarek Ziadé.)shutil
:s funktionercopyfile()
ochcopytree()
ger nu upphov till ettSpecialFileError
-undantag när de ombeds kopiera en namngiven pipe. Tidigare skulle koden behandla namngivna pipes som en vanlig fil genom att öppna dem för läsning, och detta skulle blockera i all oändlighet. (Åtgärdat av Antoine Pitrou; bpo-3002.)Modulen
signal
installerar inte längre om signalhanteraren om det inte verkligen är nödvändigt, vilket åtgärdar en bugg som kunde göra det omöjligt att fånga EINTR-signalen på ett robust sätt. (Rättad av Charles-Francois Natali; bpo-8354.)Nya funktioner: I
site
-modulen returnerar tre nya funktioner olika plats- och användarspecifika sökvägar.getsitepackages()
returnerar en lista med alla globala plats-paketkataloger,getusersitepackages()
returnerar sökvägen till användarens katalog med webbplats-paket ochgetuserbase()
returnerar värdet på miljövariabelnUSER_BASE
, vilket ger sökvägen till en katalog som kan användas för att lagra data. (Bidrag från Tarek Ziadé; bpo-6693.)Modulen
site
rapporterar nu undantag som inträffar när modulensitecustomize
importeras, och kommer inte längre att fånga och svälja undantagetKeyboardInterrupt
. (Åtgärdat av Victor Stinner; bpo-3137.)Funktionen
create_connection()
fick en source_address parameter, en(host, port)
2-tupel som ger källadressen som kommer att användas för anslutningen. (Bidrag från Eldon Ziegler; bpo-3972.)Metoderna
recv_into()
ochrecvfrom_into()
kommer nu att skriva till objekt som stöder buffert-API:t, mest användbart är objektenbytearray
ochmemoryview
. (Implementerat av Antoine Pitrou; bpo-8104.)Klassen
TCPServer
i modulenSocketServer
har nu stöd för timeouts för socket och inaktivering av Nagle-algoritmen. Klassattributetdisable_nagle_algorithm
är som standardFalse
; om det åsidosätts till true kommer nya request-anslutningar att ha TCP_NODELAY-alternativet inställt för att förhindra buffring av många små sändningar i ett enda TCP-paket. Klassattributettimeout
kan innehålla en timeout i sekunder som kommer att tillämpas på request socket; om ingen request tas emot inom den tiden kommerhandle_timeout()
att anropas ochhandle_request()
kommer att returneras. (Bidrag från Kristján Valur Jónsson; bpo-6192 och bpo-6267.)Uppdaterad modul: Modulen
sqlite3
har uppdaterats till version 2.6.0 av pysqlite-paketet. Version 2.6.0 innehåller ett antal buggfixar och ger möjlighet att ladda SQLite-tillägg från delade bibliotek. Anropa metodenenable_load_extension(True)
för att aktivera tillägg, och anropa sedanload_extension()
för att ladda ett visst delat bibliotek. (Uppdaterad av Gerhard Häring.)ssl
-modulensSSLSocket
-objekt stöder nu buffer-API:t, vilket åtgärdade ett fel i en testsvit (fixad av Antoine Pitrou; bpo-7133) och automatiskt ställer in OpenSSL:sSSL_MODE_AUTO_RETRY
, vilket förhindrar att en felkod returneras frånrecv()
-operationer som utlöser en SSL-omförhandling (fixad av Antoine Pitrou; bpo-8222).Konstruktorfunktionen
wrap_socket()
tar nu ett ciphers-argument som är en sträng som listar de krypteringsalgoritmer som ska tillåtas; strängens format beskrivs i OpenSSL-dokumentationen. (Tillagd av Antoine Pitrou; bpo-8322.)En annan ändring gör att tillägget laddar alla OpenSSL:s chiffer och digest-algoritmer så att de alla är tillgängliga. Vissa SSL-certifikat kunde inte verifieras och rapporterade ett ”okänd algoritm”-fel. (Rapporterat av Beda Kosata, och åtgärdat av Antoine Pitrou; bpo-8484.)
Den version av OpenSSL som används är nu tillgänglig som modulattributen
ssl.OPENSSL_VERSION
(en sträng),ssl.OPENSSL_VERSION_INFO
(en 5-tupel) ochssl.OPENSSL_VERSION_NUMBER
(ett heltal). (Tillagd av Antoine Pitrou; bpo-8321.)Modulen
struct
ignorerar inte längre överfyllnadsfel när ett värde är för stort för en viss heltalsformatkod (en avbBhHiIlLqQ
); den ger nu alltid upphov till ettstruct.error
-undantag. (Ändrad av Mark Dickinson; bpo-1523.) Funktionenpack()
kommer också att försöka använda__index__()
för att konvertera och packa icke-integraler innan den försöker med metoden__int__()
eller rapporterar ett fel. (Ändrad av Mark Dickinson; bpo-8300.)Ny funktion:
subprocess
-modulenscheck_output()
kör ett kommando med en angiven uppsättning argument och returnerar kommandots utdata som en sträng när kommandot körs utan fel, eller ger upphov till ettCalledProcessError
-undantag i annat fall.>>> subprocess.check_output(['df', '-h', '.']) 'Filesystem Size Used Avail Capacity Mounted on\n /dev/disk0s2 52G 49G 3.0G 94% /\n' >>> subprocess.check_output(['df', '-h', '/bogus']) ... subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1
(Bidrag från Gregory P. Smith.)
Modulen
subprocess
kommer nu att försöka igen med sina interna systemanrop när den får enEINTR
-signal. (Rapporterades av flera personer; slutlig patch av Gregory P. Smith i bpo-1068268.)Ny funktion:
is_declared_global()
i modulensymtable
returnerar true för variabler som uttryckligen deklarerats vara globala, false för sådana som är implicit globala. (Bidrag från Jeremy Hylton.)Modulen
syslog
kommer nu att använda värdet avsys.argv[0]
som identifierare istället för det tidigare standardvärdet'python'
. (Ändrad av Sean Reifschneider; bpo-8451.)Värdet
sys.version_info
är nu en namngiven tupel, med attributenmajor
,minor
,micro
,releaselevel
ochserial
. (Bidrag från Ross Light; bpo-4285.)sys.getwindowsversion()
returnerar också en namngiven tupel, med attributenmajor
,minor
,build
,platform
,service_pack
,service_pack_major
,service_pack_minor
,suite_mask
ochproduct_type
. (Bidrag från Brian Curtin; bpo-7766.)Standardfelhanteringen i modulen
tarfile
har ändrats så att fatala fel inte längre undertrycks. Den förinställda felnivån var tidigare 0, vilket innebar att fel bara resulterade i att ett meddelande skrevs till debugloggen, men eftersom debugloggen inte är aktiverad som standard går dessa fel obemärkta förbi. Standardnivån för fel är nu 1, vilket innebär att ett undantag uppstår om ett fel inträffar. (Ändrad av Lars Gustäbel; bpo-7357.)tarfile
stöder nu filtrering avTarInfo
-objekt som läggs till i en tar-fil. När du anroparadd()
kan du ange ett valfritt filter-argument som är en anropsbarhet. Anropsbarheten filter kommer att fåTarInfo
för varje fil som läggs till, och kan modifiera och returnera den. Om den anropsbara filen returnerarNone
kommer filen att uteslutas från det resulterande arkivet. Detta är mer kraftfullt än det befintliga exclude-argumentet, som därför har utgått. (Tillagd av Lars Gustäbel; bpo-6856.) KlassenTarFile
har nu också stöd för kontexthanteringsprotokollet. (Tillagd av Lars Gustäbel; bpo-7232.)Metoden
wait()
i klassenthreading.Event
returnerar nu den interna flaggan vid avslut. Detta innebär att metoden vanligtvis returnerar true eftersomwait()
är tänkt att blockera tills den interna flaggan blir true. Returvärdet kommer bara att vara falskt om en timeout angavs och operationen timade ut. (Bidrag från Tim Lesher; bpo-1674032.)Unicode-databasen som tillhandahålls av modulen
unicodedata
används nu internt för att avgöra vilka tecken som är numeriska, blanksteg eller representerar radbrytningar. Databasen innehåller även information från datafilenUnihan.txt
(patch av Anders Chrigström och Amaury Forgeot d’Arc; bpo-1571184) och har uppdaterats till version 5.2.0 (uppdaterad av Florent Xicluna; bpo-8024).urlparse
-modulensurlsplit()
hanterar nu okända URL-scheman på ett sätt som överensstämmer med RFC 3986: om URL:en är av formen"<something>://..."
, behandlas texten före://
som schemat, även om det är ett påhittat schema som modulen inte känner till. Denna förändring kan bryta kod som fungerade runt det gamla beteendet. Till exempel kommer Python 2.6.4 eller 2.5 att returnera följande:>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
Python 2.7 (och Python 2.6.5) kommer att returnera:
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
(Python 2.7 ger faktiskt något annorlunda resultat, eftersom den returnerar en namngiven tupel i stället för en standardtupel)
Modulen
urlparse
har även stöd för IPv6-litterära adresser enligt definitionen i RFC 2732 (bidrag från Senthil Kumaran; bpo-2987).>>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo') ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]', path='/foo', params='', query='', fragment='')
Ny klass: Klassen
WeakSet
i modulenweakref
är en uppsättning som endast innehåller svaga referenser till dess element; elementen kommer att tas bort när det inte finns några referenser som pekar på dem. (Ursprungligen implementerad i Python 3.x av Raymond Hettinger, och backporterad till 2.7 av Michael Foord.)Biblioteket
xml.etree.ElementTree
escapar inte längre ampersand och vinkelparenteser vid utmatning av en XML-bearbetningsinstruktion (som ser ut som<?xml-stylesheet href="#style1"?>
) eller kommentar (som ser ut som<!-- comment -->
). (Patch av Neil Muller; bpo-2746.)XML-RPC-klienten och -servern, som tillhandahålls av modulerna
xmlrpclib
ochSimpleXMLRPCServer
, har förbättrad prestanda genom att stödja HTTP/1.1 keep-alive och genom att valfritt använda gzip-kodning för att komprimera XML som utväxlas. Gzip-komprimeringen styrs av attributetencode_threshold
iSimpleXMLRPCRequestHandler
, som innehåller en storlek i byte; svar som är större än detta kommer att komprimeras. (Bidrag från Kristján Valur Jónsson; bpo-6267.)Modulen
zipfile
ZipFile
har nu stöd för kontexthanteringsprotokollet, så att du kan skrivamed zipfile.ZipFile(...) som f:
. (Bidrag från Brian Curtin; bpo-5511.)zipfile
stöder nu även arkivering av tomma kataloger och extraherar dem korrekt. (Åtgärdat av Kuba Wieczorek; bpo-4710.) Det går snabbare att läsa filer ur ett arkiv, och sammankopplingen avread()
ochreadline()
fungerar nu korrekt. (Bidrag från Nir Aides; bpo-7610.)Funktionen
is_zipfile()
accepterar nu ett filobjekt, utöver de sökvägsnamn som accepterades i tidigare versioner. (Bidrag från Gabriel Genellina; bpo-4756.)Metoden
writestr()
har nu en valfri parameter compress_type som låter dig åsidosätta den standardkomprimeringsmetod som anges i konstruktörenZipFile
. (Bidrag från Ronald Oussoren; bpo-6003.)
Ny modul: importlib¶
Python 3.1 innehåller paketet importlib
, en omimplementering av den logik som ligger bakom Pythons import
. importlib
är användbart för implementatörer av Python-tolkar och för användare som vill skriva nya importörer som kan delta i importprocessen. Python 2.7 innehåller inte hela importlib
-paketet, utan istället en liten delmängd som innehåller en enda funktion, import_module()
.
import_module(name, package=None)
importerar en modul. name är en sträng som innehåller modulens eller paketets namn. Det är möjligt att göra relativ import genom att ange en sträng som börjar med tecknet .
, t.ex. ..utils.errors
. För relativ import måste argumentet package anges och är namnet på det paket som kommer att användas som ankare för den relativa importen. import_module()
både infogar den importerade modulen i sys.modules
och returnerar modulobjektet.
Här är några exempel:
>>> from importlib import import_module
>>> anydbm = import_module('anydbm') # Standard absolute import
>>> anydbm
<module 'anydbm' from '/p/python/Lib/anydbm.py'>
>>> # Relative import
>>> file_util = import_module('..file_util', 'distutils.command')
>>> file_util
<module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>
importlib
implementerades av Brett Cannon och infördes i Python 3.1.
Ny modul: sysconfig¶
Modulen sysconfig
har dragits ut ur Distutils-paketet och blivit en ny toppnivåmodul i sin egen rätt. sysconfig
innehåller funktioner för att få information om Pythons byggprocess: kompilatorbyten, installationssökvägar, plattformsnamn och om Python körs från källkatalogen.
Några av funktionerna i modulen är:
get_config_var()
returnerar variabler från Pythons Makefile och filenpyconfig.h
.get_config_vars()
returnerar en ordbok som innehåller alla konfigurationsvariabler.get_path()
returnerar den konfigurerade sökvägen för en viss typ av modul: standardbiblioteket, platsspecifika moduler, plattformsspecifika moduler etc.is_python_build()
returnerar true om du kör en binärfil från ett Python-källträd, och false annars.
Mer information och en fullständig lista över funktioner finns i sysconfig
-dokumentationen.
Distutils-paketet och sysconfig
underhålls nu av Tarek Ziadé, som också har startat ett Distutils2-paket (källförvar på https://hg.python.org/distutils2/) för att utveckla en nästa generations version av Distutils.
ttk: Tematiserade widgets för Tk¶
Tcl/Tk 8.5 innehåller en uppsättning tematiska widgetar som återimplementerar grundläggande Tk-widgetar men har ett mer anpassningsbart utseende och därför kan likna den inbyggda plattformens widgetar mer. Denna widgetuppsättning kallades ursprungligen Tile, men döptes om till Ttk (för ”themed Tk”) när den lades till i Tcl/Tck version 8.5.
Om du vill veta mer kan du läsa dokumentationen för modulen ttk
. Du kanske också vill läsa Tcl/Tk-manualsidan som beskriver Ttk-temamotorn, som finns på https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html. Några skärmdumpar av Python/Ttk-koden som används finns på https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki.
Modulen tkinter.ttk
skrevs av Guilherme Polo och lades till i bpo-2983. En alternativ version kallad Tile.py
, skriven av Martin Franklin och underhållen av Kevin Walzer, föreslogs för inkludering i bpo-2618, men författarna hävdade att Guilherme Polos arbete var mer omfattande.
Uppdaterad modul: unittest¶
Modulen unittest
har förbättrats avsevärt och många nya funktioner har lagts till. De flesta av dessa funktioner har implementerats av Michael Foord, om inte annat anges. Den förbättrade versionen av modulen kan laddas ner separat för användning med Python-versionerna 2.4 till 2.6, paketerad som paketet unittest2
, från unittest2.
När modulen används från kommandoraden kan den automatiskt upptäcka tester. Det är inte lika snyggt som py.test eller nose, men ger ett enkelt sätt att köra tester som finns i en uppsättning paketkataloger. Till exempel kommer följande kommando att söka i underkatalogen test/
efter alla importerbara testfiler med namnet test*.py
:
python -m unittest discover -s test
Se dokumentationen för modulen unittest
för mer information. (Utvecklad i bpo-6001.)
Funktionen main()
har stöd för några andra nya alternativ:
-b
eller--buffer
buffrar standardutdata- och standardfelströmmarna under varje test. Om testet godkänns kommer all resulterande utdata att kasseras; om testet misslyckas kommer den buffrade utdata att visas.-c
eller--catch
gör att avbrottet i kontroll-C hanteras på ett mer elegant sätt. Istället för att avbryta testprocessen omedelbart, kommer det pågående testet att slutföras och sedan kommer delresultaten fram till avbrottet att rapporteras. Om du är otålig kan du trycka på control-C en gång till för att orsaka ett omedelbart avbrott.Denna kontroll-C-hanterare försöker undvika att orsaka problem när koden som testas eller testerna som körs har definierat en egen signalhanterare, genom att märka att en signalhanterare redan var inställd och anropa den. Om det här inte fungerar för dig finns det en
removeHandler()
-dekorator som kan användas för att markera tester som bör ha kontroll-C-hanteringen inaktiverad.-f
eller--failfast
gör att testkörningen stoppas omedelbart när ett test misslyckas istället för att fortsätta att köra ytterligare tester. (Föreslaget av Cliff Dyer och implementerat av Michael Foord; bpo-8074.)
Förloppsmeddelandena visar nu ”x” för förväntade misslyckanden och ”u” för oväntade framgångar när de körs i verbose-läge. (Bidrag från Benjamin Peterson.)
Testfall kan ge upphov till SkipTest
-undantaget för att hoppa över ett test (bpo-1034053).
Felmeddelandena för assertEqual()
, assertTrue()
och assertFalse()
ger nu mer information. Om du sätter attributet longMessage
i dina TestCase
-klasser till true, kommer både standardfelmeddelandet och eventuella ytterligare meddelanden som du anger att skrivas ut för misslyckanden. (Tillagd av Michael Foord; bpo-5663.)
Metoden assertRaises()
returnerar nu en kontexthanterare när den anropas utan att tillhandahålla ett anropbart objekt att köra. Du kan till exempel skriva så här:
med self.assertRaises(KeyError):
{}['foo']
(Implementerad av Antoine Pitrou; bpo-4444.)
Fixturer för uppsättning och nedtagning på modul- och klassnivå stöds nu. Moduler kan innehålla funktionerna setUpModule()
och tearDownModule()
. Klasser kan ha metoderna setUpClass()
och tearDownClass()
som måste definieras som klassmetoder (med @classmethod
eller motsvarande). Dessa funktioner och metoder anropas när testlöparen växlar till ett testfall i en annan modul eller klass.
Metoderna addCleanup()
och doCleanups()
har lagts till. med addCleanup()
kan du lägga till rensningsfunktioner som anropas villkorslöst (efter setUp()
om setUp()
misslyckas, annars efter tearDown()
). Detta möjliggör mycket enklare resursallokering och -deallokering under tester (bpo-5679).
Ett antal nya metoder har lagts till som ger mer specialiserade tester. Många av dessa metoder skrevs av Google-ingenjörer för användning i deras testsviter; Gregory P. Smith, Michael Foord och GvR arbetade med att slå samman dem i Pythons version av unittest
.
assertIsNone()
ochassertIsNotNone()
tar ett uttryck och verifierar att resultatet är eller inte ärNone
.assertIs()
ochassertIsNot()
tar två värden och kontrollerar om de två värdena utvärderas till samma objekt eller inte. (Tillagd av Michael Foord; bpo-2578.)assertIsInstance()
ochassertNotIsInstance()
kontrollerar om det resulterande objektet är en instans av en viss klass, eller av en av flera klasser. (Tillagd av Georg Brandl; bpo-7031.)assertGreater()
,assertGreaterEqual()
,assertLess()
ochassertLessEqual()
jämför två storheter.assertMultiLineEqual()
jämför två strängar och om de inte är lika visas en användbar jämförelse som belyser skillnaderna mellan de två strängarna. Denna jämförelse används nu som standard när Unicode-strängar jämförs medassertEqual()
.assertRegexpMatches()
ochassertNotRegexpMatches()
kontrollerar om det första argumentet är en sträng som matchar eller inte matchar det reguljära uttryck som anges som det andra argumentet (bpo-8038).assertRaisesRegexp()
kontrollerar om ett visst undantag har uppstått, och kontrollerar sedan också att strängrepresentationen av undantaget matchar det angivna reguljära uttrycket.assertIn()
ochassertNotIn()
testar om first är eller inte är i second.assertItemsEqual()
testar om två angivna sekvenser innehåller samma element.assertSetEqual()
jämför om två uppsättningar är lika, och rapporterar endast skillnaderna mellan uppsättningarna i händelse av fel.På samma sätt jämför
assertListEqual()
ochassertTupleEqual()
de angivna typerna och förklarar eventuella skillnader utan att nödvändigtvis skriva ut deras fullständiga värden; dessa metoder används nu som standard när listor och tuplar jämförs medassertEqual()
. Mer allmänt jämförassertSequenceEqual()
två sekvenser och kan eventuellt kontrollera om båda sekvenserna är av en viss typ.assertDictEqual()
jämför två ordböcker och rapporterar skillnaderna; den används nu som standard när du jämför två ordböcker medassertEqual()
.assertDictContainsSubset()
kontrollerar om alla nyckel/värde-par i första finns i andra.assertAlmostEqual()
ochassertNotAlmostEqual()
testar om first och second är ungefär lika stora. Denna metod kan antingen avrunda skillnaden till ett valfritt angivet antal platser (standard är 7) och jämföra den med noll, eller kräva att skillnaden är mindre än ett angivet delta-värde.loadTestsFromName()
tar korrekt hänsyn till attributetsuiteClass
iTestLoader
. (Åtgärdat av Mark Roddy; bpo-6866.)En ny hook låter dig utöka metoden
assertEqual()
för att hantera nya datatyper. MetodenaddTypeEqualityFunc()
tar ett typobjekt och en funktion. Funktionen kommer att användas när båda objekten som jämförs är av den angivna typen. Denna funktion bör jämföra de två objekten och ge upphov till ett undantag om de inte matchar varandra; det är en bra idé att funktionen ger ytterligare information om varför de två objekten inte matchar varandra, ungefär som de nya metoderna för sekvensjämförelse gör.
unittest.main()
tar nu ett valfritt exit
argument. Om false, anropar main()
inte sys.exit()
, vilket gör att main()
kan användas från den interaktiva tolken. (Bidrag från J. Pablo Fernández; bpo-3379.)
TestResult
har nya startTestRun()
och stopTestRun()
metoder som anropas omedelbart före och efter en testkörning. (Bidrag från Robert Collins; bpo-5728.)
Med alla dessa ändringar började unittest.py
bli besvärande stor, så modulen gjordes om till ett paket och koden delades upp i flera filer (av Benjamin Peterson). Detta påverkar inte hur modulen importeras eller används.
Se även
- https://web.archive.org/web/20210619163128/http://www.voidspace.org.uk/python/articles/unittest2.shtml
Beskriver de nya funktionerna, hur man använder dem och motiven för olika designbeslut. (Av Michael Foord.)
Uppdaterad modul: ElementTree 1.3¶
Den version av ElementTree-biblioteket som ingår i Python har uppdaterats till version 1.3. Några av de nya funktionerna är:
De olika parsingfunktionerna tar nu ett parser nyckelordsargument som ger en
XMLParser
-instans som ska användas. Detta gör det möjligt att åsidosätta filens interna kodning:p = ET.XMLParser(kodning='utf-8') t = ET.XML("""<root/>""", parser=p)
Fel vid XML-parsning ger nu upphov till ett
ParseError
-undantag, vars instanser har ettposition
-attribut som innehåller en (rad, kolumn)-tupel som anger var problemet finns.ElementTrees kod för att konvertera träd till en sträng har omarbetats avsevärt, vilket gör den ungefär dubbelt så snabb i många fall. Metoderna
ElementTree.write()
ochElement.write()
har nu en method-parameter som kan vara ”xml” (standard), ”html” eller ”text”. HTML-läget skriver ut tomma element som<empty></empty>
istället för<empty/>
, och textläget hoppar över element och skriver bara ut textstyckena. Om du sätter attributettag
för ett element tillNone
men låter dess barn vara kvar, kommer elementet att utelämnas när trädet skrivs ut, så att du inte behöver göra mer omfattande omarrangemang för att ta bort ett enda element.Hanteringen av namnrymder har också förbättrats. Alla
xmlns:<whatever>
-deklarationer visas nu i rotelementet och inte utspridda i den resulterande XML-filen. Du kan ange standardnamnrymden för ett träd genom att ange attributetdefault_namespace
och du kan registrera nya prefix medregister_namespace()
. I XML-läge kan du använda true/false-parametern xml_declaration för att undertrycka XML-deklarationen.Ny
Element
metod:extend()
lägger till objekten från en sekvens till elementets barn. Elementen själva beter sig som sekvenser, så det är lätt att flytta barn från ett element till ett annat:from xml.etree import ElementTree as ET t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") new = ET.XML('<root/>') new.extend(t) # Utmatning <root><item>1.</item>..</root> print ET.tostring(ny)
Ny
Element
-metod:iter()
ger elementets barn som en generator. Det är också möjligt att skrivafor child in elem:
för att loopa över ett elements barn. Den befintliga metodengetiterator()
är nu avförd, liksomgetchildren()
som konstruerar och returnerar en lista med barn.Ny
Element
metod:itertext()
ger alla textstycken som är ättlingar till elementet. Till exempel:t = ET.XML(""")<list> <item>1</item> <item>2</item> <item>3</item> </list>""") # Utgångar ['\n ', '1', ' ', '2', ' ', '3', '\n'] print list(t.itertext())
Föråldrad: Om ett element användes som en booleansk formel (t.ex.
if elem:
) skulle resultatet bli sant om elementet hade några barn, eller falskt om det inte hade några barn. Detta beteende är förvirrande –None
är falskt, men det är ett barnlöst element också? – så det kommer nu att utlösa enFutureWarning
. I din kod bör du vara explicit: skrivlen(elem) != 0
om du är intresserad av antalet barn, ellerelem är inte None
.
Fredrik Lundh utvecklar ElementTree och har tagit fram version 1.3; du kan läsa hans artikel som beskriver 1.3 på https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm. Florent Xicluna uppdaterade den version som ingår i Python, efter diskussioner på python-dev och i bpo-6472)
Ändringar i Build och C API¶
Ändringar i Pythons byggprocess och i C API inkluderar:
Den senaste versionen av GNU Debugger, GDB 7, kan skriptas med hjälp av Python. När du börjar felsöka ett körbart program P kommer GDB att leta efter en fil med namnet
P-gdb.py
och automatiskt läsa den. Dave Malcolm bidrog med enpython-gdb.py
som lägger till ett antal kommandon som är användbara vid debuggning av Python självt. Till exempel gårpy-up
ochpy-down
upp eller ner en Python-stackram, vilket vanligtvis motsvarar flera C-stackramar.py-print
skriver ut värdet på en Python-variabel ochpy-bt
skriver ut Pythons stackspårning. (Tillagd som ett resultat av bpo-8032.)Om du använder filen
.gdbinit
som medföljer Python, fungerar nu makrot ”pyo” i 2.7-versionen korrekt när tråden som felsöks inte har GIL; makrot hämtar nu GIL innan det skrivs ut. (Bidrag från Victor Stinner; bpo-3632.)Py_AddPendingCall()
är nu trådsäker, vilket gör att alla arbetstrådar kan skicka meddelanden till Pythons huvudtråd. Detta är särskilt användbart för asynkrona IO-operationer. (Bidrag från Kristján Valur Jónsson; bpo-4293.)Ny funktion:
PyCode_NewEmpty()
skapar ett tomt kodobjekt; endast filnamnet, funktionsnamnet och första radnumret krävs. Detta är användbart för tilläggsmoduler som försöker konstruera en mer användbar traceback-stack. Tidigare behövde sådana tillägg anropaPyCode_New()
, som hade många fler argument. (Tillagd av Jeffrey Yasskin.)Ny funktion:
PyErr_NewExceptionWithDoc()
skapar en ny undantagsklass, precis som den befintligaPyErr_NewException()
gör, men tar ett extrachar *
argument som innehåller dokumentsträngen för den nya undantagsklassen. (Tillagd av ’lekma’ på Pythons buggtracker; bpo-7033.)Ny funktion:
PyFrame_GetLineNumber()
tar ett ramobjekt och returnerar det radnummer som ramen för närvarande exekverar. Tidigare skulle koden behöva hämta indexet för den bytecode-instruktion som för närvarande körs och sedan leta upp radnumret som motsvarar den adressen. (Tillagd av Jeffrey Yasskin.)Nya funktioner:
PyLong_AsLongAndOverflow()
ochPyLong_AsLongLongAndOverflow()
approximerar ett Python long integer som ett C long eller long long. Om talet är för stort för att passa in i utdatatypen sätts en overflow-flagga och returneras till den som anropar. (Bidrag från Case Van Horsen; bpo-7528 och bpo-7767.)Ny funktion: På grund av omskrivningen av sträng-till-float-konvertering har en ny
PyOS_string_to_double()
-funktion lagts till. De gamla funktionernaPyOS_ascii_strtod()
ochPyOS_ascii_atof()
är nu föråldrade.Ny funktion:
PySys_SetArgvEx()
sätter värdet påsys.argv
och kan eventuellt uppdaterasys.path
till att inkludera katalogen som innehåller skriptet som hetersys.argv[0]
beroende på värdet av en updatepath-parameter.Denna funktion lades till för att täppa till ett säkerhetshål för program som bäddar in Python. Den gamla funktionen,
PySys_SetArgv()
, uppdaterade alltidsys.path
, och ibland lade den till den aktuella katalogen. Detta innebar att om du körde ett program som bäddade in Python i en katalog som kontrollerades av någon annan, kunde angripare lägga in en trojansk modul i katalogen (till exempel en fil med namnetos.py
) som ditt program sedan importerade och körde.Om du underhåller ett C/C++-program som innehåller Python, kontrollera om du anropar
PySys_SetArgv()
och överväg noga om programmet ska användaPySys_SetArgvEx()
med updatepath satt till false.Säkerhetsproblem rapporterat som CVE 2008-5983; diskuterat i bpo-5753, och åtgärdat av Antoine Pitrou.
Nya makron: Pythons rubrikfiler definierar nu följande makron:
Py_ISALNUM
,Py_ISALPHA
,Py_ISDIGIT
,Py_ISLOWER
,Py_ISSPACE
,Py_ISUPPER
,Py_ISXDIGIT
,Py_TOLOWER
, ochPy_TOUPPER
. Alla dessa funktioner är analoga med C-standardmakron för att klassificera tecken, men ignorerar den aktuella locale-inställningen, eftersom Python på flera ställen behöver analysera tecken på ett locale-oberoende sätt. (Tillagd av Eric Smith; bpo-5793.)Borttagen funktion:
PyEval_CallObject()
är nu endast tillgänglig som makro. En funktionsversion behölls för att bevara ABI-länkkompatibilitet, men det var 1997; den kan säkert ha tagits bort nu. (Borttagen av Antoine Pitrou; bpo-8276.)Nya formatkoder: Funktionerna
PyString_FromFormat()
,PyString_FromFormatV()
ochPyErr_Format()
accepterar nu formatkoderna%lld
och%llu
för visning av C:s typer long long. (Bidrag från Mark Dickinson; bpo-7228.)Den komplicerade interaktionen mellan trådar och processforking har ändrats. Tidigare kunde barnprocessen som skapades av
os.fork()
misslyckas eftersom barnet skapades med bara en enda tråd igång, den tråd som utfördeos.fork()
. Om andra trådar höll ett lås, till exempel Pythons importlås, när förgreningen utfördes, skulle låset fortfarande markeras som ”hållet” i den nya processen. Men i barnprocessen skulle ingenting någonsin släppa låset, eftersom de andra trådarna inte replikerades, och barnprocessen skulle inte längre kunna utföra import.Python 2.7 förvärvar importlåset innan en
os.fork()
utförs, och kommer också att rensa upp alla lås som skapats medthreading
-modulen. C-tilläggsmoduler som har interna lås, eller som själva anroparfork()
, kommer inte att dra nytta av denna rensning.(Åtgärdat av Thomas Wouters; bpo-1590864.)
Funktionen
Py_Finalize()
anropar nu den interna funktionenthreading._shutdown()
; detta förhindrar att vissa undantag uppstår när en tolk stängs ner. (Patch av Adam Olsen; bpo-1722344.)När du använder
PyMemberDef
-strukturen för att definiera attribut för en typ, kommer Python inte längre att låta dig försöka ta bort eller ställa in ettT_STRING_INPLACE
-attribut.Globala symboler som definieras av modulen
ctypes
prefixeras nu medPy
, eller med_ctypes
. (Implementerat av Thomas Heller; bpo-3102.)Nytt konfigureringsalternativ: Med
--with-system-expat
kan modulenpyexpat
byggas så att den använder systembiblioteket Expat. (Bidrag från Arfrever Frehtes Taifersar Arahesis; bpo-7609.)Nytt konfigureringsalternativ: alternativet
--with-valgrind
inaktiverar nu allokeringsverktyget pymalloc, som är svårt för Valgrinds minnesfelsdetektor att analysera korrekt. Valgrind kommer därför att bli bättre på att upptäcka minnesläckor och överskridanden. (Bidrag från James Henstridge; bpo-2422.)Nytt konfigureringsalternativ: Du kan nu ange en tom sträng till
--with-dbmliborder=
för att inaktivera alla olika DBM-moduler. (Tillagd av Arfrever Frehtes Taifersar Arahesis; bpo-6491.)Skriptet configure kontrollerar nu för avrundningsbuggar för flyttal på vissa 32-bitars Intel-chip och definierar en
X87_DOUBLE_ROUNDING
preprocessordefinition. Ingen kod använder för närvarande denna definition, men den är tillgänglig om någon vill använda den. (Tillagd av Mark Dickinson; bpo-2937.)configure ställer nu också in en
LDCXXSHARED
Makefile-variabel för att stödja C++-länkning. (Bidrag från Arfrever Frehtes Taifersar Arahesis; bpo-1222585.)Byggprocessen skapar nu de nödvändiga filerna för stöd för pkg-config. (Bidrag från Clinton Roy; bpo-3585.)
Byggprocessen stöder nu Subversion 1.7. (Bidrag från Arfrever Frehtes Taifersar Arahesis; bpo-6094.)
Kapslar¶
Python 3.1 lägger till en ny C-datatyp, PyCapsule
, för att tillhandahålla ett C API till en tilläggsmodul. En kapsel är i huvudsak innehavaren av en C void *
pekare, och görs tillgänglig som ett modulattribut; till exempel exponeras socket
-modulens API som socket.CAPI
, och unicodedata
exponerar ucnhash_CAPI
. Andra tillägg kan importera modulen, få tillgång till dess ordbok för att hämta kapselobjektet och sedan hämta pekaren void *
, som vanligtvis pekar på en array av pekare till modulens olika API-funktioner.
Det finns en befintlig datatyp som redan används för detta, PyCObject
, men den ger ingen typsäkerhet. Ond kod skriven i ren Python skulle kunna orsaka ett segmenteringsfel genom att ta en PyCObject
från modul A och på något sätt ersätta den med PyCObject
i modul B. Kapslar känner till sitt eget namn, och för att få pekaren krävs att namnet anges:
void *vtable;
if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
PyErr_SetString(PyExc_ValueError, "argumenttyp ogiltig");
returnera NULL;
}
vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");
Du kan vara säker på att vtable
pekar på det du förväntar dig. Om en annan kapsel skickades in, skulle PyCapsule_IsValid()
upptäcka det felaktiga namnet och returnera false. Se Tillhandahålla ett C API för en tilläggsmodul för mer information om hur du använder dessa objekt.
Python 2.7 använder nu kapslar internt för att tillhandahålla olika API:er för tilläggsmoduler, men PyCObject_AsVoidPtr()
modifierades för att hantera kapslar, vilket bevarar kompileringstidskompatibilitet med PyCObject
-gränssnittet. Användning av PyCObject_AsVoidPtr()
kommer att signalera en PendingDeprecationWarning
, som är tyst som standard.
Implementerad i Python 3.1 och bakåtporterad till 2.7 av Larry Hastings; diskuterad i bpo-5630.
Portspecifika ändringar: Fönster¶
Modulen
msvcrt
innehåller nu några konstanter från huvudfilencrtassem.h
:CRT_ASSEMBLY_VERSION
,VC_ASSEMBLY_PUBLICKEYTOKEN
, ochLIBRARIES_ASSEMBLY_NAME_PREFIX
. (Bidrag från David Cournapeau; bpo-4365.)Modulen
_winreg
för åtkomst till registret implementerar nu funktionernaCreateKeyEx()
ochDeleteKeyEx()
, utökade versioner av tidigare stödda funktioner som tar flera extra argument. FunktionernaDisableReflectionKey()
,EnableReflectionKey()
ochQueryReflectionKey()
har också testats och dokumenterats. (Implementerat av Brian Curtin: bpo-7347.)Det nya API:et
_beginthreadex()
används för att starta trådar, och de inbyggda trådlokala lagringsfunktionerna används nu. (Bidrag från Kristján Valur Jónsson; bpo-3582.)Funktionen
os.kill()
fungerar nu i Windows. Signalvärdet kan vara konstanternaCTRL_C_EVENT
,CTRL_BREAK_EVENT
eller ett heltal. De två första konstanterna kommer att skicka Control-C och Control-Break tangenttryckningshändelser till underprocesser; alla andra värden kommer att användaTerminateProcess()
API. (Bidrag från Miki Tebeka; bpo-1220212.)Funktionen
os.listdir()
misslyckas nu korrekt för en tom sökväg. (Åtgärdat av Hirokazu Yamamoto; bpo-5913.)Modulen
mimetypes
kommer nu att läsa MIME-databasen från Windows-registret när den initieras (Patch by Gabriel Genellina; bpo-4969.)
Hamnspecifika ändringar: Mac OS X¶
Sökvägen
/Library/Python/2.7/site-packages
är nu tillagd tillsys.path
, för att dela med sig av tillagda paket mellan systeminstallationen och en användarinstallerad kopia av samma version. (Ändrad av Ronald Oussoren; bpo-4865.)Ändrad i version 2.7.13: Från och med 2.7.13 har denna ändring tagits bort.
/Library/Python/2.7/site-packages
, site-packages-katalogen som används av det Apple-levererade systemet Python 2.7 läggs inte längre tillsys.path
för användarinstallerade Pythons, till exempel från python.org-installatörerna. Från och med macOS 10.12 ändrade Apple hur systemkatalogen site-packages konfigureras, vilket kan leda till att installationen av pip-komponenter, som setuptools, misslyckas. Paket som installeras för systemets Python kommer inte längre att delas med Pythons som installerats av användare. (bpo-28440)
Portspecifika ändringar: FreeBSD¶
FreeBSD 7.1:s
SO_SETFIB
-konstant, som används medsocket()
-metodernagetsockopt()
/setsockopt()
för att välja en alternativ routningstabell, är nu tillgänglig i modulensocket
. (Tillagd av Kyle VanderBeek; bpo-8235.)
Övriga ändringar och korrigeringar¶
Två benchmark-skript,
iobench
ochccbench
, har lagts till i katalogenTools
.iobench
mäter hastigheten på de inbyggda fil-I/O-objekt som returneras avopen()
när olika operationer utförs, ochccbench
är ett concurrency-benchmark som försöker mäta beräkningsgenomströmning, latens för trådbyte och bandbredd för IO-bearbetning när flera uppgifter utförs med ett varierande antal trådar.Skriptet
Tools/i18n/msgfmt.py
förstår nu pluralformer i.po
-filer. (Åtgärdat av Martin von Löwis; bpo-5464.)Vid import av en modul från en
.pyc
- eller.pyo
-fil med en befintlig.py
-motsvarighet skrivs attributenco_filename
för de resulterande kodobjekten över när det ursprungliga filnamnet är föråldrat. Detta kan hända om filen har bytt namn, flyttats eller nås via olika sökvägar. (Patch av Ziga Seilnacht och Jean-Paul Calderone; bpo-1180193.)Skriptet
regrtest.py
tar nu emot--randseed=
som tar emot ett heltal som kommer att användas som slumpmässigt frö för-r
som exekverar tester i slumpmässig ordning. Alternativet-r
rapporterar också det frö som användes (Tillagd av Collin Winter.)En annan switch i
regrtest.py
är-j
, som tar ett heltal som anger hur många tester som körs parallellt. Detta gör det möjligt att minska den totala körtiden på flerkärniga maskiner. Detta alternativ är kompatibelt med flera andra alternativ, inklusive-R
som är känt för att ge långa körtider. (Tillagd av Antoine Pitrou, bpo-6152.) Detta kan också användas med en ny-F
switch som kör utvalda tester i en loop tills de misslyckas. (Tillagd av Antoine Pitrou; bpo-7312.)När modulen
py_compile.py
körs som ett skript accepterar den nu'-'
som ett argument, vilket läser standardinmatningen för listan med filnamn som ska kompileras. (Bidrag från Piotr Ożarowski; bpo-8233.)
Portning till Python 2.7¶
I det här avsnittet listas tidigare beskrivna ändringar och andra buggfixar som kan kräva ändringar i din kod:
Funktionen
range()
behandlar sina argument på ett mer konsekvent sätt; den kommer nu att anropa__int__()
för argument som inte är float eller heltal. (Rättad av Alexander Belopolsky; bpo-1533.)Metoden string
format()
ändrade standardprecisionen för flyttal och komplexa tal från 6 decimaler till 12, vilket matchar precisionen som används avstr()
. (Ändrad av Eric Smith; bpo-5920.)På grund av en optimering för
with
-satsen måste specialmetoderna__enter__()
och__exit__()
tillhöra objektets typ och kan inte kopplas direkt till objektets instans. Detta påverkar klasser i ny stil (härledda frånobject
) och C-tilläggstyper. (bpo-6101.)På grund av en bugg i Python 2.6 var parametern exc_value till
__exit__()
-metoder ofta strängrepresentationen av undantaget, inte en instans. Detta åtgärdades i 2.7, så exc_value kommer att vara en instans som förväntat. (Åtgärdat av Florent Xicluna; bpo-7853.)När en begränsad uppsättning attribut ställdes in med hjälp av
__slots__
, skulle borttagning av ett icke-inställt attribut inte ge upphov tillAttributeError
som förväntat. Fixad av Benjamin Peterson; bpo-7604.)
I standardbiblioteket:
Operationer med
datetime
-instanser som resulterade i ett år som föll utanför det stödda intervallet gav inte alltid upphov tillOverflowError
. Sådana fel kontrolleras nu mer noggrant och kommer nu att ge upphov till undantaget. (Rapporterat av Mark Leander, patchad av Anand B. Pillai och Alexander Belopolsky; bpo-7150.)När man använder
Decimal
-instanser med en strängsformat()
-metod var standardjusteringen tidigare vänsterjustering. Detta har ändrats till högerjustering, vilket kan förändra utdata från dina program. (Ändrat av Mark Dickinson; bpo-6857.)Jämförelser som involverar ett signalerande NaN-värde (eller
NAN
) signalerar nuInvalidOperation
istället för att i tysthet returnera ett sant eller falskt värde beroende på jämförelseoperatorn. Tysta NaN-värden (ellerNaN
) är nu hashbara. (Rättad av Mark Dickinson; bpo-7279.)Biblioteket
xml.etree.ElementTree
escapar inte längre ampersand och vinkelparenteser vid utmatning av en XML-bearbetningsinstruktion (som ser ut som<?xml-stylesheet href="#style1"?>
) eller kommentar (som ser ut som<!-- comment -->
). (Patch av Neil Muller; bpo-2746.)Metoden
readline()
förStringIO
-objekt gör nu ingenting när en negativ längd begärs, som andra filliknande objekt gör. (bpo-7348).Modulen
syslog
kommer nu att använda värdet avsys.argv[0]
som identifierare istället för det tidigare standardvärdet'python'
. (Ändrad av Sean Reifschneider; bpo-8451.)Standardfelhanteringen i modulen
tarfile
har ändrats så att fatala fel inte längre undertrycks. Den förinställda felnivån var tidigare 0, vilket innebar att fel bara resulterade i att ett meddelande skrevs till debugloggen, men eftersom debugloggen inte är aktiverad som standard går dessa fel obemärkta förbi. Standardnivån för fel är nu 1, vilket innebär att ett undantag uppstår om ett fel inträffar. (Ändrad av Lars Gustäbel; bpo-7357.)urlparse
-modulensurlsplit()
hanterar nu okända URL-scheman på ett sätt som överensstämmer med RFC 3986: om URL:en är av formen"<something>://..."
, behandlas texten före://
som schemat, även om det är ett påhittat schema som modulen inte känner till. Denna förändring kan bryta kod som fungerade runt det gamla beteendet. Till exempel kommer Python 2.6.4 eller 2.5 att returnera följande:>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
Python 2.7 (och Python 2.6.5) kommer att returnera:
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
(Python 2.7 ger faktiskt något annorlunda resultat, eftersom den returnerar en namngiven tupel i stället för en standardtupel)
För C-tillägg:
C-tillägg som använder heltalsformatkoder med
PyArg_Parse*
-familjen av funktioner kommer nu att ge upphov till ettTypeError
-undantag istället för att utlösa enDeprecationWarning
(bpo-5080).Använd den nya funktionen
PyOS_string_to_double()
istället för de gamla funktionernaPyOS_ascii_strtod()
ochPyOS_ascii_atof()
, som nu är föråldrade.
För applikationer som bygger in Python:
Funktionen
PySys_SetArgvEx()
har lagts till, så att program kan täppa till ett säkerhetshål när den befintliga funktionenPySys_SetArgv()
används. Kontrollera om du anroparPySys_SetArgv()
och överväg noga om programmet bör användaPySys_SetArgvEx()
med updatepath satt till false.
Nya funktioner i underhållsversionerna av Python 2.7¶
Nya funktioner kan läggas till i Python 2.7 underhållsversioner när situationen verkligen kräver det. Alla sådana tillägg måste gå igenom Python Enhancement Proposal-processen och göra ett övertygande fall för varför de inte kan hanteras på ett adekvat sätt genom att antingen lägga till den nya funktionen enbart till Python 3, eller annars genom att publicera den på Python Package Index.
Utöver de specifika förslag som listas nedan finns det ett generellt undantag som tillåter att nya -3
-varningar läggs till i alla underhållsversioner av Python 2.7.
Två nya miljövariabler för felsökningsläget¶
I felsökningsläge skrivs inte [xxx refs]
-statistiken som standard, miljövariabeln PYTHONSHOWREFCOUNT
måste nu också anges. (Bidrag från Victor Stinner; bpo-31733.)
När Python kompileras med COUNT_ALLOC
definierat, dumpas inte längre allokeringsräkningar som standard: miljövariabeln PYTHONSHOWALLOCCOUNT
måste nu också ställas in. Dessutom dumpas allokeringsräkningar nu i stderr, snarare än i stdout. (Bidrag från Victor Stinner; bpo-31692.)
Tillagd i version 2.7.15.
PEP 434: Undantag för IDLE Enhancement för alla filialer¶
PEP 434 beskriver ett generellt undantag för ändringar som görs i utvecklingsmiljön IDLE som levereras tillsammans med Python. Detta undantag gör det möjligt för IDLE-utvecklarna att tillhandahålla en mer konsekvent användarupplevelse i alla versioner av Python 2 och 3 som stöds.
För detaljer om eventuella IDLE-ändringar, se NEWS-filen för den specifika utgåvan.
PEP 466: Förbättringar av nätverkssäkerhet för Python 2.7¶
PEP 466 beskriver ett antal förslag till förbättringar av nätverkssäkerheten som har godkänts för att ingå i Python 2.7 underhållsversioner, med den första av dessa ändringar som visas i Python 2.7.7 release.
PEP 466 relaterade funktioner tillagda i Python 2.7.7:
hmac.compare_digest()
backporterades från Python 3 för att göra en jämförelseoperation som är resistent mot tidsattacker tillgänglig för Python 2-applikationer. (Bidrag från Alex Gaynor; bpo-21306.)OpenSSL 1.0.1g uppgraderades i de officiella Windows-installationsprogrammen som publicerades på python.org. (Bidrag från Zachary Ware; bpo-21462.)
PEP 466 relaterade funktioner tillagda i Python 2.7.8:
hashlib.pbkdf2_hmac()
backporterades från Python 3 för att göra en hash-algoritm lämplig för säker lösenordslagring allmänt tillgänglig för Python 2-applikationer. (Bidrag från Alex Gaynor; bpo-21304.)OpenSSL 1.0.1h uppgraderades för de officiella Windows-installatörerna som publicerades på python.org. (Bidrag från Zachary Ware i bpo-21671 för CVE 2014-0224.)
PEP 466 relaterade funktioner tillagda i Python 2.7.9:
Det mesta av Python 3.4:s
ssl
-modul har bakåtporterats. Detta innebär attssl
nu stöder Server Name Indication, TLS1.x-inställningar, åtkomst till plattformens certifikatarkiv, klassenSSLContext
och andra funktioner. (Bidrag från Alex Gaynor och David Reid; bpo-21308.)Se anteckningarna ”Version added: 2.7.9” i modulens dokumentation för mer information.
os.urandom()
ändrades till att cacha en filbeskrivare till/dev/urandom
istället för att öppna/dev/urandom
igen vid varje anrop. (Bidrag från Alex Gaynor; bpo-21305.)hashlib.algorithms_guaranteed
ochhashlib.algorithms_available
backporterades från Python 3 för att göra det enklare för Python 2-applikationer att välja den starkaste tillgängliga hashalgoritmen. (Bidrag från Alex Gaynor i bpo-21307)
PEP 477: Backportera ensurepip (PEP 453) till Python 2.7¶
PEP 477 godkänner införandet av modulen PEP 453 ensurepip och den förbättrade dokumentationen som möjliggjordes av den i underhållsversionerna av Python 2.7, som först visas i Python 2.7.9.
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. Den version av pip
som ingår i Python 2.7.9 är pip
1.5.6, och framtida underhållsutgåvor av 2.7.x kommer att uppdatera den medföljande versionen till den senaste versionen av pip
som är tillgänglig vid tidpunkten för skapandet av utgivningskandidaten.
Som standard kommer kommandona pip
, pipX
och pipX.Y
att installeras på alla plattformar (där X.Y står för versionen av Python-installationen), tillsammans med Python-paketet pip
och dess beroenden.
För CPython source builds on POSIX systems, bootstrappar inte 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).
Förändringar i dokumentationen¶
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 476: Aktivera certifikatverifiering som standard för stdlib http-klienter¶
PEP 476 uppdaterade httplib
och moduler som använder det, såsom urllib2
och xmlrpclib
, för att nu verifiera att servern presenterar ett certifikat som är signerat av en certifikatutfärdare i plattformens trust store och vars värdnamn matchar värdnamnet som begärs som standard, vilket avsevärt förbättrar säkerheten för många applikationer. Den här ändringen gjordes i Python 2.7.9.
För applikationer som kräver det gamla tidigare beteendet kan de skicka en alternativ context:
import urllib2
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")
urllib2.urlopen("https://invalid-cert", context=context)
PEP 493: Verktyg för migrering av HTTPS-verifiering för Python 2.7¶
PEP 493 tillhandahåller ytterligare migreringsverktyg för att stödja en mer stegvis uppgradering av infrastrukturen för miljöer som innehåller applikationer och tjänster som förlitar sig på den historiskt tillåtande behandlingen av servercertifikat vid upprättandet av HTTPS-anslutningar för klienter. Dessa tillägg gjordes i Python 2.7.12-versionen.
Dessa verktyg är avsedda att användas i fall där berörda applikationer och tjänster inte kan modifieras för att uttryckligen skicka en mer tillåtande SSL-kontext när anslutningen upprättas.
För applikationer och tjänster som inte kan ändras alls kan den nya miljövariabeln PYTHONHTTPSVERIFY
sättas till 0
för att återställa en hel Python-process tillbaka till det tillåtna standardbeteendet i Python 2.7.8 och tidigare.
I de fall där koden för att upprätta anslutningen inte kan ändras, men den övergripande applikationen kan ändras, kan den nya funktionen ssl._https_verify_certificates()
användas för att justera standardbeteendet under körning.
Nytt byggmål för make regen-all
¶
För att förenkla korskompilering och säkerställa att CPython kan kompileras på ett tillförlitligt sätt utan att det krävs att en befintlig version av Python redan finns tillgänglig, försöker det autotools-baserade byggsystemet inte längre att implicit kompilera om genererade filer baserat på filändringstider.
Istället har ett nytt make regen-all
-kommando lagts till för att tvinga fram regenerering av dessa filer när så önskas (t.ex. efter att en första version av Python redan har byggts baserat på de förgenererade versionerna).
Mer selektiva regenereringsmål definieras också - se Makefile.pre.in för detaljer.
(Bidrag från Victor Stinner i bpo-23404.)
Tillagd i version 2.7.14.
Borttagning av byggmålet make touch
¶
Byggmålet make touch
som tidigare användes för att begära implicit regenerering av genererade filer genom att uppdatera deras modifieringstider har tagits bort.
Det har ersatts av det nya målet make regen-all
.
(Bidrag från Victor Stinner i bpo-23404.)
Ändrad i version 2.7.14.
Tack till¶
Författaren vill tacka följande personer för förslag, korrigeringar och hjälp med olika utkast till denna artikel: Nick Coghlan, Philip Jenvey, Ryan Lovett, R. David Murray, Hugh Secker-Walker.