Was ist neu in Python 2.7

Autor:

A.M. Kuchling (amk at amk.ca)

Dieser Artikel erklärt die neuen Funktionen in Python 2.7. Python 2.7 wurde am 3. Juli 2010 veröffentlicht.

Die numerische Handhabung wurde in vielerlei Hinsicht verbessert, sowohl für Gleitkommazahlen als auch für die Klasse Decimal. Es gibt einige nützliche Ergänzungen zur Standardbibliothek, wie z.B. ein stark verbessertes unittest Modul, das argparse Modul zum Parsen von Kommandozeilenoptionen, praktische OrderedDict und Counter Klassen im collections Modul und viele weitere Verbesserungen.

Python 2.7 soll die letzte Veröffentlichung der 2.x-Reihe sein, daher haben wir daran gearbeitet, sie zu einer guten Veröffentlichung für die langfristige Nutzung zu machen. Um die Portierung zu Python 3 zu erleichtern, wurden mehrere neue Funktionen aus der Python 3.x-Reihe in 2.7 aufgenommen.

Dieser Artikel versucht nicht, eine vollständige Spezifikation der neuen Funktionen zu bieten, sondern stattdessen einen praktischen Überblick. Für vollständige Details sollten Sie die Dokumentation für Python 2.7 unter https://docs.pythonlang.de konsultieren. Wenn Sie die Begründung für Design und Implementierung verstehen möchten, beziehen Sie sich auf das PEP für eine bestimmte neue Funktion oder auf den Eintrag auf https://bugs.python.org, in dem eine Änderung diskutiert wurde. Wo immer möglich, verlinkt "Was ist neu in Python" auf den Fehler-/Patch-Eintrag für jede Änderung.

Die Zukunft für Python 2.x

Python 2.7 ist die letzte Hauptveröffentlichung der 2.x-Reihe, da die Python-Maintainer ihren Fokus für die Neuentwicklung von Funktionen auf die Python 3.x-Reihe verlagert haben. Das bedeutet, dass Python 2 zwar weiterhin Fehlerbehebungen erhält und aktualisiert wird, um auf neuerer Hardware und neueren Versionen unterstützter Betriebssysteme korrekt zu kompilieren, es jedoch keine neuen vollständigen Funktionsveröffentlichungen für die Sprache oder die Standardbibliothek geben wird.

Während es eine große gemeinsame Teilmenge zwischen Python 2.7 und Python 3 gibt und viele der Änderungen bei der Migration zu dieser gemeinsamen Teilmenge oder direkt zu Python 3 sicher automatisiert werden können, erfordern einige andere Änderungen (insbesondere solche, die mit der Unicode-Verarbeitung zusammenhängen) möglicherweise sorgfältige Überlegungen und vorzugsweise robuste automatisierte Regressionstest-Suiten, um effektiv zu migrieren.

Dies bedeutet, dass Python 2.7 noch lange Zeit bestehen bleiben und eine stabile und unterstützte Basisplattform für Produktionssysteme bieten wird, die noch nicht auf Python 3 portiert wurden. Der vollständige erwartete Lebenszyklus der Python 2.7-Reihe ist in PEP 373 detailliert.

Einige wichtige Konsequenzen der langfristigen Bedeutung von 2.7 sind:

  • Wie oben erwähnt, hat die 2.7-Version einen viel längeren Wartungszeitraum im Vergleich zu früheren 2.x-Versionen. Es wird derzeit erwartet, dass Python 2.7 bis mindestens 2020 (10 Jahre nach seiner Erstveröffentlichung im Vergleich zur üblicheren Supportdauer von 18–24 Monaten) vom Kernentwicklungsteam unterstützt wird (mit Sicherheitsupdates und anderen Fehlerbehebungen).

  • Da die Standardbibliothek von Python 2.7 altert, wird die effektive Nutzung des Python Package Index (entweder direkt oder über einen Weiterverteiler) für Python 2-Benutzer immer wichtiger. Zusätzlich zu einer breiten Palette von Drittanbieterpaketen für verschiedene Aufgaben umfassen die verfügbaren Pakete Backports neuer Module und Funktionen aus der Python 3-Standardbibliothek, die mit Python 2 kompatibel sind, sowie verschiedene Werkzeuge und Bibliotheken, die die Migration zu Python 3 erleichtern können. Die Python Packaging User Guide bietet Anleitungen zum Herunterladen und Installieren von Software aus dem Python Package Index.

  • Während der bevorzugte Ansatz zur Verbesserung von Python 2 nun die Veröffentlichung neuer Pakete auf dem Python Package Index ist, funktioniert dieser Ansatz nicht unbedingt in allen Fällen, insbesondere in solchen, die die Netzwerksicherheit betreffen. In Ausnahmefällen, die nicht angemessen durch die Veröffentlichung neuer oder aktualisierter Pakete auf PyPI gehandhabt werden können, kann das Python Enhancement Proposal-Verfahren verwendet werden, um die Aufnahme neuer Funktionen direkt in die Python 2-Standardbibliothek zu begründen. Solche Ergänzungen und die Wartungs-Releases, in denen sie hinzugefügt wurden, werden im Abschnitt Neue Funktionen, die zu den Wartungs-Releases von Python 2.7 hinzugefügt wurden unten vermerkt.

Für Projekte, die von Python 2 zu Python 3 migrieren möchten, oder für Bibliotheks- und Framework-Entwickler, die Benutzer sowohl unter Python 2 als auch unter Python 3 unterstützen möchten, stehen eine Vielzahl von Werkzeugen und Anleitungen zur Verfügung, die bei der Entscheidung für einen geeigneten Ansatz und bei der Bewältigung einiger technischer Details helfen. Der empfohlene Ausgangspunkt ist der HOWTO-Leitfaden How to port Python 2 Code to Python 3.

Änderungen an der Handhabung von Deprecation Warnings

Für Python 2.7 wurde die Entscheidung getroffen, Warnungen, die nur für Entwickler von Interesse sind, standardmäßig zu unterdrücken. DeprecationWarning und seine Nachfolger werden nun ignoriert, es sei denn, es wird ausdrücklich gewünscht, um zu verhindern, dass Benutzer Warnungen sehen, die von einer Anwendung ausgelöst werden. Diese Änderung wurde auch in dem Zweig vorgenommen, der zu Python 3.2 wurde. (Diskutiert auf stdlib-sig und durchgeführt in bpo-7319.)

In früheren Versionen waren DeprecationWarning Nachrichten standardmäßig aktiviert und gaben Python-Entwicklern eine klare Anzeige, wo ihr Code in einer zukünftigen Hauptversion von Python brechen könnte.

Es gibt jedoch immer mehr Benutzer von Python-basierten Anwendungen, die nicht direkt an der Entwicklung dieser Anwendungen beteiligt sind. DeprecationWarning-Nachrichten sind für solche Benutzer irrelevant, sodass sie sich Sorgen um eine Anwendung machen, die tatsächlich korrekt funktioniert, und Anwendungsentwickler mit der Beantwortung dieser Bedenken belasten.

Sie können die Anzeige von DeprecationWarning Nachrichten wieder aktivieren, indem Sie Python mit dem Schalter -Wdefault (Kurzform: -Wd) ausführen oder die Umgebungsvariable PYTHONWARNINGS vor der Ausführung von Python auf "default" (oder "d") setzen. Python-Code kann sie auch wieder aktivieren, indem er warnings.simplefilter('default') aufruft.

Das unittest Modul aktiviert auch automatisch Deprecation Warnings beim Ausführen von Tests.

Python 3.1 Funktionen

So wie Python 2.6 Funktionen aus Python 3.0 integrierte, übernimmt Version 2.7 einige der neuen Funktionen von Python 3.1. Die 2.x-Reihe bietet weiterhin Werkzeuge für die Migration zur 3.x-Reihe.

Eine teilweise Liste von 3.1-Funktionen, die nach 2.7 zurückportiert wurden

  • Die Syntax für Mengenliterale ({1,2,3} ist eine veränderliche Menge).

  • Dictionary- und Mengen-Comprehensions ({i: i*2 for i in range(3)}).

  • Mehrere Kontextmanager in einer einzigen with Anweisung.

  • Eine neue Version der io-Bibliothek, die in C für mehr Leistung neu geschrieben wurde.

  • Der geordnete Dictionary-Typ, wie in PEP 372: Hinzufügen eines geordneten Dictionary zu collections beschrieben.

  • Das neue Formatierungs-Spezifizierer "," wie in PEP 378: Format Specifier for Thousands Separator beschrieben.

  • Das memoryview Objekt.

  • Eine kleine Teilmenge des importlib Moduls, weiter unten beschrieben.

  • Das repr() eines Floats x ist in vielen Fällen kürzer: es basiert nun auf dem kürzesten Dezimalstring, der garantiert zurück zu x rundet. Wie in früheren Versionen von Python ist garantiert, dass float(repr(x)) x wiederherstellt.

  • Float-zu-String- und String-zu-Float-Konvertierungen sind korrekt gerundet. Die Funktion round() ist nun ebenfalls korrekt gerundet.

  • Der Typ PyCapsule, der zur Bereitstellung einer C-API für Erweiterungsmodule verwendet wird.

  • Die C-API-Funktion PyLong_AsLongAndOverflow().

Weitere neue Warnungen im Python3-Modus sind:

  • operator.isCallable() und operator.sequenceIncludes(), die in 3.x nicht unterstützt werden, lösen nun Warnungen aus.

  • Der Schalter -3 aktiviert nun automatisch den Schalter -Qwarn, der Warnungen über die Verwendung der klassischen Division mit ganzen Zahlen und langen ganzen Zahlen verursacht.

PEP 372: Hinzufügen eines geordneten Dictionary zu collections

Reguläre Python-Dictionaries iterieren über Schlüssel/Wert-Paare in beliebiger Reihenfolge. Im Laufe der Jahre haben eine Reihe von Autoren alternative Implementierungen geschrieben, die sich die Reihenfolge merken, in der die Schlüssel ursprünglich eingefügt wurden. Basierend auf den Erfahrungen dieser Implementierungen führt 2.7 eine neue Klasse OrderedDict im collections Modul ein.

Die OrderedDict API bietet die gleiche Schnittstelle wie reguläre Dictionaries, iteriert aber über Schlüssel und Werte in einer garantierten Reihenfolge, je nachdem, wann ein Schlüssel erstmals eingefügt wurde.

>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
...                  ('second', 2),
...                  ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]

Wenn ein neuer Eintrag einen vorhandenen Eintrag überschreibt, bleibt die ursprüngliche Einfügeposition unverändert.

>>> d['second'] = 4
>>> d.items()
[('first', 1), ('second', 4), ('third', 3)]

Das Löschen und erneute Einfügen eines Eintrags verschiebt ihn ans Ende.

>>> del d['second']
>>> d['second'] = 5
>>> d.items()
[('first', 1), ('third', 3), ('second', 5)]

Die Methode popitem() hat ein optionales Argument last, das standardmäßig auf True gesetzt ist. Wenn last wahr ist, wird der zuletzt hinzugefügte Schlüssel zurückgegeben und entfernt; wenn es falsch ist, wird der älteste Schlüssel ausgewählt.

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

Der Vergleich zweier geordneter Dictionaries prüft sowohl die Schlüssel als auch die Werte und erfordert, dass die Einfügungsreihenfolge dieselbe war.

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

Der Vergleich eines OrderedDict mit einem regulären Dictionary ignoriert die Einfügungsreihenfolge und vergleicht nur Schlüssel und Werte.

Wie funktioniert OrderedDict? Es verwaltet eine doppelt verkettete Liste von Schlüsseln und hängt neue Schlüssel an die Liste an, sobald sie eingefügt werden. Ein sekundäres Dictionary ordnet Schlüssel ihren entsprechenden Listenknoten zu, sodass das Löschen nicht die gesamte verkettete Liste durchlaufen muss und daher O(1) bleibt.

Die Standardbibliothek unterstützt nun die Verwendung von geordneten Dictionaries in mehreren Modulen.

  • Das ConfigParser Modul verwendet sie standardmäßig, was bedeutet, dass Konfigurationsdateien nun gelesen, geändert und dann in ihrer ursprünglichen Reihenfolge zurückgeschrieben werden können.

  • Die Methode _asdict() für collections.namedtuple() gibt nun ein geordnetes Dictionary zurück, wobei die Werte in derselben Reihenfolge erscheinen wie die zugrunde liegenden Tupelindizes.

  • Der Konstruktor der Klasse JSONDecoder des json Moduls wurde um einen Parameter object_pairs_hook erweitert, um die Erstellung von OrderedDict Instanzen durch den Decoder zu ermöglichen. Unterstützung wurde auch für Drittanbieter-Tools wie PyYAML hinzugefügt.

Siehe auch

PEP 372 - Hinzufügen eines geordneten Dictionary zu collections

PEP geschrieben von Armin Ronacher und Raymond Hettinger; implementiert von Raymond Hettinger.

PEP 378: Format-Spezifizierer für Tausendertrennzeichen

Um die Lesbarkeit von Programmausgaben zu verbessern, kann es nützlich sein, große Zahlen mit Trennzeichen zu versehen, sodass sie als 18.446.744.073.709.551.616 statt als 18446744073709551616 gerendert werden.

Die vollständig allgemeine Lösung hierfür ist das locale Modul, das verschiedene Trennzeichen ("," in Nordamerika, "." in Europa) und verschiedene Gruppengrößen verwenden kann. locale ist jedoch kompliziert zu verwenden und ungeeignet für Multi-Threaded-Anwendungen, bei denen verschiedene Threads Ausgaben für verschiedene Lokalisierungen produzieren.

Daher wurde ein einfacher Komma-Gruppierungsmechanismus zum Mini-Sprachumfang hinzugefügt, der von der str.format() Methode verwendet wird. Beim Formatieren einer Gleitkommazahl fügen Sie einfach ein Komma zwischen Breite und Präzision ein.

>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'

Beim Formatieren einer ganzen Zahl fügen Sie das Komma nach der Breite ein.

>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'

Dieser Mechanismus ist nicht anpassungsfähig; Kommas werden immer als Trennzeichen verwendet und die Gruppierung erfolgt immer in Dreiergruppen. Der Komma-Formatierungsmechanismus ist nicht so allgemein wie das locale Modul, aber er ist einfacher zu verwenden.

Siehe auch

PEP 378 - Format-Spezifizierer für Tausendertrennzeichen

PEP geschrieben von Raymond Hettinger; implementiert von Eric Smith.

PEP 389: Das argparse Modul zum Parsen von Kommandozeilen

Das argparse Modul zum Parsen von Kommandozeilenargumenten wurde als leistungsfähigerer Ersatz für das optparse Modul hinzugefügt.

Das bedeutet, Python unterstützt nun drei verschiedene Module zum Parsen von Kommandozeilenargumenten: getopt, optparse und argparse. Das getopt Modul ähnelt stark der C-Bibliotheksfunktion getopt(), daher bleibt es nützlich, wenn Sie einen Python-Prototypen schreiben, der schließlich in C neu geschrieben wird. optparse wird redundant, aber es gibt keine Pläne, es zu entfernen, da es viele Skripte gibt, die es noch verwenden, und es keine automatisierte Möglichkeit gibt, diese Skripte zu aktualisieren. (Die Konsistenz der argparse API mit der Schnittstelle von optparse wurde diskutiert, aber als zu unübersichtlich und schwierig abgelehnt.)

Kurz gesagt, wenn Sie ein neues Skript schreiben und sich keine Gedanken über die Kompatibilität mit früheren Python-Versionen machen müssen, verwenden Sie argparse anstelle von optparse.

Hier ist ein Beispiel

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__

Sofern nicht überschrieben, werden die Schalter -h und --help automatisch hinzugefügt und erzeugen eine sauber formatierte Ausgabe.

-> ./python.exe argparse-example.py --help
usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]

Command-line example.

positional arguments:
  inputs      input filenames (default is stdin)

optional arguments:
  -h, --help  show this help message and exit
  -v          produce verbose output
  -o FILE     direct output to FILE instead of stdout
  -C NUM      display NUM lines of added context

Wie bei optparse werden die Kommandozeilenschalter und Argumente als Objekt mit Attributen zurückgegeben, die nach den dest Parametern benannt sind.

-> ./python.exe argparse-example.py -v
{'output': None,
 'is_verbose': True,
 'context': 0,
 'inputs': []}

-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
{'output': '/tmp/output',
 'is_verbose': True,
 'context': 4,
 'inputs': ['file1', 'file2']}

argparse hat eine viel ausgefeiltere Validierung als optparse; Sie können eine exakte Anzahl von Argumenten als ganze Zahl angeben, 0 oder mehr Argumente, indem Sie '*' übergeben, 1 oder mehr, indem Sie '+' übergeben, oder ein optionales Argument mit '?'. Ein Top-Level-Parser kann Sub-Parser enthalten, um Unterbefehle mit unterschiedlichen Sätzen von Schaltern zu definieren, wie bei svn commit, svn checkout usw. Sie können den Typ eines Arguments als FileType angeben, was Dateien automatisch für Sie öffnet und versteht, dass '-' Standardeingabe oder -ausgabe bedeutet.

Siehe auch

argparse Dokumentation

Die Dokumentationsseite des argparse-Moduls.

Migration von optparse-Code zu argparse

Teil der Python-Dokumentation, der beschreibt, wie Code, der optparse verwendet, konvertiert wird.

PEP 389 - argparse - Neues Modul zum Parsen von Kommandozeilen

PEP geschrieben und implementiert von Steven Bethard.

PEP 391: Dictionary-basierte Konfiguration für Logging

Das logging Modul ist sehr flexibel; Anwendungen können einen Baum von Logging-Subsystemen definieren, und jeder Logger in diesem Baum kann bestimmte Nachrichten filtern, sie unterschiedlich formatieren und Nachrichten an eine variable Anzahl von Handlern weiterleiten.

All diese Flexibilität kann viel Konfiguration erfordern. Sie können Python-Anweisungen schreiben, um Objekte zu erstellen und ihre Eigenschaften festzulegen, aber eine komplexe Einrichtung erfordert ausführlichen, aber langweiligen Code. logging unterstützt auch eine Funktion fileConfig(), die eine Datei parst, aber das Dateiformat unterstützt keine Konfiguration von Filtern und ist programmatisch schwieriger zu generieren.

Python 2.7 fügt eine Funktion dictConfig() hinzu, die ein Dictionary zur Konfiguration von Logging verwendet. Es gibt viele Möglichkeiten, ein Dictionary aus verschiedenen Quellen zu erzeugen: mit Code erstellen; eine Datei mit JSON parsen; oder eine YAML-Parsing-Bibliothek verwenden, falls eine installiert ist. Weitere Informationen finden Sie unter Configuration functions.

Das folgende Beispiel konfiguriert zwei Logger, den Root-Logger und einen Logger namens "network". Nachrichten, die an den Root-Logger gesendet werden, werden über das Syslog-Protokoll an das Systemprotokoll gesendet, und Nachrichten an den "network"-Logger werden in eine Datei network.log geschrieben, die rotiert wird, sobald das Protokoll 1MB erreicht.

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

Drei kleinere Verbesserungen am logging Modul, alle implementiert von Vinay Sajip, sind:

  • Die Klasse SysLogHandler unterstützt jetzt Syslogging über TCP. Der Konstruktor verfügt über einen Parameter socktype, der den zu verwendenden Socket-Typ angibt, entweder socket.SOCK_DGRAM für UDP oder socket.SOCK_STREAM für TCP. Das Standardprotokoll bleibt UDP.

  • Logger-Instanzen erhielten eine Methode getChild(), die einen abgeleiteten Logger über einen relativen Pfad abruft. Wenn Sie beispielsweise einen Logger über log = getLogger('app') abrufen, ist der Aufruf von log.getChild('network.listen') gleichbedeutend mit getLogger('app.network.listen').

  • Die Klasse LoggerAdapter erhielt eine Methode isEnabledFor(), die ein level annimmt und zurückgibt, ob der zugrunde liegende Logger eine Nachricht dieser Wichtigkeitsebene verarbeiten würde.

Siehe auch

PEP 391 - Dictionary-basierte Konfiguration für Logging

PEP geschrieben und implementiert von Vinay Sajip.

PEP 3106: Dictionary Views

Die Dictionary-Methoden keys(), values() und items() sind in Python 3.x anders. Sie geben ein Objekt namens View zurück, anstatt einer vollständig materialisierten Liste.

Es ist nicht möglich, die Rückgabewerte von keys(), values() und items() in Python 2.7 zu ändern, da zu viel Code kaputt gehen würde. Stattdessen wurden die 3.x-Versionen unter den neuen Namen viewkeys(), viewvalues() und viewitems() hinzugefügt.

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

Views können durchlaufen werden, aber die Schlüssel- und Elementansichten verhalten sich auch wie Mengen. Der Operator & führt eine Schnittmenge durch, und | eine Vereinigung.

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

Die View verfolgt das Dictionary und seine Inhalte ändern sich, wenn das Dictionary modifiziert wird.

>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])

Beachten Sie jedoch, dass Sie keine Schlüssel hinzufügen oder entfernen können, während Sie über die View iterieren.

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

Sie können die View-Methoden in Python 2.x-Code verwenden, und der 2to3-Konverter wird sie in die Standardmethoden keys(), values() und items() ändern.

Siehe auch

PEP 3106 - Überarbeitung von dict.keys(), .values() und .items()

PEP geschrieben von Guido van Rossum. Zurückportiert nach 2.7 von Alexandre Vassalotti; bpo-1967.

PEP 3137: Das memoryview-Objekt

Das memoryview-Objekt bietet eine Ansicht des Speicherinhalts eines anderen Objekts, die der Schnittstelle des bytes-Typs entspricht.

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

Der Inhalt der View kann in eine Byte-Zeichenkette oder eine Liste von ganzen Zahlen konvertiert werden.

>>> m2.tobytes()
'abcdefghijklmnopqrstuvwxyz'
>>> m2.tolist()
[97, 98, 99, 100, 101, 102, 103, ... 121, 122]
>>>

memoryview-Objekte erlauben die Änderung des zugrunde liegenden Objekts, wenn es sich um ein veränderliches Objekt handelt.

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

Siehe auch

PEP 3137 - Immutable Bytes und Mutable Buffer

PEP geschrieben von Guido van Rossum. Implementiert von Travis Oliphant, Antoine Pitrou und anderen. Zurückportiert nach 2.7 von Antoine Pitrou; bpo-2396.

Andere Sprachänderungen

Einige kleinere Änderungen am Kern der Python-Sprache sind:

  • Die Syntax für Mengen-Literale wurde aus Python 3.x zurückportiert. Geschweifte Klammern werden verwendet, um den Inhalt der resultierenden veränderlichen Menge einzuschließen; Mengen-Literale werden von Dictionaries durch das Fehlen von Doppelpunkten und Werten unterschieden. {} stellt weiterhin ein leeres Dictionary dar; verwenden Sie set() für eine leere Menge.

    >>> {1, 2, 3, 4, 5}
    set([1, 2, 3, 4, 5])
    >>> set() # empty set
    set([])
    >>> {}    # empty dict
    {}
    

    Zurückportiert von Alexandre Vassalotti; bpo-2335.

  • Dictionary- und Mengen-Comprehensions sind weitere Features, die aus 3.x zurückportiert wurden und List-/Generator-Comprehensions verallgemeinern, um die Literal-Syntax für Mengen und Dictionaries zu verwenden.

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

    Zurückportiert von Alexandre Vassalotti; bpo-2333.

  • Die with-Anweisung kann nun mehrere Kontextmanager in einer Anweisung verwenden. Kontextmanager werden von links nach rechts verarbeitet und jeder wird so behandelt, als ob er eine neue with-Anweisung beginnt. Das bedeutet, dass

    with A() as a, B() as b:
        ... suite of statements ...
    

    gleichbedeutend ist mit

    with A() as a:
        with B() as b:
            ... suite of statements ...
    

    Die Funktion contextlib.nested() bietet eine sehr ähnliche Funktion, ist daher nicht mehr notwendig und wurde als veraltet markiert.

    (Vorgeschlagen in https://codereview.appspot.com/53094; implementiert von Georg Brandl.)

  • Konvertierungen zwischen Gleitkommazahlen und Zeichenketten sind auf den meisten Plattformen jetzt korrekt gerundet. Diese Konvertierungen erfolgen an vielen verschiedenen Stellen: str() auf Floats und komplexe Zahlen; die Konstruktoren float und complex; numerische Formatierung; Serialisieren und Deserialisieren von Floats und komplexen Zahlen mit den Modulen marshal, pickle und json; Parsen von Float- und Imaginärteil-Literalen im Python-Code; und Decimal-zu-Float-Konvertierung.

    Damit verbunden ist, dass repr() einer Gleitkommazahl x nun ein Ergebnis zurückgibt, das auf der kürzesten Dezimalzeichenkette basiert, die garantiert unter korrekter Rundung (mit Rundungsmodus "halb zu gerade") zu x zurückrundet. Zuvor wurde eine Zeichenkette zurückgegeben, die auf der Rundung von x auf 17 Dezimalstellen basierte.

    Die zuständige Rundungsbibliothek für diese Verbesserung funktioniert unter Windows und auf Unix-Plattformen mit den gcc-, icc- oder suncc-Compilern. Es kann eine kleine Anzahl von Plattformen geben, auf denen die korrekte Funktion dieses Codes nicht garantiert werden kann, daher wird der Code auf solchen Systemen nicht verwendet. Sie können herausfinden, welcher Code verwendet wird, indem Sie sys.float_repr_style überprüfen, der short sein wird, wenn der neue Code verwendet wird, und legacy, wenn er nicht verwendet wird.

    Implementiert von Eric Smith und Mark Dickinson unter Verwendung von David Gays dtoa.c-Bibliothek; bpo-7117.

  • Konvertierungen von langen ganzen Zahlen und regulären ganzen Zahlen zu Gleitkommazahlen runden jetzt anders und geben die Gleitkommazahl zurück, die der Zahl am nächsten liegt. Das spielt für kleine ganze Zahlen, die exakt konvertiert werden können, keine Rolle, aber für große Zahlen, die zwangsläufig Präzision verlieren, nähert sich Python 2.7 nun genauer an. Zum Beispiel berechnete Python 2.6 Folgendes:

    >>> n = 295147905179352891391
    >>> float(n)
    2.9514790517935283e+20
    >>> n - long(float(n))
    65535L
    

    Das Gleitkommaergebnis von Python 2.7 ist größer, aber viel näher am tatsächlichen Wert.

    >>> n = 295147905179352891391
    >>> float(n)
    2.9514790517935289e+20
    >>> n - long(float(n))
    -1L
    

    (Implementiert von Mark Dickinson; bpo-3166.)

    Die ganzzahlige Division ist ebenfalls genauer in ihrem Rundungsverhalten. (Ebenfalls implementiert von Mark Dickinson; bpo-1811.)

  • Implizite Koerzion für komplexe Zahlen wurde entfernt; der Interpreter wird niemals versuchen, eine __coerce__()-Methode auf komplexen Objekten aufzurufen. (Entfernt von Meador Inge und Mark Dickinson; bpo-5211.)

  • Die Methode str.format() unterstützt jetzt die automatische Nummerierung der Ersetzungsfelder. Dies macht die Verwendung von str.format() ähnlicher der Verwendung der %s-Formatierung.

    >>> '{}:{}:{}'.format(2009, 04, 'Sunday')
    '2009:4:Sunday'
    >>> '{}:{}:{day}'.format(2009, 4, day='Sunday')
    '2009:4:Sunday'
    

    Die automatische Nummerierung nimmt die Felder von links nach rechts, sodass der erste {...}-Spezifizierer das erste Argument für str.format() verwendet, der nächste Spezifizierer das nächste Argument usw. Sie können keine automatische und explizite Nummerierung mischen – entweder nummerieren Sie alle Ihre Spezifiziererfelder oder keines davon – aber Sie können automatische Nummerierung und benannte Felder mischen, wie im zweiten Beispiel oben. (Beigetragen von Eric Smith; bpo-5237.)

    Komplexe Zahlen unterstützen jetzt korrekt die Verwendung mit format() und werden standardmäßig rechtsbündig ausgerichtet. Die Angabe einer Genauigkeit oder Kommas als Trennzeichen gilt für den realen und den imaginären Teil der Zahl, aber eine angegebene Feldbreite und Ausrichtung wird auf die gesamte resultierende Ausgabe 1.5+3j angewendet. (Beigetragen von Eric Smith; bpo-1588 und bpo-7988.)

    Der Formatcode 'F' formatiert seine Ausgabe jetzt immer mit Großbuchstaben, sodass er jetzt 'INF' und 'NAN' erzeugt. (Beigetragen von Eric Smith; bpo-3382.)

    Eine Low-Level-Änderung: Die Methode object.__format__() löst jetzt eine PendingDeprecationWarning aus, wenn ihr eine Formatierungszeichenkette übergeben wird, da die __format__()-Methode für object die Zeichenkette des Objekts konvertiert und diese formatiert. Zuvor wandte die Methode die Formatierungszeichenkette stillschweigend auf die Zeichenkettenrepräsentation an, dies konnte aber Fehler im Python-Code verbergen. Wenn Sie Formatierungsinformationen wie Ausrichtung oder Genauigkeit angeben, erwarten Sie wahrscheinlich, dass die Formatierung auf eine objekt-spezifische Weise angewendet wird. (Behoben von Eric Smith; bpo-7994.)

  • Die Typen int() und long() erhielten eine Methode bit_length, die die Anzahl der Bits zurückgibt, die zur Darstellung ihres Arguments in Binärform benötigt werden.

    >>> n = 37
    >>> bin(n)
    '0b100101'
    >>> n.bit_length()
    6
    >>> n = 2**123-1
    >>> n.bit_length()
    123
    >>> (n+1).bit_length()
    124
    

    (Beigetragen von Fredrik Johansson und Victor Stinner; bpo-3439.)

  • Die import-Anweisung wird keinen absoluten Import mehr versuchen, wenn ein relativer Import (z.B. from .os import sep) fehlschlägt. Dies behebt einen Fehler, könnte aber möglicherweise bestimmte import-Anweisungen, die nur zufällig funktionierten, unterbrechen. (Behoben von Meador Inge; bpo-7902.)

  • Es ist jetzt möglich, dass eine Unterklasse des eingebauten Typs unicode die Methode __unicode__() überschreibt. (Implementiert von Victor Stinner; bpo-1583863.)

  • Die Methode translate() des Typs bytearray akzeptiert jetzt None als erstes Argument. (Behoben von Georg Brandl; bpo-4759.)

  • Beim Verwenden von @classmethod und @staticmethod zum Umwickeln von Methoden als Klassen- oder statische Methoden, gibt das Wrapper-Objekt die umwickelte Funktion nun über sein Attribut __func__ preis. (Beigetragen von Amaury Forgeot d’Arc, nach einem Vorschlag von George Sakkis; bpo-5982.)

  • Wenn eine eingeschränkte Menge von Attributen mit __slots__ gesetzt wurde, würde das Löschen eines nicht gesetzten Attributs keine AttributeError auslösen, wie erwartet. Behoben von Benjamin Peterson; bpo-7604.)

  • Zwei neue Kodierungen werden nun unterstützt: "cp720", hauptsächlich für arabischen Text verwendet; und "cp858", eine Variante von CP 850, die das Euro-Symbol hinzufügt. (CP720 beigetragen von Alexander Belchenko und Amaury Forgeot d’Arc in bpo-1616979; CP858 beigetragen von Tim Hatch in bpo-8016.)

  • Das file-Objekt setzt jetzt das Attribut filename in der IOError-Ausnahme, wenn versucht wird, ein Verzeichnis auf POSIX-Plattformen zu öffnen (vermerkt von Jan Kaliszewski; bpo-4764), und prüft nun explizit, ob schreibgeschützte Datei-Objekte beschrieben werden, anstatt sich darauf zu verlassen, dass die C-Bibliothek den Fehler abfängt und meldet (behoben von Stefan Krah; bpo-5677).

  • Der Python-Tokenizer übersetzt jetzt selbst Zeilenumbrüche, sodass die eingebaute Funktion compile() jetzt Code mit jeder Zeilenende-Konvention akzeptiert. Außerdem erfordert er nicht mehr, dass der Code mit einem Zeilenumbruch endet.

  • Zusätzliche Klammern in Funktionsdefinitionen sind in Python 3.x illegal, was bedeutet, dass Sie einen Syntaxfehler für def f((x)): pass erhalten. Im Python3-Warnmodus wird Python 2.7 nun vor dieser seltsamen Verwendung warnen. (Vermerkt von James Lingard; bpo-7362.)

  • Es ist jetzt möglich, schwache Referenzen auf Klassenobjekte alten Stils zu erstellen. Klassen neuen Stils waren schon immer schwach referenzierbar. (Behoben von Antoine Pitrou; bpo-8268.)

  • Wenn ein Modulobjekt durch die Garbage Collection entfernt wird, wird das Dictionary des Moduls nun nur noch dann geleert, wenn niemand sonst eine Referenz auf das Dictionary hält (bpo-7140).

Interpreter-Änderungen

Eine neue Umgebungsvariable, PYTHONWARNINGS, ermöglicht die Steuerung von Warnungen. Sie sollte auf eine Zeichenkette mit Warnungseinstellungen gesetzt werden, die mit der Schalter -W verwendet werden, durch Kommas getrennt. (Beigetragen von Brian Curtin; bpo-7301.)

Zum Beispiel wird die folgende Einstellung Warnungen jedes Mal ausgeben, wenn sie auftreten, aber Warnungen aus dem Modul Cookie in einen Fehler umwandeln. (Die genaue Syntax für das Setzen einer Umgebungsvariablen variiert je nach Betriebssystem und Shell.)

export PYTHONWARNINGS=all,error:::Cookie:0

Optimierungen

Mehrere Leistungsverbesserungen wurden hinzugefügt.

  • Ein neuer Opcode wurde hinzugefügt, um die anfängliche Einrichtung für with-Anweisungen durchzuführen und die Methoden __enter__() und __exit__() nachzuschlagen. (Beigetragen von Benjamin Peterson.)

  • Der Garbage Collector funktioniert jetzt besser für ein häufiges Nutzungsmuster: Wenn viele Objekte alloziert werden, ohne dass eines davon freigegeben wird. Dies dauerte zuvor für die Garbage Collection quadratische Zeit, aber jetzt reduziert sich die Anzahl der vollständigen Garbage Collections mit wachsender Anzahl von Objekten auf dem Heap. Die neue Logik führt nur dann eine vollständige Garbage Collection durch, wenn die mittlere Generation 10 Mal gesammelt wurde und die Anzahl der Überlebenden aus der mittleren Generation 10% der Objekte in der ältesten Generation übersteigt. (Vorgeschlagen von Martin von Löwis und implementiert von Antoine Pitrou; bpo-4074.)

  • Der Garbage Collector versucht, einfache Container, die nicht Teil eines Zyklus sein können, nicht zu verfolgen. In Python 2.7 gilt dies nun für Tupel und Dictionaries, die atomare Typen (wie Integers, Strings usw.) enthalten. Transitiv wird auch ein Dictionary, das Tupel atomarer Typen enthält, nicht verfolgt. Dies trägt dazu bei, die Kosten jeder Garbage Collection zu senken, indem die Anzahl der vom Collector zu berücksichtigenden und zu durchlaufenden Objekte reduziert wird. (Beigetragen von Antoine Pitrou; bpo-4688.)

  • Lange Ganzzahlen werden jetzt intern entweder in Basis 2**15 oder in Basis 2**30 gespeichert, wobei die Basis zur Build-Zeit bestimmt wird. Zuvor wurden sie immer in Basis 2**15 gespeichert. Die Verwendung von Basis 2**30 bietet signifikante Leistungsverbesserungen auf 64-Bit-Maschinen, aber die Benchmark-Ergebnisse auf 32-Bit-Maschinen waren gemischt. Daher ist die Standardeinstellung die Verwendung von Basis 2**30 auf 64-Bit-Maschinen und Basis 2**15 auf 32-Bit-Maschinen; unter Unix gibt es eine neue Konfigurationsoption --enable-big-digits, mit der diese Standardeinstellung überschrieben werden kann.

    Abgesehen von den Leistungsverbesserungen ist diese Änderung für Endbenutzer unsichtbar, mit einer Ausnahme: Für Test- und Debugging-Zwecke gibt es eine neue Structseq sys.long_info, die Informationen über das interne Format liefert, die Anzahl der Bits pro Ziffer und die Größe in Bytes des C-Typs, der zur Speicherung jeder Ziffer verwendet wird.

    >>> import sys
    >>> sys.long_info
    sys.long_info(bits_per_digit=30, sizeof_digit=4)
    

    (Beigetragen von Mark Dickinson; bpo-4258.)

    Eine weitere Reihe von Änderungen machte lange Objekte ein paar Bytes kleiner: 2 Bytes kleiner auf 32-Bit-Systemen und 6 Bytes auf 64-Bit-Systemen. (Beigetragen von Mark Dickinson; bpo-5260.)

  • Der Divisionsalgorithmus für lange Ganzzahlen wurde schneller gemacht, indem die innere Schleife gestrafft, Verschiebungen statt Multiplikationen verwendet und eine unnötige zusätzliche Iteration behoben wurde. Verschiedene Benchmarks zeigen Geschwindigkeitssteigerungen von 50% bis 150% für lange Ganzzahldivisionen und Modulo-Operationen. (Beigetragen von Mark Dickinson; bpo-5512.) Bitweise Operationen sind ebenfalls deutlich schneller (initialer Patch von Gregory Smith; bpo-1087418).

  • Die Implementierung von % prüft, ob der linke Operand eine Python-Zeichenkette ist und behandelt diesen als Sonderfall; dies führt zu einer Leistungssteigerung von 1–3% für Anwendungen, die % häufig mit Zeichenketten verwenden, wie z.B. Templating-Bibliotheken. (Implementiert von Collin Winter; bpo-5176.)

  • List Comprehensions mit einer if-Bedingung werden in schnelleren Bytecode kompiliert. (Patch von Antoine Pitrou, zurückportiert nach 2.7 von Jeffrey Yasskin; bpo-4715.)

  • Die Konvertierung einer ganzen Zahl oder einer langen ganzen Zahl in eine Dezimalzeichenkette wurde beschleunigt, indem Basis 10 als Sonderfall behandelt wurde, anstatt eine verallgemeinerte Konvertierungsfunktion zu verwenden, die beliebige Basen unterstützt. (Patch von Gawain Bolton; bpo-6713.)

  • Die Methoden split(), replace(), rindex(), rpartition() und rsplit() von zeichenkettenähnlichen Typen (Strings, Unicode-Strings und bytearray-Objekte) verwenden nun einen schnellen Rückwärtssuchalgorithmus anstelle eines zeichenweisen Scans. Dies ist manchmal um den Faktor 10 schneller. (Hinzugefügt von Florent Xicluna; bpo-7462 und bpo-7622.)

  • Die Module pickle und cPickle internieren nun automatisch die für Attributnamen verwendeten Zeichenketten, was die Speichernutzung der Objekte reduziert, die aus dem Unpickling resultieren. (Beigetragen von Jake McGuire; bpo-5084.)

  • Das Modul cPickle behandelt jetzt Dictionaries als Sonderfall, was die Zeit für das Picklen von ihnen fast halbiert. (Beigetragen von Collin Winter; bpo-5670.)

Neue und verbesserte Module

Wie in jeder Version hat die Standardbibliothek von Python eine Reihe von Verbesserungen und Fehlerbehebungen erhalten. Hier ist eine Teilliste der bemerkenswertesten Änderungen, alphabetisch nach Modulnamen sortiert. Konsultieren Sie die Datei Misc/NEWS im Quellbaum für eine vollständigere Liste der Änderungen oder durchsuchen Sie die Subversion-Logs für alle Details.

  • Die Basis-Debug-Klasse Bdb des Moduls bdb erhielt eine Funktion zum Überspringen von Modulen. Der Konstruktor nimmt jetzt ein Iterable mit glob-ähnlichen Mustern wie django.* entgegen; der Debugger wird keine Stack-Frames aus einem Modul überspringen, das einem dieser Muster entspricht. (Beigetragen von Maru Newby nach einem Vorschlag von Senthil Kumaran; bpo-5142.)

  • Das Modul binascii unterstützt nun die Buffer-API, sodass es mit memoryview-Instanzen und anderen ähnlichen Buffer-Objekten verwendet werden kann. (Aus 3.x zurückportiert von Florent Xicluna; bpo-7703.)

  • Aktualisiertes Modul: Das Modul bsddb wurde von 4.7.2devel9 auf Version 4.8.4 von dem pybsddb-Paket aktualisiert. Die neue Version bietet eine bessere Python 3.x-Kompatibilität, verschiedene Fehlerbehebungen und fügt mehrere neue BerkeleyDB-Flags und -Methoden hinzu. (Aktualisiert von Jesús Cea Avión; bpo-8156. Das pybsddb-Changelog kann unter https://hg.jcea.es/pybsddb/file/tip/ChangeLog gelesen werden.)

  • Die BZ2File des Moduls bz2 unterstützt nun das Kontextmanagementprotokoll, sodass Sie with bz2.BZ2File(...) as f: schreiben können. (Beigetragen von Hagen Fürstenau; bpo-3860.)

  • Neue Klasse: Die Klasse Counter im Modul collections ist nützlich zum Zählen von Daten. Counter-Instanzen verhalten sich größtenteils wie Dictionaries, geben aber für fehlende Schlüssel Null zurück, anstatt einen KeyError auszulösen.

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

    Es gibt drei zusätzliche Counter-Methoden. most_common() gibt die N häufigsten Elemente und ihre Anzahlen zurück. elements() gibt einen Iterator über die enthaltenen Elemente zurück und wiederholt jedes Element so oft, wie seine Anzahl angibt. subtract() nimmt ein Iterable entgegen und subtrahiert eins für jedes Element anstatt zu addieren; wenn das Argument ein Dictionary oder ein anderes Counter ist, werden die Anzahlen subtrahiert.

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

    Beigetragen von Raymond Hettinger; bpo-1696199.

    Neue Klasse: OrderedDict ist im vorherigen Abschnitt PEP 372: Hinzufügen eines geordneten Dictionaries zu collections beschrieben.

    Neue Methode: Der Datentyp deque hat jetzt eine count()-Methode, die die Anzahl der Elemente zurückgibt, die gleich dem übergebenen Argument x sind, und eine reverse()-Methode, die die Elemente der Dek in-place umkehrt. deque stellt seine maximale Länge auch als schreibgeschütztes Attribut maxlen zur Verfügung. (Beide Funktionen hinzugefügt von Raymond Hettinger.)

    Die Klasse namedtuple hat jetzt einen optionalen Parameter rename. Wenn rename wahr ist, werden Feldnamen, die ungültig sind, weil sie wiederholt wurden oder keine gültigen Python-Bezeichner sind, in gültige Namen umbenannt, die sich von der Position des Feldes in der Liste der Felder ableiten.

    >>> from collections import namedtuple
    >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True)
    >>> T._fields
    ('field1', '_1', '_2', 'field2')
    

    (Hinzugefügt von Raymond Hettinger; bpo-1818.)

    Schließlich gibt die abstrakte Basisklasse Mapping jetzt NotImplemented zurück, wenn eine Zuordnung mit einem anderen Typ verglichen wird, der keine Mapping ist. (Behoben von Daniel Stutzbach; bpo-8729.)

  • Konstruktoren für die Parsing-Klassen im Modul ConfigParser akzeptieren jetzt einen Parameter allow_no_value, der standardmäßig falsch ist; wenn er wahr ist, sind Optionen ohne Werte erlaubt. Zum Beispiel

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

    (Beigetragen von Mats Kindahl; bpo-7005.)

  • Veraltete Funktion: contextlib.nested(), die die Handhabung mehrerer Kontextmanager mit einer einzigen with-Anweisung ermöglicht, wurde veraltet, da die with-Anweisung jetzt mehrere Kontextmanager unterstützt.

  • Das Modul cookielib ignoriert jetzt Cookies, die ein ungültiges Versionsfeld haben, also eines, das keinen ganzzahligen Wert enthält. (Behoben von John J. Lee; bpo-3924.)

  • Die Funktion deepcopy() des Moduls copy kopiert jetzt korrekt gebundene Instanzmethoden. (Implementiert von Robert Collins; bpo-1515.)

  • Das Modul ctypes konvertiert jetzt immer None in einen C NULL-Zeiger für Argumente, die als Zeiger deklariert sind. (Geändert von Thomas Heller; bpo-4606.) Die zugrundeliegende libffi-Bibliothek wurde auf Version 3.0.9 aktualisiert und enthält verschiedene Korrekturen für unterschiedliche Plattformen. (Aktualisiert von Matthias Klose; bpo-8142.)

  • Neue Methode: Die Klasse timedelta des Moduls datetime hat jetzt eine total_seconds()-Methode, die die Anzahl der Sekunden in der Dauer zurückgibt. (Beigetragen von Brian Quinlan; bpo-5788.)

  • Neue Methode: Die Klasse Decimal hat jetzt eine Klassenmethode from_float(), die eine exakte Konvertierung einer Fließkommazahl in einen Decimal durchführt. Diese exakte Konvertierung strebt die nächstgelegene Dezimaldarstellung des Wertes der Fließkommadarstellung an; der resultierende Dezimalwert wird daher, falls vorhanden, immer noch die Ungenauigkeit enthalten. Zum Beispiel gibt Decimal.from_float(0.1) Decimal('0.1000000000000000055511151231257827021181583404541015625') zurück. (Implementiert von Raymond Hettinger; bpo-4796.)

    Vergleiche von Instanzen von Decimal mit Fließkommazahlen liefern jetzt sinnvolle Ergebnisse, die auf den numerischen Werten der Operanden basieren. Zuvor fielen solche Vergleiche auf Pythons Standardregeln für den Vergleich von Objekten zurück, die willkürliche Ergebnisse basierend auf ihrem Typ lieferten. Beachten Sie, dass Sie Decimal und Fließkommazahlen immer noch nicht in anderen Operationen wie der Addition kombinieren können, da Sie explizit wählen sollten, wie zwischen Float und Decimal konvertiert wird. (Behoben von Mark Dickinson; bpo-2531.)

    Der Konstruktor für Decimal akzeptiert jetzt Fließkommazahlen (hinzugefügt von Raymond Hettinger; bpo-8257) und nicht-europäische Unicode-Zeichen wie arabisch-indische Ziffern (beigetragen von Mark Dickinson; bpo-6595).

    Die meisten Methoden der Klasse Context akzeptieren jetzt ganze Zahlen sowie Instanzen von Decimal; die einzigen Ausnahmen sind die Methoden canonical() und is_canonical(). (Patch von Juan José Conti; bpo-7633.)

    Beim Verwenden von Instanzen von Decimal mit der format()-Methode eines Strings war die Standardausrichtung zuvor linksbündig. Dies wurde auf rechtsbündige Ausrichtung geändert, was für numerische Typen sinnvoller ist. (Geändert von Mark Dickinson; bpo-6857.)

    Vergleiche, die einen signalisierenden NaN-Wert (oder sNAN) beinhalten, signalisieren jetzt InvalidOperation anstatt stillschweigend einen wahren oder falschen Wert basierend auf dem Vergleichsoperator zurückzugeben. Ruhige NaN-Werte (oder NaN) sind jetzt hashbar. (Behoben von Mark Dickinson; bpo-7279.)

  • Das Modul difflib erzeugt jetzt Ausgaben, die mit modernen diff/patch-Tools besser kompatibel sind, durch eine kleine Änderung: Es wird ein Tabulatorzeichen anstelle von Leerzeichen als Trennzeichen im Header verwendet, der den Dateinamen angibt. (Behoben von Anatoly Techtonik; bpo-7585.)

  • Der sdist-Befehl von Distutils generiert jetzt immer die Datei MANIFEST neu, da selbst wenn die Dateien MANIFEST.in oder setup.py nicht geändert wurden, der Benutzer möglicherweise neue Dateien erstellt hat, die enthalten sein sollten. (Behoben von Tarek Ziadé; bpo-8688.)

  • Das Flag IGNORE_EXCEPTION_DETAIL des Moduls doctest ignoriert jetzt den Namen des Moduls, das die zu testende Ausnahme enthält. (Patch von Lennart Regebro; bpo-7490.)

  • Die Klasse Message des Moduls email akzeptiert jetzt eine Nutzlast mit Unicode-Wert und konvertiert die Nutzlast automatisch in die durch output_charset angegebene Kodierung. (Hinzugefügt von R. David Murray; bpo-1368247.)

  • Die Klasse Fraction akzeptiert jetzt ein einzelnes Float oder eine Instanz von Decimal oder zwei rationale Zahlen als Argumente für ihren Konstruktor. (Implementiert von Mark Dickinson; rationale Zahlen hinzugefügt in bpo-5812, und Float/Decimal in bpo-8294.)

    Ordnungsvergleiche (<, <=, >, >=) zwischen Brüchen und komplexen Zahlen lösen jetzt einen TypeError aus. Dies behebt ein Versehen und lässt den Fraction mit den anderen numerischen Typen übereinstimmen.

  • Neue Klasse: FTP_TLS im Modul ftplib stellt sichere FTP-Verbindungen über TLS-Kapselung von Authentifizierung sowie nachfolgenden Steuer- und Datentransfers bereit. (Beigetragen von Giampaolo Rodola; bpo-2054.)

    Die Methode storbinary() für binäre Uploads kann jetzt Uploads dank eines hinzugefügten Parameters rest wieder aufnehmen (Patch von Pablo Mouzo; bpo-6845.)

  • Neue Klassen-Dekorator: total_ordering() im Modul functools nimmt eine Klasse entgegen, die eine __eq__()-Methode und eine der Methoden __lt__(), __le__(), __gt__() oder __ge__() definiert, und generiert die fehlenden Vergleichsmethoden. Da die Methode __cmp__() in Python 3.x veraltet ist, erleichtert dieser Dekorator die Definition von geordneten Klassen. (Hinzugefügt von Raymond Hettinger; bpo-5479.)

    Neue Funktion: cmp_to_key() nimmt eine Vergleichsfunktion im alten Stil entgegen, die zwei Argumente erwartet, und gibt eine neue aufrufbare Funktion zurück, die als Parameter key für Funktionen wie sorted(), min() und max() usw. verwendet werden kann. Der primäre beabsichtigte Verwendungszweck ist die Unterstützung bei der Kompatibilität von Code mit Python 3.x. (Hinzugefügt von Raymond Hettinger.)

  • Neue Funktion: Die Funktion is_tracked() des Moduls gc gibt wahr zurück, wenn eine gegebene Instanz vom Garbage Collector verfolgt wird, andernfalls falsch. (Beigetragen von Antoine Pitrou; bpo-4688.)

  • Das Modul gzip's GzipFile unterstützt jetzt das Kontextmanagement-Protokoll, sodass Sie with gzip.GzipFile(...) as f: schreiben können (beigetragen von Hagen Fürstenau; bpo-3860), und es implementiert jetzt die ABC io.BufferedIOBase, sodass Sie es mit io.BufferedReader für schnellere Verarbeitung wrappen können (beigetragen von Nir Aides; bpo-7471). Außerdem ist es jetzt möglich, die in einer GZipped-Datei gespeicherte Änderungszeit zu überschreiben, indem ein optionaler Zeitstempel an den Konstruktor übergeben wird. (Beigetragen von Jacques Frechet; bpo-4272.)

    Dateien im Gzip-Format können mit nachgestellten Null-Bytes aufgefüllt werden; das Modul gzip wird diese nachgestellten Bytes jetzt verbrauchen. (Behoben von Tadek Pietraszek und Brian Curtin; bpo-2846.)

  • Neues Attribut: Das Modul hashlib hat jetzt ein Attribut algorithms, das ein Tupel mit den Namen der unterstützten Algorithmen enthält. In Python 2.7 enthält hashlib.algorithms ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'). (Beigetragen von Carl Chenet; bpo-7418.)

  • Die Standardklasse HTTPResponse, die vom Modul httplib verwendet wird, unterstützt jetzt Pufferung, was zu wesentlich schnellerem Lesen von HTTP-Antworten führt. (Beigetragen von Kristján Valur Jónsson; bpo-4879.)

    Die Klassen HTTPConnection und HTTPSConnection unterstützen jetzt einen Parameter source_address, ein 2-Tupel (host, port), das die Quelladresse angibt, die für die Verbindung verwendet wird. (Beigetragen von Eldon Ziegler; bpo-3972.)

  • Das Modul ihooks unterstützt jetzt relative Importe. Beachten Sie, dass ihooks ein älteres Modul zur Anpassung von Importen ist und durch das Modul imputil ersetzt wurde, das in Python 2.0 hinzugefügt wurde. (Unterstützung für relative Importe hinzugefügt von Neil Schemenauer.)

  • Das Modul imaplib unterstützt jetzt IPv6-Adressen. (Beigetragen von Derek Morr; bpo-1655.)

  • Neue Funktion: Die Funktion getcallargs() des Moduls inspect nimmt eine aufrufbare Funktion und ihre positionsgebundenen und Schlüsselwortargumente entgegen und ermittelt, welche der Parameter der aufrufbaren Funktion jedes Argument erhalten wird, und gibt ein Wörterbuch zurück, das Argumentnamen ihren Werten zuordnet. Zum Beispiel

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

    Beigetragen von George Sakkis; bpo-3135.

  • Aktualisiertes Modul: Die Bibliothek io wurde auf die Version aktualisiert, die mit Python 3.1 ausgeliefert wurde. Für 3.1 wurde die I/O-Bibliothek vollständig in C neu geschrieben und ist je nach durchgeführter Aufgabe 2- bis 20-mal schneller. Die ursprüngliche Python-Version wurde in das Modul _pyio umbenannt.

    Eine geringfügige daraus resultierende Änderung: Die Klasse io.TextIOBase hat jetzt ein Attribut errors, das die Fehlereinstellung angibt, die für Kodierungs- und Dekodierungsfehler verwendet wird (einer von 'strict', 'replace', 'ignore').

    Die Klasse io.FileIO löst jetzt eine OSError aus, wenn ein ungültiger Dateideskriptor übergeben wird. (Implementiert von Benjamin Peterson; bpo-4991.) Die Methode truncate() behält jetzt die Dateiposition bei; zuvor änderte sie die Dateiposition auf das Ende der neuen Datei. (Behoben von Pascal Chambon; bpo-6939.)

  • Neue Funktion: itertools.compress(data, selectors) nimmt zwei Iteratoren entgegen. Elemente aus data werden zurückgegeben, wenn der entsprechende Wert in selectors wahr ist.

    itertools.compress('ABCDEF', [1,0,1,0,1,1]) =>
      A, C, E, F
    

    Neue Funktion: itertools.combinations_with_replacement(iter, r) gibt alle möglichen Kombinationen der Länge r aus dem Iterable iter zurück. Im Gegensatz zu combinations() können einzelne Elemente in den generierten Kombinationen wiederholt werden.

    itertools.combinations_with_replacement('abc', 2) =>
      ('a', 'a'), ('a', 'b'), ('a', 'c'),
      ('b', 'b'), ('b', 'c'), ('c', 'c')
    

    Beachten Sie, dass Elemente als einzigartig behandelt werden, abhängig von ihrer Position in der Eingabe, nicht von ihren tatsächlichen Werten.

    Die Funktion itertools.count() hat jetzt ein Argument step, das das Inkrementieren mit anderen Werten als 1 ermöglicht. count() erlaubt jetzt auch Schlüsselwortargumente und die Verwendung von Nicht-Ganzzahlwerten wie Floats oder Instanzen von Decimal. (Implementiert von Raymond Hettinger; bpo-5032.)

    itertools.combinations() und itertools.product() lösten zuvor ValueError für Werte von r größer als das Eingabe-Iterable aus. Dies wurde als Spezifikationsfehler angesehen, daher geben sie jetzt ein leeres Iterator zurück. (Behoben von Raymond Hettinger; bpo-4816.)

  • Aktualisiertes Modul: Das Modul json wurde auf Version 2.0.9 des simplejson-Pakets aktualisiert, das eine C-Erweiterung enthält, die die Kodierung und Dekodierung beschleunigt. (Beigetragen von Bob Ippolito; bpo-4136.)

    Zur Unterstützung des neuen Typs collections.OrderedDict hat json.load() jetzt einen optionalen Parameter object_pairs_hook, der mit jedem Objekt-Literal aufgerufen wird, das in eine Liste von Paaren dekodiert wird. (Beigetragen von Raymond Hettinger; bpo-5381.)

  • Die Klasse Maildir des Moduls mailbox zeichnet jetzt den Zeitstempel der Verzeichnisse auf, die es liest, und liest sie nur neu, wenn sich die Änderungszeit seitdem geändert hat. Dies verbessert die Leistung, indem unnötige Verzeichnisscans vermieden werden. (Behoben von A.M. Kuchling und Antoine Pitrou; bpo-1607951, bpo-6896.)

  • Neue Funktionen: Das Modul math hat erf() und erfc() für die Fehlerfunktion und die komplementäre Fehlerfunktion erhalten, expm1(), das e**x - 1 mit höherer Genauigkeit berechnet als mit exp() und 1 subtrahiert, gamma() für die Gamma-Funktion und lgamma() für den natürlichen Logarithmus der Gamma-Funktion. (Beigetragen von Mark Dickinson und nirinA raseliarison; bpo-3366.)

  • Die Klassen Manager* des Moduls multiprocessing können jetzt eine aufrufbare Funktion übergeben bekommen, die jedes Mal aufgerufen wird, wenn ein Unterprozess gestartet wird, zusammen mit einer Reihe von Argumenten, die an die aufrufbare Funktion übergeben werden. (Beigetragen von lekma; bpo-5585.)

    Die Klasse Pool, die einen Pool von Worker-Prozessen steuert, hat jetzt einen optionalen Parameter maxtasksperchild. Worker-Prozesse führen die angegebene Anzahl von Aufgaben aus und beenden sich dann, wodurch der Pool einen neuen Worker startet. Dies ist nützlich, wenn Aufgaben Arbeitsspeicher oder andere Ressourcen lecken könnten, oder wenn einige Aufgaben den Worker sehr groß werden lassen. (Beigetragen von Charles Cazabon; bpo-6963.)

  • Das Modul nntplib unterstützt jetzt IPv6-Adressen. (Beigetragen von Derek Morr; bpo-1664.)

  • Neue Funktionen: Das Modul os umschließt die folgenden POSIX-Systemaufrufe: getresgid() und getresuid(), die die realen, effektiven und gespeicherten GIDs und UIDs zurückgeben; setresgid() und setresuid(), die die realen, effektiven und gespeicherten GIDs und UIDs auf neue Werte setzen; initgroups(), das die Gruppen-Zugriffsliste für den aktuellen Prozess initialisiert. (GID/UID-Funktionen beigetragen von Travis H.; bpo-6508. Unterstützung für initgroups hinzugefügt von Jean-Paul Calderone; bpo-7333.)

    Die Funktion os.fork() initialisiert jetzt die Import-Sperre im Kindprozess neu. Dies behebt Probleme unter Solaris, wenn fork() von einem Thread aufgerufen wird. (Behoben von Zsolt Cserna; bpo-7242.)

  • Im Modul os.path behalten die Funktionen normpath() und abspath() jetzt Unicode bei; wenn ihr Eingabepfad eine Unicode-Zeichenkette ist, ist der Rückgabewert ebenfalls eine Unicode-Zeichenkette. (normpath() von Matt Giuca in bpo-5827 behoben; abspath() von Ezio Melotti in bpo-3426 behoben.)

  • Das Modul pydoc bietet jetzt Hilfe für die verschiedenen Symbole, die Python verwendet. Sie können jetzt z.B. help('<<') oder help('@') aufrufen. (Beigetragen von David Laban; bpo-4739.)

  • Die Funktionen split(), sub() und subn() des Moduls re akzeptieren nun ein optionales Argument flags, um die Konsistenz mit den anderen Funktionen des Moduls zu gewährleisten. (Hinzugefügt von Gregory P. Smith.)

  • Neue Funktion: run_path() im Modul runpy führt den Code unter einem bereitgestellten Pfad-Argument aus. Pfad kann der Pfad einer Python-Quelldatei (example.py), einer kompilierten Bytecode-Datei (example.pyc), eines Verzeichnisses (./package/) oder eines Zip-Archivs (example.zip) sein. Wenn ein Verzeichnis- oder Zip-Pfad angegeben wird, wird dieser am Anfang von sys.path hinzugefügt und das Modul __main__ importiert. Es wird erwartet, dass das Verzeichnis oder Zip-Archiv eine __main__.py enthält; wenn nicht, könnte eine andere __main__.py von einer späteren Position in sys.path importiert werden. Dies macht einen größeren Teil der Maschinerie von runpy für Skripte verfügbar, die die Art und Weise nachahmen möchten, wie die Python-Kommandozeile einen expliziten Pfadnamen verarbeitet. (Hinzugefügt von Nick Coghlan; bpo-6816.)

  • Neue Funktion: Im Modul shutil nimmt make_archive() einen Dateinamen, einen Archivtyp (zip oder tar-Format) und einen Verzeichnispfad entgegen und erstellt ein Archiv, das die Inhalte des Verzeichnisses enthält. (Hinzugefügt von Tarek Ziadé.)

    Die Funktionen copyfile() und copytree() von shutil lösen nun eine Ausnahme SpecialFileError aus, wenn versucht wird, eine benannte Pipe zu kopieren. Zuvor wurde mit benannten Pipes wie reguläre Dateien verfahren, indem sie zum Lesen geöffnet wurden, was zu einem unendlichen Blockieren führte. (Behoben von Antoine Pitrou; bpo-3002.)

  • Das Modul signal installiert den Signal-Handler nicht mehr neu, es sei denn, dies ist wirklich notwendig, was einen Fehler behebt, der das robuste Abfangen des EINTR-Signals unmöglich machen konnte. (Behoben von Charles-Francois Natali; bpo-8354.)

  • Neue Funktionen: Im Modul site geben drei neue Funktionen verschiedene standort- und benutzerspezifische Pfade zurück. getsitepackages() gibt eine Liste aller globalen site-packages-Verzeichnisse zurück, getusersitepackages() gibt den Pfad des site-packages-Verzeichnisses des Benutzers zurück, und getuserbase() gibt den Wert der Umgebungsvariablen USER_BASE zurück und liefert den Pfad zu einem Verzeichnis, das zur Speicherung von Daten verwendet werden kann. (Beigetragen von Tarek Ziadé; bpo-6693.)

    Das Modul site meldet nun Ausnahmen, die beim Import des Moduls sitecustomize auftreten, und fängt die Ausnahme KeyboardInterrupt nicht mehr ab und verschluckt sie. (Behoben von Victor Stinner; bpo-3137.)

  • Die Funktion create_connection() hat einen Parameter source_address erhalten, ein 2-Tupel (host, port), das die Quelladresse für die Verbindung angibt. (Beigetragen von Eldon Ziegler; bpo-3972.)

    Die Methoden recv_into() und recvfrom_into() schreiben nun in Objekte, die die Puffer-API unterstützen, am nützlichsten die Objekte bytearray und memoryview. (Implementiert von Antoine Pitrou; bpo-8104.)

  • Die Klasse TCPServer des Moduls SocketServer unterstützt nun Socket-Timeouts und das Deaktivieren des Nagle-Algorithmus. Das Klassenattribut disable_nagle_algorithm hat den Standardwert False; wenn es auf true überschrieben wird, erhalten neue Anforderungsverbindungen die Option TCP_NODELAY, um das Puffern vieler kleiner Sends in ein einziges TCP-Paket zu verhindern. Das Klassenattribut timeout kann ein Timeout in Sekunden enthalten, das auf den Anforderungssocket angewendet wird; wenn innerhalb dieser Zeit keine Anforderung empfangen wird, wird handle_timeout() aufgerufen und handle_request() kehrt zurück. (Beigetragen von Kristján Valur Jónsson; bpo-6192 und bpo-6267.)

  • Aktualisiertes Modul: Das Modul sqlite3 wurde auf Version 2.6.0 des Pakets pysqlite aktualisiert. Version 2.6.0 enthält eine Reihe von Fehlerbehebungen und ermöglicht das Laden von SQLite-Erweiterungen aus Shared Libraries. Rufen Sie die Methode enable_load_extension(True) auf, um Erweiterungen zu aktivieren, und rufen Sie dann load_extension() auf, um eine bestimmte Shared Library zu laden. (Aktualisiert von Gerhard Häring.)

  • Die Objekte SSLSocket des Moduls ssl unterstützen nun die Puffer-API, was zu einem Fehler in der Testsuite führte (behoben von Antoine Pitrou; bpo-7133) und automatisch den Wert von OpenSSLs SSL_MODE_AUTO_RETRY setzt, was verhindert, dass ein Fehlercode von recv()-Operationen zurückgegeben wird, die eine SSL-Neuaushandlung auslösen (behoben von Antoine Pitrou; bpo-8222).

    Die Konstruktorfunktion wrap_socket() nimmt nun ein Argument ciphers entgegen, das eine Zeichenkette ist, die die erlaubten Verschlüsselungsalgorithmen auflistet; das Format der Zeichenkette wird in der OpenSSL-Dokumentation beschrieben. (Hinzugefügt von Antoine Pitrou; bpo-8322.)

    Eine weitere Änderung bewirkt, dass die Erweiterung alle Cipher- und Digest-Algorithmen von OpenSSL lädt, sodass sie alle verfügbar sind. Einige SSL-Zertifikate konnten nicht verifiziert werden und meldeten den Fehler "unbekannter Algorithmus". (Gemeldet von Beda Kosata und behoben von Antoine Pitrou; bpo-8484.)

    Die verwendete OpenSSL-Version ist nun als Modulattribute ssl.OPENSSL_VERSION (eine Zeichenkette), ssl.OPENSSL_VERSION_INFO (ein 5-Tupel) und ssl.OPENSSL_VERSION_NUMBER (eine Ganzzahl) verfügbar. (Hinzugefügt von Antoine Pitrou; bpo-8321.)

  • Das Modul struct ignoriert nun keine Überlauffehler mehr schweigend, wenn ein Wert zu groß für einen bestimmten Integer-Formatcode ist (einer von bBhHiIlLqQ); es löst jetzt immer eine Ausnahme struct.error aus. (Geändert von Mark Dickinson; bpo-1523.) Die Funktion pack() versucht auch, __index__() zu verwenden, um Nicht-Integer zu konvertieren und zu packen, bevor sie die Methode __int__() versucht oder einen Fehler meldet. (Geändert von Mark Dickinson; bpo-8300.)

  • Neue Funktion: Die Funktion check_output() des Moduls subprocess führt einen Befehl mit einem angegebenen Satz von Argumenten aus und gibt die Ausgabe des Befehls als Zeichenkette zurück, wenn der Befehl ohne Fehler ausgeführt wird, oder löst andernfalls eine Ausnahme CalledProcessError aus.

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

    (Beigetragen von Gregory P. Smith.)

    Das Modul subprocess versucht nun, seine internen Systemaufrufe nach Empfang eines Signals EINTR erneut auszuführen. (Gemeldet von mehreren Personen; endgültiger Patch von Gregory P. Smith in bpo-1068268.)

  • Neue Funktion: is_declared_global() im Modul symtable gibt true für Variablen zurück, die explizit als global deklariert sind, und false für solche, die implizit global sind. (Beigetragen von Jeremy Hylton.)

  • Das Modul syslog verwendet nun den Wert von sys.argv[0] als Identifikator anstelle des vorherigen Standardwerts 'python'. (Geändert von Sean Reifschneider; bpo-8451.)

  • Der Wert von sys.version_info ist nun ein benanntes Tupel mit den Attributen major, minor, micro, releaselevel und serial. (Beigetragen von Ross Light; bpo-4285.)

    sys.getwindowsversion() gibt ebenfalls ein benanntes Tupel zurück, mit den Attributen major, minor, build, platform, service_pack, service_pack_major, service_pack_minor, suite_mask und product_type. (Beigetragen von Brian Curtin; bpo-7766.)

  • Die Standard-Fehlerbehandlung des Moduls tarfile hat sich geändert und unterdrückt keine schwerwiegenden Fehler mehr. Die Standard-Fehlerschwelle war zuvor 0, was bedeutete, dass Fehler nur zu einer Meldung im Debug-Log führten, aber da das Debug-Log standardmäßig nicht aktiviert ist, bleiben diese Fehler unbemerkt. Die Standard-Fehlerschwelle ist nun 1, was eine Ausnahme auslöst, wenn ein Fehler auftritt. (Geändert von Lars Gustäbel; bpo-7357.)

    tarfile unterstützt nun das Filtern der TarInfo-Objekte, die zu einer Tar-Datei hinzugefügt werden. Wenn Sie add() aufrufen, können Sie ein optionales Argument filter angeben, das ein aufrufbares Objekt ist. Das aufrufbare Objekt filter erhält die TarInfo für jede hinzuzufügende Datei und kann diese modifizieren und zurückgeben. Wenn das aufrufbare Objekt None zurückgibt, wird die Datei aus dem resultierenden Archiv ausgeschlossen. Dies ist leistungsfähiger als das vorhandene Argument exclude, das daher als veraltet markiert wurde. (Hinzugefügt von Lars Gustäbel; bpo-6856.) Die Klasse TarFile unterstützt nun auch das Kontextmanagement-Protokoll. (Hinzugefügt von Lars Gustäbel; bpo-7232.)

  • Die Methode wait() der Klasse threading.Event gibt nun bei Beendigung das interne Flag zurück. Das bedeutet, dass die Methode normalerweise true zurückgibt, da wait() blockieren soll, bis das interne Flag true wird. Der Rückgabewert ist nur dann false, wenn ein Timeout angegeben wurde und die Operation mit einem Timeout beendet wurde. (Beigetragen von Tim Lesher; bpo-1674032.)

  • Die Unicode-Datenbank, die vom Modul unicodedata bereitgestellt wird, wird nun intern verwendet, um zu bestimmen, welche Zeichen numerisch sind, Leerzeichen sind oder Zeilenumbrüche darstellen. Die Datenbank enthält auch Informationen aus der Datendatei Unihan.txt (Patch von Anders Chrigström und Amaury Forgeot d’Arc; bpo-1571184) und wurde auf Version 5.2.0 aktualisiert (aktualisiert von Florent Xicluna; bpo-8024).

  • Die Funktion urlsplit() des Moduls urlparse behandelt nun unbekannte URL-Schemata konform mit RFC 3986: Wenn die URL die Form "<something>://..." hat, wird der Text vor dem :// als Schema behandelt, auch wenn es sich um ein erfundenes Schema handelt, das das Modul nicht kennt. Diese Änderung kann Code brechen, der mit dem alten Verhalten umgangen wurde. Zum Beispiel gibt Python 2.6.4 oder 2.5 folgendes zurück

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', '', '//host/filename?query', '', '')
    

    Python 2.7 (und Python 2.6.5) gibt folgendes zurück

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', 'host', '/filename?query', '', '')
    

    (Python 2.7 gibt tatsächlich leicht abweichende Ausgaben, da es ein benanntes Tupel anstelle eines Standard-Tupels zurückgibt.)

    Das Modul urlparse unterstützt auch IPv6-Literaladressen gemäß RFC 2732 (beigetragen von 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='')
    
  • Neue Klasse: Die Klasse WeakSet im Modul weakref ist eine Menge, die nur schwache Referenzen auf ihre Elemente hält; Elemente werden entfernt, sobald keine Referenzen mehr darauf zeigen. (Ursprünglich in Python 3.x von Raymond Hettinger implementiert und nach 2.7 von Michael Foord portiert.)

  • Die Bibliothek xml.etree.ElementTree maskiert nun keine Ampertsanden und Winkelklammern mehr beim Ausgeben von XML-Verarbeitungsinstruktionen (wie z.B. <?xml-stylesheet href="#style1"?>) oder Kommentaren (wie z.B. <!-- comment -->). (Patch von Neil Muller; bpo-2746.)

  • Der XML-RPC-Client und -Server, bereitgestellt durch die Module xmlrpclib und SimpleXMLRPCServer, haben die Leistung verbessert, indem sie HTTP/1.1 Keep-Alive unterstützen und optional Gzip-Kodierung zur Komprimierung des ausgetauschten XMLs verwenden. Die Gzip-Komprimierung wird durch das Attribut encode_threshold von SimpleXMLRPCRequestHandler gesteuert, das eine Größe in Bytes enthält; Antworten, die größer sind als dieser Wert, werden komprimiert. (Beigetragen von Kristján Valur Jónsson; bpo-6267.)

  • Die Klasse ZipFile des Moduls zipfile unterstützt nun das Kontextmanagement-Protokoll, sodass Sie with zipfile.ZipFile(...) as f: schreiben können. (Beigetragen von Brian Curtin; bpo-5511.)

    zipfile unterstützt nun auch das Archivieren leerer Verzeichnisse und extrahiert diese korrekt. (Behoben von Kuba Wieczorek; bpo-4710.) Das Lesen von Dateien aus einem Archiv ist schneller, und das Verschachteln von read() und readline() funktioniert nun korrekt. (Beigetragen von Nir Aides; bpo-7610.)

    Die Funktion is_zipfile() akzeptiert nun ein Dateiobjekt zusätzlich zu den Pfadnamen, die in früheren Versionen akzeptiert wurden. (Beigetragen von Gabriel Genellina; bpo-4756.)

    Die Methode writestr() hat nun einen optionalen Parameter compress_type, mit dem Sie die Standardkompressionsmethode überschreiben können, die im Konstruktor von ZipFile angegeben wurde. (Beigetragen von Ronald Oussoren; bpo-6003.)

Neues Modul: importlib

Python 3.1 enthält das Paket importlib, eine Neuimplementierung der Logik, die der import-Anweisung von Python zugrunde liegt. importlib ist nützlich für die Implementierer von Python-Interpretern und für Benutzer, die neue Importer schreiben möchten, die am Importprozess teilnehmen können. Python 2.7 enthält nicht das vollständige Paket importlib, sondern nur einen kleinen Teil davon, der eine einzige Funktion enthält: import_module().

import_module(name, package=None) importiert ein Modul. name ist eine Zeichenkette, die den Namen des Moduls oder Pakets enthält. Es ist möglich, relative Importe durchzuführen, indem eine Zeichenkette angegeben wird, die mit einem . beginnt, z.B. ..utils.errors. Für relative Importe muss das Argument package angegeben werden und ist der Name des Pakets, das als Anker für den relativen Import verwendet wird. import_module() fügt das importierte Modul sowohl in sys.modules ein als auch zurückgeben das Modulobjekt.

Hier sind einige Beispiele

>>> 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 wurde von Brett Cannon implementiert und in Python 3.1 eingeführt.

Neues Modul: sysconfig

Das Modul sysconfig wurde aus dem Distutils-Paket herausgelöst und ist nun ein eigenständiges Top-Level-Modul. sysconfig bietet Funktionen zum Abrufen von Informationen über den Build-Prozess von Python: Compiler-Switches, Installationspfade, den Plattformnamen und ob Python aus seinem Quellverzeichnis ausgeführt wird.

Einige der Funktionen im Modul sind

  • get_config_var() gibt Variablen aus Pythons Makefile und der Datei pyconfig.h zurück.

  • get_config_vars() gibt ein Wörterbuch zurück, das alle Konfigurationsvariablen enthält.

  • get_path() gibt den konfigurierten Pfad für einen bestimmten Modultyp zurück: die Standardbibliothek, standortspezifische Module, plattformspezifische Module usw.

  • is_python_build() gibt true zurück, wenn Sie eine Binärdatei aus einem Python-Quellverzeichnis ausführen, und andernfalls false.

Schlagen Sie in der Dokumentation von sysconfig für weitere Details und eine vollständige Liste der Funktionen nach.

Das Distutils-Paket und sysconfig werden jetzt von Tarek Ziadé gepflegt, der auch ein Distutils2-Paket (Quell-Repository unter https://hg.python.org/distutils2/) zur Entwicklung einer Next-Generation-Version von Distutils gestartet hat.

ttk: Themed Widgets for Tk

Tcl/Tk 8.5 enthält eine Reihe von thematisierten Widgets, die grundlegende Tk-Widgets neu implementieren, aber ein anpassbareres Aussehen haben und daher den Widgets der nativen Plattform genauer ähneln können. Diese Widget-Sammlung hieß ursprünglich Tile, wurde aber in Ttk (für „themed Tk“) umbenannt, als sie in die Tcl/Tck-Version 8.5 aufgenommen wurde.

Um mehr zu erfahren, lesen Sie die Dokumentation des Moduls ttk. Sie können auch die Tcl/Tk-Handbuchseite lesen, die die Ttk-Theme-Engine beschreibt und unter https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html verfügbar ist. Einige Screenshots des Python/Ttk-Codes in Aktion finden Sie unter https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki.

Das Modul tkinter.ttk wurde von Guilherme Polo geschrieben und in bpo-2983 hinzugefügt. Eine alternative Version namens Tile.py, geschrieben von Martin Franklin und gepflegt von Kevin Walzer, wurde zur Aufnahme in bpo-2618 vorgeschlagen, aber die Autoren argumentierten, dass Guilherme Polos Arbeit umfassender war.

Aktualisiertes Modul: unittest

Das Modul unittest wurde erheblich erweitert; viele neue Funktionen wurden hinzugefügt. Die meisten dieser Funktionen wurden von Michael Foord implementiert, sofern nicht anders angegeben. Die erweiterte Version des Moduls ist separat für die Verwendung mit Python-Versionen 2.4 bis 2.6 herunterladbar, verpackt als Paket unittest2, von unittest2.

Wenn es von der Kommandozeile aus verwendet wird, kann das Modul Tests automatisch erkennen. Es ist nicht so schick wie py.test oder nose, bietet aber eine einfache Möglichkeit, Tests auszuführen, die in einer Reihe von Paketverzeichnissen gespeichert sind. Der folgende Befehl sucht beispielsweise im Unterverzeichnis test/ nach allen importierbaren Testdateien mit dem Namen test*.py

python -m unittest discover -s test

Konsultieren Sie die Dokumentation des Moduls unittest für weitere Details. (Entwickelt in bpo-6001.)

Die Funktion main() unterstützt einige weitere neue Optionen

  • -b oder --buffer puffert die Standardausgabe und die Standardfehlerausgabe während jedes Tests. Wenn der Test erfolgreich ist, werden alle resultierenden Ausgaben verworfen; bei einem Fehler wird die gepufferte Ausgabe angezeigt.

  • -c oder --catch bewirkt, dass der Control-C-Interrupt gnädiger behandelt wird. Anstatt den Testprozess sofort zu unterbrechen, wird der gerade laufende Test abgeschlossen und dann werden die bis zur Unterbrechung gesammelten Teilergebnisse gemeldet. Wenn Sie ungeduldig sind, bewirkt ein zweites Drücken von Control-C eine sofortige Unterbrechung.

    Dieser Control-C-Handler versucht, Probleme zu vermeiden, wenn der zu testende Code oder die auszuführenden Tests einen eigenen Signal-Handler definiert haben, indem er feststellt, dass bereits ein Signal-Handler gesetzt wurde und diesen aufruft. Wenn dies für Sie nicht funktioniert, gibt es einen Decorator removeHandler(), der verwendet werden kann, um Tests zu markieren, bei denen die Control-C-Handhabung deaktiviert werden soll.

  • -f oder --failfast bewirkt, dass die Testausführung sofort stoppt, wenn ein Test fehlschlägt, anstatt weitere Tests auszuführen. (Vorgeschlagen von Cliff Dyer und implementiert von Michael Foord; bpo-8074.)

Die Fortschrittsmeldungen zeigen jetzt „x“ für erwartete Fehler und „u“ für unerwartete Erfolge im ausführlichen Modus an. (Beigetragen von Benjamin Peterson.)

Testfälle können die Ausnahme SkipTest auslösen, um einen Test zu überspringen (bpo-1034053).

Die Fehlermeldungen für Fehler bei assertEqual(), assertTrue() und assertFalse() liefern jetzt mehr Informationen. Wenn Sie das Attribut longMessage Ihrer TestCase-Klassen auf true setzen, werden bei Fehlern sowohl die standardmäßige Fehlermeldung als auch jede zusätzliche von Ihnen bereitgestellte Meldung ausgegeben. (Hinzugefügt von Michael Foord; bpo-5663.)

Die Methode assertRaises() gibt jetzt einen Kontext-Handler zurück, wenn sie ohne Angabe eines aufzurufenden aufrufbaren Objekts aufgerufen wird. Sie können zum Beispiel dies schreiben

with self.assertRaises(KeyError):
    {}['foo']

(Implementiert von Antoine Pitrou; bpo-4444.)

Setup- und Teardown-Fixtures auf Modul- und Klassenebene werden jetzt unterstützt. Module können die Funktionen setUpModule() und tearDownModule() enthalten. Klassen können die Methoden setUpClass() und tearDownClass() haben, die als Klassenmethoden (mit @classmethod oder Äquivalent) definiert sein müssen. Diese Funktionen und Methoden werden aufgerufen, wenn der Testrunner zu einem Testfall in einem anderen Modul oder einer anderen Klasse wechselt.

Die Methoden addCleanup() und doCleanups() wurden hinzugefügt. addCleanup() ermöglicht das Hinzufügen von Aufräumfunktionen, die bedingungslos aufgerufen werden (nach setUp(), wenn setUp() fehlschlägt, andernfalls nach tearDown()). Dies ermöglicht eine wesentlich einfachere Ressourcenallokation und -freigabe während der Tests (bpo-5679).

Eine Reihe neuer Methoden wurde hinzugefügt, die spezialisiertere Tests bieten. Viele dieser Methoden wurden von Google-Ingenieuren für die Verwendung in ihren Testsuiten geschrieben; Gregory P. Smith, Michael Foord und GvR arbeiteten an deren Zusammenführung in die Python-Version von unittest.

  • assertIsNone() und assertIsNotNone() nehmen einen Ausdruck und überprüfen, ob das Ergebnis None ist oder nicht.

  • assertIs() und assertIsNot() nehmen zwei Werte und prüfen, ob die beiden Werte zum selben Objekt ausgewertet werden oder nicht. (Hinzugefügt von Michael Foord; bpo-2578.)

  • assertIsInstance() und assertNotIsInstance() prüfen, ob das Ergebnisobjekt eine Instanz einer bestimmten Klasse oder einer von einer Tupel von Klassen ist. (Hinzugefügt von Georg Brandl; bpo-7031.)

  • assertGreater(), assertGreaterEqual(), assertLess() und assertLessEqual() vergleichen zwei Größen.

  • assertMultiLineEqual() vergleicht zwei Strings und gibt bei Ungleichheit einen hilfreichen Vergleich aus, der die Unterschiede zwischen den beiden Strings hervorhebt. Dieser Vergleich wird jetzt standardmäßig verwendet, wenn Unicode-Strings mit assertEqual() verglichen werden.

  • assertRegexpMatches() und assertNotRegexpMatches() prüfen, ob das erste Argument ein String ist, der mit dem als zweites Argument angegebenen regulären Ausdruck übereinstimmt oder nicht übereinstimmt (bpo-8038).

  • assertRaisesRegexp() prüft, ob eine bestimmte Ausnahme ausgelöst wird, und prüft dann zusätzlich, ob die String-Darstellung der Ausnahme mit dem angegebenen regulären Ausdruck übereinstimmt.

  • assertIn() und assertNotIn() testen, ob first in second ist oder nicht.

  • assertItemsEqual() testet, ob zwei gegebene Sequenzen dieselben Elemente enthalten.

  • assertSetEqual() vergleicht, ob zwei Mengen gleich sind, und meldet im Fehlerfall nur die Unterschiede zwischen den Mengen.

  • Ebenso vergleichen assertListEqual() und assertTupleEqual() die angegebenen Typen und erklären Unterschiede, ohne notwendigerweise ihre vollständigen Werte anzuzeigen; diese Methoden werden jetzt standardmäßig beim Vergleichen von Listen und Tupeln mit assertEqual() verwendet. Allgemeiner vergleicht assertSequenceEqual() zwei Sequenzen und kann optional prüfen, ob beide Sequenzen von einem bestimmten Typ sind.

  • assertDictEqual() vergleicht zwei Dictionaries und meldet die Unterschiede; sie wird jetzt standardmäßig verwendet, wenn Sie zwei Dictionaries mit assertEqual() vergleichen. assertDictContainsSubset() prüft, ob alle Schlüssel/Wert-Paare in first in second enthalten sind.

  • assertAlmostEqual() und assertNotAlmostEqual() testen, ob first und second ungefähr gleich sind. Diese Methode kann entweder ihre Differenz auf eine optional angegebene Anzahl von Stellen (standardmäßig 7) runden und mit Null vergleichen oder verlangen, dass die Differenz kleiner als ein bereitgestellter Delta-Wert ist.

  • loadTestsFromName() berücksichtigt ordnungsgemäß das Attribut suiteClass des TestLoader. (Behoben von Mark Roddy; bpo-6866.)

  • Ein neuer Hook ermöglicht die Erweiterung der Methode assertEqual() zur Handhabung neuer Datentypen. Die Methode addTypeEqualityFunc() nimmt ein Typobjekt und eine Funktion entgegen. Die Funktion wird verwendet, wenn beide verglichenen Objekte vom angegebenen Typ sind. Diese Funktion sollte die beiden Objekte vergleichen und eine Ausnahme auslösen, wenn sie nicht übereinstimmen; es ist ratsam, dass die Funktion zusätzliche Informationen darüber liefert, warum die beiden Objekte nicht übereinstimmen, ähnlich wie die neuen Sequenzvergleichsmethoden.

unittest.main() nimmt jetzt ein optionales Argument exit entgegen. Wenn es false ist, ruft main() nicht sys.exit() auf, was main() ermöglicht, vom interaktiven Interpreter aus verwendet zu werden. (Beigetragen von J. Pablo Fernández; bpo-3379.)

TestResult hat neue Methoden startTestRun() und stopTestRun(), die unmittelbar vor und nach einem Testlauf aufgerufen werden. (Beigetragen von Robert Collins; bpo-5728.)

Mit all diesen Änderungen wurde unittest.py unhandlich groß, so dass das Modul in ein Paket umgewandelt und der Code in mehrere Dateien aufgeteilt wurde (von Benjamin Peterson). Dies hat keinen Einfluss darauf, wie das Modul importiert oder verwendet wird.

Siehe auch

https://web.archive.org/web/20210619163128/http://www.voidspace.org.uk/python/articles/unittest2.shtml

Beschreibt die neuen Funktionen, deren Verwendung und die Begründung für verschiedene Designentscheidungen. (Von Michael Foord.)

Aktualisiertes Modul: ElementTree 1.3

Die im Lieferumfang von Python enthaltene ElementTree-Bibliothek wurde auf Version 1.3 aktualisiert. Einige der neuen Funktionen sind

  • Die verschiedenen Parsing-Funktionen nehmen jetzt ein Schlüsselwortargument parser entgegen, das eine Instanz von XMLParser enthält, die verwendet wird. Dies ermöglicht die Überschreibung der internen Codierung der Datei

    p = ET.XMLParser(encoding='utf-8')
    t = ET.XML("""<root/>""", parser=p)
    

    Fehler beim Parsen von XML lösen jetzt eine Ausnahme vom Typ ParseError aus, deren Instanzen ein Attribut position mit einem Tupel (line, column) enthalten, das den Speicherort des Problems angibt.

  • Der Code von ElementTree zur Konvertierung von Bäumen in einen String wurde erheblich überarbeitet, wodurch er in vielen Fällen etwa doppelt so schnell ist. Die Methoden ElementTree.write() und Element.write() haben jetzt einen Parameter method, der „xml“ (Standard), „html“ oder „text“ sein kann. Der HTML-Modus gibt leere Elemente als <empty></empty> anstelle von <empty/> aus, und der Textmodus überspringt Elemente und gibt nur die Textfragmente aus. Wenn Sie das Attribut tag eines Elements auf None setzen, aber seine Kinder beibehalten, wird das Element beim Schreiben des Baumes weggelassen, sodass Sie keine umfangreicheren Umbauten vornehmen müssen, um ein einzelnes Element zu entfernen.

    Die Namespace-Handhabung wurde ebenfalls verbessert. Alle xmlns:<was-auch-immer>-Deklarationen werden jetzt auf dem Wurzelelement ausgegeben und nicht im gesamten resultierenden XML verstreut. Sie können den Standard-Namespace für einen Baum festlegen, indem Sie das Attribut default_namespace setzen, und neue Präfixe mit register_namespace() registrieren. Im XML-Modus können Sie den booleschen Parameter xml_declaration (true/false) verwenden, um die XML-Deklaration zu unterdrücken.

  • Neue Methode für Element: extend() hängt die Elemente aus einer Sequenz an die Kinder des Elements an. Elemente selbst verhalten sich wie Sequenzen, daher ist es einfach, Kinder von einem Element zum anderen zu verschieben

    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)
    
    # Outputs <root><item>1</item>...</root>
    print ET.tostring(new)
    
  • Neue Methode für Element: iter() gibt die Kinder des Elements als Generator zurück. Es ist auch möglich, for child in elem: zu schreiben, um über die Kinder eines Elements zu iterieren. Die bestehende Methode getiterator() ist jetzt veraltet, ebenso wie getchildren(), die eine Liste von Kindern konstruiert und zurückgibt.

  • Neue Methode für Element: itertext() gibt alle Textfragmente zurück, die Nachfahren des Elements sind. Zum Beispiel

    t = ET.XML("""<list>
      <item>1</item> <item>2</item>  <item>3</item>
    </list>""")
    
    # Outputs ['\n  ', '1', ' ', '2', '  ', '3', '\n']
    print list(t.itertext())
    
  • Veraltet: die Verwendung eines Elements als boolescher Wert (d. h. if elem:) gab true zurück, wenn das Element Kinder hatte, oder false, wenn es keine Kinder hatte. Dieses Verhalten ist verwirrend – ist None false, aber ein kindloses Element auch? – es wird jetzt eine FutureWarning auslösen. In Ihrem Code sollten Sie explizit sein: schreiben Sie len(elem) != 0, wenn Sie an der Anzahl der Kinder interessiert sind, oder elem is not None.

Fredrik Lundh entwickelt ElementTree und produzierte die Version 1.3; Sie können seinen Artikel über 1.3 unter https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm lesen. Florent Xicluna aktualisierte die im Lieferumfang von Python enthaltene Version nach Diskussionen auf python-dev und in bpo-6472.)

Build- und C-API-Änderungen

Änderungen am Build-Prozess von Python und an der C-API umfassen

  • Die neueste Version des GNU Debuggers, GDB 7, kann mit Python geskriptet werden. Wenn Sie mit dem Debuggen eines ausführbaren Programms P beginnen, sucht GDB nach einer Datei namens P-gdb.py und liest sie automatisch ein. Dave Malcolm trug ein python-gdb.py bei, das eine Reihe von Befehlen hinzufügt, die beim Debuggen von Python selbst nützlich sind. Zum Beispiel navigieren py-up und py-down eine Python-Stack-Ebene nach oben oder unten, was normalerweise mehreren C-Stack-Ebenen entspricht. py-print gibt den Wert einer Python-Variablen aus, und py-bt gibt den Python-Stack-Trace aus. (Hinzugefügt als Ergebnis von bpo-8032.)

  • Wenn Sie die mit Python bereitgestellte Datei .gdbinit verwenden, funktioniert das „pyo“-Makro in der Version 2.7 jetzt korrekt, wenn der debuggte Thread den GIL nicht hält; das Makro erwirbt ihn jetzt vor dem Drucken. (Beigetragen von Victor Stinner; bpo-3632.)

  • Py_AddPendingCall() ist jetzt threadsicher, was es jedem Worker-Thread ermöglicht, Benachrichtigungen an den Haupt-Python-Thread zu übermitteln. Dies ist besonders nützlich für asynchrone E/A-Operationen. (Beigetragen von Kristján Valur Jónsson; bpo-4293.)

  • Neue Funktion: PyCode_NewEmpty() erstellt ein leeres Code-Objekt; nur der Dateiname, der Funktionsname und die erste Zeilennummer sind erforderlich. Dies ist nützlich für Erweiterungsmodule, die versuchen, einen aussagekräftigeren Traceback-Stack zu konstruieren. Zuvor mussten solche Erweiterungen PyCode_New() aufrufen, was viele weitere Argumente hatte. (Hinzugefügt von Jeffrey Yasskin.)

  • Neue Funktion: PyErr_NewExceptionWithDoc() erstellt eine neue Ausnahmeklasse, genau wie die vorhandene PyErr_NewException(), nimmt aber ein zusätzliches Argument vom Typ char* entgegen, das den Docstring für die neue Ausnahmeklasse enthält. (Hinzugefügt von 'lekma' im Python-Bugtracker; bpo-7033.)

  • Neue Funktion: PyFrame_GetLineNumber() nimmt ein Frame-Objekt entgegen und gibt die Zeilennummer zurück, die das Frame gerade ausführt. Zuvor musste Code den Index der aktuell ausgeführten Bytecode-Instruktion ermitteln und dann die entsprechende Zeilennummer nachschlagen. (Hinzugefügt von Jeffrey Yasskin.)

  • Neue Funktionen: PyLong_AsLongAndOverflow() und PyLong_AsLongLongAndOverflow() approximieren eine Python-Ganzzahl als C long oder long long. Wenn die Zahl zu groß ist, um in den Ausgabetyp zu passen, wird ein Überlauf-Flag gesetzt und an den Aufrufer zurückgegeben. (Beigesteuert von Case Van Horsen; bpo-7528 und bpo-7767.)

  • Neue Funktion: Aus der Neufassung der String-zu-Float-Konvertierung wurde eine neue Funktion PyOS_string_to_double() hinzugefügt. Die alten Funktionen PyOS_ascii_strtod() und PyOS_ascii_atof() sind nun veraltet.

  • Neue Funktion: PySys_SetArgvEx() setzt den Wert von sys.argv und kann optional sys.path aktualisieren, um das Verzeichnis einzuschließen, das das Skript mit dem Namen sys.argv[0] enthält, abhängig vom Wert eines updatepath-Parameters.

    Diese Funktion wurde hinzugefügt, um ein Sicherheitsloch für Anwendungen zu schließen, die Python einbetten. Die alte Funktion PySys_SetArgv() hätte sys.path immer aktualisiert und manchmal das aktuelle Verzeichnis hinzugefügt. Das bedeutete, dass, wenn Sie eine Anwendung ausführen, die Python in einem von jemand anderem kontrollierten Verzeichnis einbettet, Angreifer ein Trojaner-Modul in das Verzeichnis legen konnten (z. B. eine Datei namens os.py), die Ihre Anwendung dann importieren und ausführen würde.

    Wenn Sie eine C/C++-Anwendung pflegen, die Python einbettet, prüfen Sie, ob Sie PySys_SetArgv() aufrufen, und überlegen Sie sorgfältig, ob die Anwendung PySys_SetArgvEx() mit updatepath auf false setzen sollte.

    Sicherheitsrisiko gemeldet als CVE 2008-5983; diskutiert in bpo-5753 und behoben von Antoine Pitrou.

  • Neue Makros: Die Python-Header-Dateien definieren nun die folgenden Makros: Py_ISALNUM, Py_ISALPHA, Py_ISDIGIT, Py_ISLOWER, Py_ISSPACE, Py_ISUPPER, Py_ISXDIGIT, Py_TOLOWER und Py_TOUPPER. Alle diese Funktionen sind analog zu den C-Standardmakros zur Klassifizierung von Zeichen, ignorieren jedoch die aktuelle Gebietseinstellung, da Python in mehreren Fällen Zeichen sprachunabhängig analysieren muss. (Hinzugefügt von Eric Smith; bpo-5793.)

  • Entfernte Funktion: PyEval_CallObject() ist jetzt nur noch als Makro verfügbar. Eine Funktionsversion wurde beibehalten, um die ABI-Verknüpfungskompatibilität zu gewährleisten, aber das war 1997; sie kann jetzt sicherlich entfernt werden. (Entfernt von Antoine Pitrou; bpo-8276.)

  • Neue Formatcodes: Die Funktionen PyString_FromFormat(), PyString_FromFormatV() und PyErr_Format() akzeptieren nun die Formatcodes %lld und %llu für die Anzeige von C's long long-Typen. (Beigesteuert von Mark Dickinson; bpo-7228.)

  • Die komplizierte Interaktion zwischen Threads und Prozess-Forking wurde geändert. Zuvor konnte der von os.fork() erstellte Kindprozess fehlschlagen, da das Kind nur mit einem laufenden Thread erstellt wird, dem Thread, der os.fork() ausführt. Wenn andere Threads eine Sperre hielten, wie z. B. die Import-Sperre von Python, als das Fork ausgeführt wurde, würde die Sperre im neuen Prozess weiterhin als "gehalten" markiert sein. Aber im Kindprozess würde nichts die Sperre freigeben, da die anderen Threads nicht repliziert wurden, und der Kindprozess könnte keine Importe mehr durchführen.

    Python 2.7 erwirbt die Import-Sperre, bevor ein os.fork() ausgeführt wird, und bereinigt auch alle mit dem threading-Modul erstellten Sperren. C-Erweiterungsmodule, die interne Sperren haben oder selbst fork() aufrufen, profitieren nicht von dieser Bereinigung.

    (Behoben von Thomas Wouters; bpo-1590864.)

  • Die Funktion Py_Finalize() ruft nun die interne Funktion threading._shutdown() auf; dies verhindert, dass beim Herunterfahren eines Interpreters Ausnahmen ausgelöst werden. (Patch von Adam Olsen; bpo-1722344.)

  • Bei Verwendung der Struktur PyMemberDef zur Definition von Attributen eines Typs erlaubt Python nicht mehr, dass Sie versuchen, ein Attribut vom Typ T_STRING_INPLACE zu löschen oder zu setzen.

  • Globale Symbole, die vom Modul ctypes definiert werden, sind nun mit Py oder mit _ctypes präfigiert. (Implementiert von Thomas Heller; bpo-3102.)

  • Neue Konfigurationsoption: Der Schalter --with-system-expat erlaubt das Erstellen des Moduls pyexpat, um die systemweite Expat-Bibliothek zu verwenden. (Beigesteuert von Arfrever Frehtes Taifersar Arahesis; bpo-7609.)

  • Neue Konfigurationsoption: Die Option --with-valgrind deaktiviert nun den Pymalloc-Allocator, der für den Valgrind-Spehlerndetektor schwer korrekt zu analysieren ist. Valgrind ist daher besser darin, Speicherlecks und Überläufe zu erkennen. (Beigesteuert von James Henstridge; bpo-2422.)

  • Neue Konfigurationsoption: Sie können nun einen leeren String an --with-dbmliborder= übergeben, um alle verschiedenen DBM-Module zu deaktivieren. (Hinzugefügt von Arfrever Frehtes Taifersar Arahesis; bpo-6491.)

  • Das Skript configure prüft nun auf Gleitkomma-Rundungsfehler auf bestimmten 32-Bit-Intel-Chips und definiert die Präprozessordefinition X87_DOUBLE_ROUNDING. Derzeit verwendet kein Code diese Definition, aber sie ist verfügbar, falls jemand sie verwenden möchte. (Hinzugefügt von Mark Dickinson; bpo-2937.)

    configure setzt nun auch die Makefile-Variable LDCXXSHARED zur Unterstützung der C++-Verknüpfung. (Beigesteuert von Arfrever Frehtes Taifersar Arahesis; bpo-1222585.)

  • Der Build-Prozess erstellt nun die notwendigen Dateien für die Unterstützung von pkg-config. (Beigesteuert von Clinton Roy; bpo-3585.)

  • Der Build-Prozess unterstützt nun Subversion 1.7. (Beigesteuert von Arfrever Frehtes Taifersar Arahesis; bpo-6094.)

Kapseln

Python 3.1 fügt einen neuen C-Datentyp hinzu, PyCapsule, zur Bereitstellung einer C-API für ein Erweiterungsmodul. Eine Kapsel ist im Wesentlichen der Halter eines C void*-Zeigers und wird als Modulattribut bereitgestellt; zum Beispiel wird die API des socket-Moduls als socket.CAPI exponiert, und unicodedata exponiert ucnhash_CAPI. Andere Erweiterungen können das Modul importieren, auf sein Wörterbuch zugreifen, um das Kapselobjekt zu erhalten, und dann den void*-Zeiger abrufen, der normalerweise auf ein Array von Zeigern auf die verschiedenen API-Funktionen des Moduls zeigt.

Es gibt bereits einen Datentyp für diesen Zweck, PyCObject, aber er bietet keine Typsicherheit. Böswilliger Code, der in reinem Python geschrieben wurde, könnte einen Segmentierungsfehler verursachen, indem er ein PyCObject von Modul A nimmt und es irgendwie durch das PyCObject in Modul B ersetzt. Kapseln kennen ihren eigenen Namen, und das Abrufen des Zeigers erfordert die Angabe des Namens

void *vtable;

if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
        PyErr_SetString(PyExc_ValueError, "argument type invalid");
        return NULL;
}

vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");

Sie sind sicher, dass vtable auf das zeigt, was Sie erwarten. Wenn eine andere Kapsel übergeben wurde, würde PyCapsule_IsValid() den nicht übereinstimmenden Namen erkennen und false zurückgeben. Weitere Informationen zur Verwendung dieser Objekte finden Sie unter Bereitstellung einer C-API für ein Erweiterungsmodul.

Python 2.7 verwendet nun intern Kapseln, um verschiedene Erweiterungsmodul-APIs bereitzustellen, aber die Funktion PyCObject_AsVoidPtr() wurde modifiziert, um Kapseln zu verarbeiten, was die Kompatibilität zur Kompilierungszeit mit der Schnittstelle PyCObject bewahrt. Die Verwendung von PyCObject_AsVoidPtr() löst eine PendingDeprecationWarning aus, die standardmäßig stumm ist.

Implementiert in Python 3.1 und zurückportiert nach 2.7 von Larry Hastings; diskutiert in bpo-5630.

Port-spezifische Änderungen: Windows

Port-spezifische Änderungen: Mac OS X

  • Der Pfad /Library/Python/2.7/site-packages wird nun an sys.path angehängt, um hinzugefügte Pakete zwischen der Systeminstallation und einer vom Benutzer installierten Kopie derselben Version zu teilen. (Geändert von Ronald Oussoren; bpo-4865.)

    Geändert in Version 2.7.13: Ab 2.7.13 wurde diese Änderung rückgängig gemacht. /Library/Python/2.7/site-packages, das von Apples System-Python 2.7 verwendete Site-Packages-Verzeichnis, wird für vom Benutzer installierte Pythons, wie z. B. von den python.org-Installern, nicht mehr an sys.path angehängt. Ab macOS 10.12 änderte Apple die Konfiguration des System-Site-Packages-Verzeichnisses, was dazu führen konnte, dass die Installation von pip-Komponenten wie Setuptools fehlschlug. Für das System-Python installierte Pakete werden nicht mehr mit vom Benutzer installierten Pythons geteilt. (bpo-28440)

Port-spezifische Änderungen: FreeBSD

  • Die Konstante SO_SETFIB von FreeBSD 7.1, die mit den socket()-Methoden getsockopt()/setsockopt() zum Auswählen einer alternativen Routing-Tabelle verwendet wird, ist nun im Modul socket verfügbar. (Hinzugefügt von Kyle VanderBeek; bpo-8235.)

Andere Änderungen und Korrekturen

  • Zwei Benchmark-Skripte, iobench und ccbench, wurden dem Verzeichnis Tools hinzugefügt. iobench misst die Geschwindigkeit der integrierten Datei-I/O-Objekte, die von open() zurückgegeben werden, während verschiedene Operationen ausgeführt werden, und ccbench ist ein Nebenläufigkeits-Benchmark, der versucht, den Computer-Durchsatz, die Latenz beim Thread-Wechsel und die IO-Verarbeitungsbandbreite bei der Ausführung mehrerer Aufgaben mit einer variierenden Anzahl von Threads zu messen.

  • Das Skript Tools/i18n/msgfmt.py versteht nun Pluralformen in .po-Dateien. (Behoben von Martin von Löwis; bpo-5464.)

  • Beim Importieren eines Moduls aus einer .pyc- oder .pyo-Datei mit einem vorhandenen .py-Gegenstück werden die Attribute co_filename der resultierenden Code-Objekte überschrieben, wenn der ursprüngliche Dateiname veraltet ist. Dies kann passieren, wenn die Datei umbenannt, verschoben oder über verschiedene Pfade zugegriffen wurde. (Patch von Ziga Seilnacht und Jean-Paul Calderone; bpo-1180193.)

  • Das Skript regrtest.py nimmt nun einen Schalter --randseed= entgegen, der eine Ganzzahl akzeptiert, die als Zufallssamen für die Option -r verwendet wird, die Tests in zufälliger Reihenfolge ausführt. Die Option -r berichtet auch den verwendeten Samen (Hinzugefügt von Collin Winter.)

  • Ein weiterer Schalter von regrtest.py ist -j, der eine Ganzzahl entgegennimmt, die angibt, wie viele Tests parallel ausgeführt werden sollen. Dies ermöglicht die Reduzierung der Gesamtlaufzeit auf Mehrkernmaschinen. Diese Option ist mit mehreren anderen Optionen kompatibel, einschließlich des Schalters -R, der bekanntermaßen lange Laufzeiten erzeugt. (Hinzugefügt von Antoine Pitrou, bpo-6152.) Dies kann auch mit einem neuen Schalter -F verwendet werden, der ausgewählte Tests in einer Schleife ausführt, bis sie fehlschlagen. (Hinzugefügt von Antoine Pitrou; bpo-7312.)

  • Wenn das Modul py_compile.py als Skript ausgeführt wird, akzeptiert es nun '-' als Argument, was die Standardeingabe für die Liste der zu kompilierenden Dateinamen liest. (Beigesteuert von Piotr Ożarowski; bpo-8233.)

Portierung auf Python 2.7

Dieser Abschnitt listet die zuvor beschriebenen Änderungen und andere Fehlerbehebungen auf, die möglicherweise Änderungen an Ihrem Code erfordern

  • Die Funktion range() verarbeitet ihre Argumente konsistenter; sie ruft nun __int__() für nicht-Gleitkomma- und nicht-Ganzzahlargumente auf, die ihr übergeben werden. (Behoben von Alexander Belopolsky; bpo-1533.)

  • Die String-Methode format() änderte die Standardpräzision für Gleitkomma- und komplexe Zahlen von 6 Dezimalstellen auf 12, was der von str() verwendeten Präzision entspricht. (Geändert von Eric Smith; bpo-5920.)

  • Aufgrund einer Optimierung für die with-Anweisung müssen die Spezialmethoden __enter__() und __exit__() zum Typ des Objekts gehören und können nicht direkt an die Instanz des Objekts angehängt werden. Dies betrifft neue Klassen (abgeleitet von object) und C-Erweiterungstypen. (bpo-6101.)

  • Aufgrund eines Fehlers in Python 2.6 war der Parameter exc_value für die Methoden __exit__() oft die String-Repräsentation der Ausnahme, nicht eine Instanz. Dies wurde in 2.7 behoben, so dass exc_value wie erwartet eine Instanz sein wird. (Behoben von Florent Xicluna; bpo-7853.)

  • Wenn eine eingeschränkte Menge von Attributen mit __slots__ gesetzt wurde, würde das Löschen eines nicht gesetzten Attributs keine AttributeError auslösen, wie erwartet. Behoben von Benjamin Peterson; bpo-7604.)

In der Standardbibliothek

  • Operationen mit datetime-Instanzen, die zu einem Jahr außerhalb des unterstützten Bereichs führten, lösten nicht immer eine OverflowError aus. Solche Fehler werden nun sorgfältiger geprüft und lösen die Ausnahme aus. (Gemeldet von Mark Leander, Patch von Anand B. Pillai und Alexander Belopolsky; bpo-7150.)

  • Bei der Verwendung von Decimal-Instanzen mit der format()-Methode eines Strings war die Standardausrichtung zuvor linksbündig. Dies wurde auf rechtsbündig geändert, was die Ausgabe Ihrer Programme verändern kann. (Geändert von Mark Dickinson; bpo-6857.)

    Vergleiche, die einen signalisierenden NaN-Wert (oder sNAN) beinhalten, signalisieren jetzt InvalidOperation anstatt stillschweigend einen wahren oder falschen Wert basierend auf dem Vergleichsoperator zurückzugeben. Ruhige NaN-Werte (oder NaN) sind jetzt hashbar. (Behoben von Mark Dickinson; bpo-7279.)

  • Die Bibliothek xml.etree.ElementTree maskiert bei der Ausgabe einer XML-Verarbeitungsanweisung (die wie <?xml-stylesheet href="#style1"?> aussieht) oder eines Kommentars (der wie <!-- comment --> aussieht) keine kaufmännischen Und-Zeichen und spitzen Klammern mehr. (Patch von Neil Muller; bpo-2746.)

  • Die readline()-Methode von StringIO-Objekten tut nun nichts mehr, wenn eine negative Länge angefordert wird, wie es andere dateiähnliche Objekte tun. (bpo-7348).

  • Das Modul syslog verwendet nun den Wert von sys.argv[0] als Identifikator anstelle des vorherigen Standardwerts 'python'. (Geändert von Sean Reifschneider; bpo-8451.)

  • Die Standard-Fehlerbehandlung des Moduls tarfile hat sich geändert und unterdrückt keine schwerwiegenden Fehler mehr. Die Standard-Fehlerschwelle war zuvor 0, was bedeutete, dass Fehler nur zu einer Meldung im Debug-Log führten, aber da das Debug-Log standardmäßig nicht aktiviert ist, bleiben diese Fehler unbemerkt. Die Standard-Fehlerschwelle ist nun 1, was eine Ausnahme auslöst, wenn ein Fehler auftritt. (Geändert von Lars Gustäbel; bpo-7357.)

  • Das Modul urlparse und seine Funktion urlsplit() verarbeiten nun unbekannte URL-Schemata konform mit RFC 3986: Wenn die URL die Form "<etwas>://..." hat, wird der Text vor :// als Schema behandelt, auch wenn es ein erfundener Schema ist, den das Modul nicht kennt. Diese Änderung kann Code brechen, der das alte Verhalten umging. Zum Beispiel geben Python 2.6.4 oder 2.5 folgendes zurück.

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', '', '//host/filename?query', '', '')
    

    Python 2.7 (und Python 2.6.5) gibt folgendes zurück

    >>> import urlparse
    >>> urlparse.urlsplit('invented://host/filename?query')
    ('invented', 'host', '/filename?query', '', '')
    

    (Python 2.7 gibt tatsächlich leicht abweichende Ausgaben, da es ein benanntes Tupel anstelle eines Standard-Tupels zurückgibt.)

Für C-Erweiterungen

  • C-Erweiterungen, die Integer-Formatcodes mit der PyArg_Parse*-Familie von Funktionen verwenden, lösen nun eine TypeError-Ausnahme aus, anstatt eine DeprecationWarning auszulösen (bpo-5080).

  • Verwenden Sie die neue Funktion PyOS_string_to_double() anstelle der alten Funktionen PyOS_ascii_strtod() und PyOS_ascii_atof(), die nun als veraltet gelten.

Für Anwendungen, die Python einbetten

  • Die Funktion PySys_SetArgvEx() wurde hinzugefügt, um Sicherheitslücken zu schließen, die bei Verwendung der bestehenden Funktion PySys_SetArgv() auftreten konnten. Prüfen Sie, ob Sie PySys_SetArgv() aufrufen und überlegen Sie sorgfältig, ob die Anwendung PySys_SetArgvEx() mit updatepath auf false setzen sollte.

Neue Funktionen in Python 2.7 Wartungs-Releases

Neue Funktionen können in Python 2.7 Wartungs-Releases aufgenommen werden, wenn die Situation dies erfordert. Solche Ergänzungen müssen den Python Enhancement Proposal (PEP) Prozess durchlaufen und überzeugend darlegen, warum sie nicht angemessen durch die Aufnahme der neuen Funktion ausschließlich in Python 3 oder durch Veröffentlichung im Python Package Index gelöst werden können.

Zusätzlich zu den unten aufgeführten spezifischen Vorschlägen gibt es eine allgemeine Ausnahmeregelung, die die Hinzufügung neuer -3 Warnungen in jedem Python 2.7 Wartungs-Release erlaubt.

Zwei neue Umgebungsvariablen für den Debug-Modus

Im Debug-Modus wird die Statistik [xxx refs] standardmäßig nicht geschrieben. Die Umgebungsvariable PYTHONSHOWREFCOUNT muss nun ebenfalls gesetzt sein. (Beigetragen von Victor Stinner; bpo-31733.)

Wenn Python mit definiertem COUNT_ALLOC kompiliert wird, werden die Allokationszählungen nicht mehr standardmäßig ausgegeben: Die Umgebungsvariable PYTHONSHOWALLOCCOUNT muss nun ebenfalls gesetzt sein. Außerdem werden die Allokationszählungen nun nach stderr und nicht nach stdout ausgegeben. (Beigetragen von Victor Stinner; bpo-31692.)

Hinzugefügt in Version 2.7.15.

PEP 434: IDLE-Verbesserungs-Ausnahme für alle Zweige

PEP 434 beschreibt eine allgemeine Ausnahme für Änderungen am IDLE-Entwicklungsumgebung, die zusammen mit Python ausgeliefert wird. Diese Ausnahme ermöglicht es den IDLE-Entwicklern, eine konsistentere Benutzererfahrung über alle unterstützten Versionen von Python 2 und 3 hinweg zu bieten.

Einzelheiten zu IDLE-Änderungen finden Sie in der NEWS-Datei der jeweiligen Version.

PEP 466: Netzwerk-Sicherheitsverbesserungen für Python 2.7

PEP 466 beschreibt eine Reihe von Vorschlägen zur Verbesserung der Netzwerksicherheit, die für die Aufnahme in Python 2.7 Wartungs-Releases genehmigt wurden. Die ersten dieser Änderungen erschienen in der Python 2.7.7-Version.

PEP 466-bezogene Funktionen, die in Python 2.7.7 hinzugefügt wurden

  • hmac.compare_digest() wurde von Python 3 zurückportiert, um Python 2-Anwendungen eine zeitangriffsresistente Vergleichsoperation zur Verfügung zu stellen. (Beigetragen von Alex Gaynor; bpo-21306.)

  • OpenSSL 1.0.1g wurde in den offiziellen Windows-Installern auf python.org aktualisiert. (Beigetragen von Zachary Ware; bpo-21462.)

PEP 466-bezogene Funktionen, die in Python 2.7.8 hinzugefügt wurden

  • hashlib.pbkdf2_hmac() wurde von Python 3 zurückportiert, um Python 2-Anwendungen einen sicheren Hashing-Algorithmus für die Passwortspeicherung verfügbar zu machen. (Beigetragen von Alex Gaynor; bpo-21304.)

  • OpenSSL 1.0.1h wurde für die offiziellen Windows-Installationsprogramme auf python.org aktualisiert. (Beigetragen von Zachary Ware in bpo-21671 für CVE 2014-0224.)

PEP 466-bezogene Funktionen, die in Python 2.7.9 hinzugefügt wurden

  • Der Großteil des ssl-Moduls von Python 3.4 wurde zurückportiert. Das bedeutet, ssl unterstützt nun Server Name Indication, TLS1.x-Einstellungen, Zugriff auf den plattformspezifischen Zertifikatsspeicher, die Klasse SSLContext und andere Funktionen. (Beigetragen von Alex Gaynor und David Reid; bpo-21308.)

    Beziehen Sie sich für spezifische Details auf die Hinweise "Version hinzugefügt: 2.7.9" in der Moduldokumentation.

  • os.urandom() wurde so geändert, dass ein Dateideskriptor für /dev/urandom gecacht wird, anstatt /dev/urandom bei jedem Aufruf neu zu öffnen. (Beigetragen von Alex Gaynor; bpo-21305.)

  • hashlib.algorithms_guaranteed und hashlib.algorithms_available wurden von Python 3 zurückportiert, um Python 2-Anwendungen die Auswahl des stärksten verfügbaren Hash-Algorithmus zu erleichtern. (Beigetragen von Alex Gaynor in bpo-21307)

PEP 477: Backport ensurepip (PEP 453) nach Python 2.7

PEP 477 genehmigt die Aufnahme des PEP 453 ensurepip-Moduls und der damit ermöglichten verbesserten Dokumentation in die Python 2.7 Wartungs-Releases, die erstmals in der Python 2.7.9-Version erscheinen.

Bootstrapping von pip standardmäßig

Das neue Modul ensurepip (definiert in PEP 453) bietet einen standardisierten plattformübergreifenden Mechanismus zum Bootstrapping des pip-Installers in Python-Installationen. Die mit Python 2.7.9 gebündelte Version von pip ist pip 1.5.6. Zukünftige 2.7.x Wartungs-Releases werden die gebündelte Version auf die neueste Version von pip aktualisieren, die zum Zeitpunkt der Erstellung des Release Candidates verfügbar ist.

Standardmäßig werden die Befehle pip, pipX und pipX.Y auf allen Plattformen installiert (wobei X.Y für die Version der Python-Installation steht), zusammen mit dem Python-Paket pip und seinen Abhängigkeiten.

Für CPython-Quellcode-Builds auf POSIX-Systemen (CPython unter Unix bauen) bootstrappen die Befehle make install und make altinstall pip nicht standardmäßig. Dieses Verhalten kann über Konfigurationsoptionen gesteuert und über Makefile-Optionen überschrieben werden.

Unter Windows und Mac OS X installieren die CPython-Installationsprogramme standardmäßig pip zusammen mit CPython (Benutzer können die Installation während des Installationsvorgangs abwählen). Windows-Benutzer müssen den automatischen PATH-Modifikationen zustimmen, damit pip standardmäßig von der Kommandozeile aus verfügbar ist, andernfalls kann es immer noch über den Python-Launcher für Windows als py -m pip aufgerufen werden.

Wie in der PEP diskutiert, können Plattform-Paketer wählen, diese Befehle nicht standardmäßig zu installieren, solange sie beim Aufruf klare und einfache Anweisungen zur Installation auf dieser Plattform geben (normalerweise über den System-Paketmanager).

Dokumentationsänderungen

Als Teil dieser Änderung wurden die Abschnitte Installieren von Python-Modulen und Verteilen von Python-Modulen der Dokumentation komplett neu gestaltet zu kurzen Anleitungen und FAQ-Dokumenten. Die meisten Paketierungsdokumente wurden in das von der Python Packaging Authority verwaltete Python Packaging User Guide und die Dokumentation der einzelnen Projekte verschoben.

Da diese Migration derzeit noch unvollständig ist, sind die Legacy-Versionen dieser Leitfäden weiterhin verfügbar als C- und C++-Erweiterungen mit setuptools erstellen und C- und C++-Erweiterungen mit setuptools erstellen.

Siehe auch

PEP 453 – Explizites Bootstrapping von pip in Python-Installationen

PEP geschrieben von Donald Stufft und Nick Coghlan, implementiert von Donald Stufft, Nick Coghlan, Martin von Löwis und Ned Deily.

PEP 476: Zertifikatsüberprüfung standardmäßig für stdlib http-Clients aktivieren

PEP 476 aktualisierte httplib und Module, die es verwenden, wie z.B. urllib2 und xmlrpclib, so dass sie nun standardmäßig überprüfen, ob der Server ein Zertifikat präsentiert, das von einer Zertifizierungsstelle im plattformspezifischen Vertrauensspeicher signiert wurde und dessen Hostname mit dem angeforderten Hostnamen übereinstimmt. Dies verbessert die Sicherheit für viele Anwendungen erheblich. Diese Änderung wurde in der Python 2.7.9-Version vorgenommen.

Für Anwendungen, die das alte Verhalten erfordern, kann ein alternativer Kontext übergeben werden.

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: HTTPS-Überprüfungs-Migrationstools für Python 2.7

PEP 493 bietet zusätzliche Migrationstools zur Unterstützung eines inkrementelleren Infrastruktur-Upgrade-Prozesses für Umgebungen, die Anwendungen und Dienste enthalten, die sich auf die historisch permissive Verarbeitung von Serverzertifikaten bei der Einrichtung von Client-HTTPS-Verbindungen verlassen. Diese Ergänzungen wurden in der Python 2.7.12-Version vorgenommen.

Diese Tools sind für Fälle gedacht, in denen betroffene Anwendungen und Dienste nicht so geändert werden können, dass explizit ein permissiverer SSL-Kontext beim Aufbau der Verbindung übergeben wird.

Für Anwendungen und Dienste, die überhaupt nicht geändert werden können, kann die neue Umgebungsvariable PYTHONHTTPSVERIFY auf 0 gesetzt werden, um einen gesamten Python-Prozess auf das frühere permissive Standardverhalten von Python 2.7.8 und früher zurückzusetzen.

Für Fälle, in denen der Verbindungserstellungscode nicht geändert werden kann, die gesamte Anwendung aber schon, kann die neue Funktion ssl._https_verify_certificates() verwendet werden, um das Standardverhalten zur Laufzeit anzupassen.

Neues Build-Ziel make regen-all

Um die Kreuzkompilierung zu vereinfachen und sicherzustellen, dass CPython zuverlässig ohne eine bereits vorhandene Python-Version kompiliert werden kann, versucht das Autotools-basierte Build-System nicht mehr, generierte Dateien implizit basierend auf den Änderungszeiten neu zu kompilieren.

Stattdessen wurde ein neues Kommando make regen-all hinzugefügt, um die Neubereitstellung dieser Dateien zu erzwingen, wenn dies gewünscht ist (z. B. nachdem bereits eine erste Python-Version basierend auf den vorgenommenen Generierungen erstellt wurde).

Es sind auch selektivere Regenerationsziele definiert - siehe Makefile.pre.in für Details.

(Beigetragen von Victor Stinner in bpo-23404.)

Hinzugefügt in Version 2.7.14.

Entfernung des Build-Ziels make touch

Das Build-Ziel make touch, das zuvor verwendet wurde, um die implizite Neubereitstellung generierter Dateien durch Aktualisierung ihrer Änderungszeiten anzufordern, wurde entfernt.

Es wurde durch das neue Ziel make regen-all ersetzt.

(Beigetragen von Victor Stinner in bpo-23404.)

Geändert in Version 2.7.14.

Danksagungen

Der Autor möchte den folgenden Personen für ihre Vorschläge, Korrekturen und Unterstützung bei verschiedenen Entwürfen dieses Artikels danken: Nick Coghlan, Philip Jenvey, Ryan Lovett, R. David Murray, Hugh Secker-Walker.