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 float x är kortare i många fall: den är nu baserad på den kortaste decimalsträngen som garanterat avrundar tillbaka till x. Precis som i tidigare versioner av Python är det garanterat att float(repr(x)) återställer x.

  • 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() och operator.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ör collections.namedtuple() returnerar nu en ordnad ordbok där värdena visas i samma ordning som de underliggande tuple-indexen.

  • json-modulens JSONDecoder-klassens konstruktor utökades med en object_pairs_hook-parameter för att tillåta att OrderedDict-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  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, antingen socket.SOCK_DGRAM för UDP eller socket.SOCK_STREAM för TCP. Standardprotokollet är fortfarande UDP.

  • Logger-instanser har fått en getChild()-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öra log = getLogger('app'), är anropet av log.getChild('network.listen') likvärdigt med getLogger('app.network.listen').

  • Klassen LoggerAdapter har fått en isEnabledFor()-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().

Se även

PEP 3106 - Omarbetning av dict.keys(), .values() och .items()

PEP skriven av Guido van Rossum. Baktransporterad till 2.7 av Alexandre Vassalotti; bpo-1967.

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

Se även

PEP 3137 - Oföränderliga byte och föränderlig buffert

PEP skriven av Guido van Rossum. Implementerad av Travis Oliphant, Antoine Pitrou och andra. Backporterad till 2.7 av Antoine Pitrou; bpo-2396.

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änd set() 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 ny with-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örerna float och complex; numerisk formatering; serialisering och deserialisering av flyttal och komplexa tal med hjälp av modulerna marshal, pickle och json; parsning av flyttals- och imaginärlitteraler i Python-kod; och Decimal-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 vara short om den nya koden används och legacy 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 av str.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 till str.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 resulterande 1,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 en PendingDeprecationWarning om den får en formatsträng, eftersom metoden __format__() för object 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() och long() har fått en metod bit_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 vissa import-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 typen bytearray accepterar nu None 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 till AttributeError 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 attributet filename på undantaget IOError 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 basen 2**30, basen bestäms vid byggtiden. Tidigare lagrades de alltid i bas 2**15. Att använda bas 2**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 bas 2**30 på 64-bitars maskiner och bas 2**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() och rsplit() för strängliknande typer (strängar, Unicode-strängar och bytearray-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 och cPickle 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ökning Bdb har fått en funktion för att hoppa över moduler. Konstruktören tar nu en iterabel som innehåller glob-stil mönster som django.*; 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 med memoryview-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:s BZ2File stöder nu kontexthanteringsprotokollet, så att du kan skriva med bz2.BZ2File(...) som f:. (Bidrag från Hagen Fürstenau; bpo-3860.)

  • Ny klass: Klassen Counter i modulen collections är användbar för att räkna data. Instanser av Counter beter sig mestadels som ordböcker men returnerar noll om nycklar saknas istället för att ge upphov till KeyError:

    >>> 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 annan Counter 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 en count()-metod som returnerar antalet ingående element som är lika med det medföljande argumentet x, och en reverse()-metod som reverserar elementen i deque på plats. deque exponerar också sin maximala längd som det skrivskyddade attributet maxlen. (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 nu NotImplemented om en mappning jämförs med en annan typ som inte är en Mapping. (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 enda with-svar, har utgått eftersom with-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:s deepcopy()-funktion kopierar nu bundna instansmetoder korrekt. (Implementerat av Robert Collins; bpo-1515.)

  • Modulen ctypes konverterar nu alltid None till en C NULL-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-modulens timedelta-klass har fått en total_seconds()-metod som returnerar antalet sekunder i varaktigheten. (Bidrag från Brian Quinlan; bpo-5788.)

  • Ny metod: Klassen Decimal har fått en klassmetod from_float() som utför en exakt konvertering av ett flyttal till en Decimal. 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) returns Decimal('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 kombinera Decimal och flyttal i andra operationer som t.ex. addition, eftersom du uttryckligen bör välja hur du konverterar mellan flyttal och Decimal. (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 som Decimal instanser; de enda undantagen är metoderna canonical() och is_canonical(). (Patch av Juan José Conti; bpo-7633.)

    När man använder Decimal-instanser med en strängs format()-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 nu InvalidOperation istället för att i tysthet returnera ett sant eller falskt värde beroende på jämförelseoperatorn. Tysta NaN-värden (eller NaN) ä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 filen MANIFEST, eftersom även om filerna MANIFEST.in eller setup.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-modulens IGNORE_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 klass Message accepterar nu en Unicode-värderad nyttolast och konverterar automatiskt nyttolasten till den kodning som anges av output_charset. (Tillagd av R. David Murray; bpo-1368247.)

  • Klassen Fraction accepterar nu en enda float- eller Decimal-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 ett TypeError. Detta åtgärdar ett förbiseende, vilket gör att Fraction matchar de andra numeriska typerna.

  • Ny klass: FTP_TLS i modulen ftplib 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 modulen functools 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 som sorted(), min() och max(), 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-modulens is_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 skriva with gzip.GzipFile(...) as f: (bidrag från Hagen Fürstenau; bpo-3860), och den implementerar nu io.BufferedIOBase ABC, så att du kan linda in den med io.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 attribut algorithms som innehåller en tupel som namnger de algoritmer som stöds. I Python 2.7 innehåller hashlib.algorithms ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'). (Bidrag från Carl Chenet; bpo-7418.)

  • Standardklassen HTTPResponse som används av modulen httplib 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 och HTTPSConnection 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 att ihooks är en äldre modul för att anpassa import, ersatt av modulen imputil 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-modulens getcallargs() 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 attribut errors 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 ett OSError när en ogiltig filbeskrivare skickas. (Implementerat av Benjamin Peterson; bpo-4991.) Metoden truncate() 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ån combinations() 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 eller Decimal-instanser. (Implementerat av Raymond Hettinger; bpo-5032.)

    itertools.combinations() och itertools.product() gav tidigare upphov till ValueError 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 har json.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 modulen mailbox 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ått erf() och erfc() för felfunktionen och den komplementära felfunktionen, expm1() som beräknar e**x - 1 med mer precision än att använda exp() och subtrahera 1, gamma() för Gamma-funktionen och lgamma() för den naturliga logaritmen av Gamma-funktionen. (Bidrag från Mark Dickinson och nirinA raseliarison; bpo-3366.)

  • multiprocessing-modulens Manager*-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 att Pool 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() och getresuid(), som returnerar verkliga, effektiva och sparade GID och UID; setresgid() och setresuid(), 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är fork() anropas från en tråd. (Åtgärdat av Zsolt Cserna; bpo-7242.)

  • I modulen os.path bevarar nu funktionerna normpath() och abspath() 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öra help('<<') eller help('@'), till exempel. (Bidrag från David Laban; bpo-4739.)

  • re-modulens split(), sub() och subn() 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 modulen runpy 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 av sys.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 i sys.path. Detta gör mer av maskineriet i runpy 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 tar make_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 funktioner copyfile() och copytree() ger nu upphov till ett SpecialFileError-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 och getuserbase() returnerar värdet på miljövariabeln USER_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 modulen sitecustomize importeras, och kommer inte längre att fånga och svälja undantaget KeyboardInterrupt. (Å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() och recvfrom_into() kommer nu att skriva till objekt som stöder buffert-API:t, mest användbart är objekten bytearray och memoryview. (Implementerat av Antoine Pitrou; bpo-8104.)

  • Klassen TCPServer i modulen SocketServer har nu stöd för timeouts för socket och inaktivering av Nagle-algoritmen. Klassattributet disable_nagle_algorithm är som standard False; 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. Klassattributet timeout kan innehålla en timeout i sekunder som kommer att tillämpas på request socket; om ingen request tas emot inom den tiden kommer handle_timeout() att anropas och handle_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 metoden enable_load_extension(True) för att aktivera tillägg, och anropa sedan load_extension() för att ladda ett visst delat bibliotek. (Uppdaterad av Gerhard Häring.)

  • ssl-modulens SSLSocket-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:s SSL_MODE_AUTO_RETRY, vilket förhindrar att en felkod returneras från recv()-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) och ssl.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 av bBhHiIlLqQ); den ger nu alltid upphov till ett struct.error-undantag. (Ändrad av Mark Dickinson; bpo-1523.) Funktionen pack() 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-modulens check_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 ett CalledProcessError-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 en EINTR-signal. (Rapporterades av flera personer; slutlig patch av Gregory P. Smith i bpo-1068268.)

  • Ny funktion: is_declared_global() i modulen symtable 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 av sys.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 attributen major, minor, micro, releaselevel och serial. (Bidrag från Ross Light; bpo-4285.)

    sys.getwindowsversion() returnerar också en namngiven tupel, med attributen major, minor, build, platform, service_pack, service_pack_major, service_pack_minor, suite_mask och product_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 av TarInfo-objekt som läggs till i en tar-fil. När du anropar add() 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 returnerar None 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.) Klassen TarFile har nu också stöd för kontexthanteringsprotokollet. (Tillagd av Lars Gustäbel; bpo-7232.)

  • Metoden wait() i klassen threading.Event returnerar nu den interna flaggan vid avslut. Detta innebär att metoden vanligtvis returnerar true eftersom wait() ä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 datafilen Unihan.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-modulens urlsplit() 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 modulen weakref ä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 och SimpleXMLRPCServer, 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 attributet encode_threshold i SimpleXMLRPCRequestHandler, 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 skriva med 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 av read() och readline() 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ören ZipFile. (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 filen pyconfig.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() och assertIsNotNone() tar ett uttryck och verifierar att resultatet är eller inte är None.

  • assertIs() och assertIsNot() 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() och assertNotIsInstance() 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() och assertLessEqual() 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 med assertEqual().

  • assertRegexpMatches() och assertNotRegexpMatches() 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() och assertNotIn() 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() och assertTupleEqual() 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 med assertEqual(). Mer allmänt jämför assertSequenceEqual() 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 med assertEqual(). assertDictContainsSubset() kontrollerar om alla nyckel/värde-par i första finns i andra.

  • assertAlmostEqual() och assertNotAlmostEqual() 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 attributet suiteClass i TestLoader. (Åtgärdat av Mark Roddy; bpo-6866.)

  • En ny hook låter dig utöka metoden assertEqual() för att hantera nya datatyper. Metoden addTypeEqualityFunc() 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 ett position-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() och Element.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 attributet tag för ett element till None 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 attributet default_namespace och du kan registrera nya prefix med register_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 skriva for child in elem: för att loopa över ett elements barn. Den befintliga metoden getiterator() är nu avförd, liksom getchildren() 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 en FutureWarning. I din kod bör du vara explicit: skriv len(elem) != 0 om du är intresserad av antalet barn, eller elem ä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 en python-gdb.py som lägger till ett antal kommandon som är användbara vid debuggning av Python självt. Till exempel går py-up och py-down upp eller ner en Python-stackram, vilket vanligtvis motsvarar flera C-stackramar. py-print skriver ut värdet på en Python-variabel och py-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 anropa PyCode_New(), som hade många fler argument. (Tillagd av Jeffrey Yasskin.)

  • Ny funktion: PyErr_NewExceptionWithDoc() skapar en ny undantagsklass, precis som den befintliga PyErr_NewException() gör, men tar ett extra char * 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() och PyLong_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 funktionerna PyOS_ascii_strtod() och PyOS_ascii_atof() är nu föråldrade.

  • Ny funktion: PySys_SetArgvEx() sätter värdet på sys.argv och kan eventuellt uppdatera sys.path till att inkludera katalogen som innehåller skriptet som heter sys.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 alltid sys.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 namnet os.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ända PySys_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, och Py_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() och PyErr_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örde os.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 med threading-modulen. C-tilläggsmoduler som har interna lås, eller som själva anropar fork(), kommer inte att dra nytta av denna rensning.

    (Åtgärdat av Thomas Wouters; bpo-1590864.)

  • Funktionen Py_Finalize() anropar nu den interna funktionen threading._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 ett T_STRING_INPLACE-attribut.

  • Globala symboler som definieras av modulen ctypes prefixeras nu med Py, eller med _ctypes. (Implementerat av Thomas Heller; bpo-3102.)

  • Nytt konfigureringsalternativ: Med --with-system-expat kan modulen pyexpat 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

Hamnspecifika ändringar: Mac OS X

  • Sökvägen /Library/Python/2.7/site-packages är nu tillagd till sys.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 till sys.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

Övriga ändringar och korrigeringar

  • Två benchmark-skript, iobench och ccbench, har lagts till i katalogen Tools. iobench mäter hastigheten på de inbyggda fil-I/O-objekt som returneras av open() när olika operationer utförs, och ccbench ä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 attributen co_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 av str(). (Ä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ån object) 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 till AttributeError 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 till OverflowError. 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ängs format()-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 nu InvalidOperation istället för att i tysthet returnera ett sant eller falskt värde beroende på jämförelseoperatorn. Tysta NaN-värden (eller NaN) ä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ör StringIO-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 av sys.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-modulens urlsplit() 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 ett TypeError-undantag istället för att utlösa en DeprecationWarning (bpo-5080).

  • Använd den nya funktionen PyOS_string_to_double() istället för de gamla funktionerna PyOS_ascii_strtod() och PyOS_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 funktionen PySys_SetArgv() används. Kontrollera om du anropar PySys_SetArgv() och överväg noga om programmet bör använda PySys_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 att ssl nu stöder Server Name Indication, TLS1.x-inställningar, åtkomst till plattformens certifikatarkiv, klassen SSLContext 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 och hashlib.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.