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
withAnweisung.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
memoryviewObjekt.Eine kleine Teilmenge des
importlibModuls, weiter unten beschrieben.Das
repr()eines Floatsxist in vielen Fällen kürzer: es basiert nun auf dem kürzesten Dezimalstring, der garantiert zurück zuxrundet. Wie in früheren Versionen von Python ist garantiert, dassfloat(repr(x))xwiederherstellt.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()undoperator.sequenceIncludes(), die in 3.x nicht unterstützt werden, lösen nun Warnungen aus.Der Schalter
-3aktiviert 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
ConfigParserModul 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ürcollections.namedtuple()gibt nun ein geordnetes Dictionary zurück, wobei die Werte in derselben Reihenfolge erscheinen wie die zugrunde liegenden Tupelindizes.Der Konstruktor der Klasse
JSONDecoderdesjsonModuls wurde um einen Parameter object_pairs_hook erweitert, um die Erstellung vonOrderedDictInstanzen 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
argparseDokumentationDie Dokumentationsseite des argparse-Moduls.
- Migration von optparse-Code zu argparse
Teil der Python-Dokumentation, der beschreibt, wie Code, der
optparseverwendet, 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
SysLogHandlerunterstützt jetzt Syslogging über TCP. Der Konstruktor verfügt über einen Parameter socktype, der den zu verwendenden Socket-Typ angibt, entwedersocket.SOCK_DGRAMfür UDP odersocket.SOCK_STREAMfür TCP. Das Standardprotokoll bleibt UDP.Logger-Instanzen erhielten eine MethodegetChild(), die einen abgeleiteten Logger über einen relativen Pfad abruft. Wenn Sie beispielsweise einen Logger überlog = getLogger('app')abrufen, ist der Aufruf vonlog.getChild('network.listen')gleichbedeutend mitgetLogger('app.network.listen').Die Klasse
LoggerAdaptererhielt eine MethodeisEnabledFor(), 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.
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')
>>>
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 Sieset()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
-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 neuewithwith-Anweisung beginnt. Das bedeutet, dasswith 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 Konstruktorenfloatundcomplex; numerische Formatierung; Serialisieren und Deserialisieren von Floats und komplexen Zahlen mit den Modulenmarshal,pickleundjson; Parsen von Float- und Imaginärteil-Literalen im Python-Code; undDecimal-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, dershortsein wird, wenn der neue Code verwendet wird, undlegacy, 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 vonstr.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ürstr.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 Ausgabe1.5+3jangewendet. (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 einePendingDeprecationWarningaus, wenn ihr eine Formatierungszeichenkette übergeben wird, da die__format__()-Methode fürobjectdie 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()undlong()erhielten eine Methodebit_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
-Anweisung wird keinen absoluten Import mehr versuchen, wenn ein relativer Import (z.B.importfrom .os import sep) fehlschlägt. Dies behebt einen Fehler, könnte aber möglicherweise bestimmteimport-Anweisungen, die nur zufällig funktionierten, unterbrechen. (Behoben von Meador Inge; bpo-7902.)Es ist jetzt möglich, dass eine Unterklasse des eingebauten Typs
unicodedie Methode__unicode__()überschreibt. (Implementiert von Victor Stinner; bpo-1583863.)Die Methode
translate()des Typsbytearrayakzeptiert jetztNoneals erstes Argument. (Behoben von Georg Brandl; bpo-4759.)Beim Verwenden von
@classmethodund@staticmethodzum 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 keineAttributeErrorauslö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 Attributfilenamein derIOError-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)): passerhalten. 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
-Anweisungen durchzuführen und die Methodenwith__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**15oder in Basis2**30gespeichert, wobei die Basis zur Build-Zeit bestimmt wird. Zuvor wurden sie immer in Basis2**15gespeichert. Die Verwendung von Basis2**30bietet signifikante Leistungsverbesserungen auf 64-Bit-Maschinen, aber die Benchmark-Ergebnisse auf 32-Bit-Maschinen waren gemischt. Daher ist die Standardeinstellung die Verwendung von Basis2**30auf 64-Bit-Maschinen und Basis2**15auf 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()undrsplit()von zeichenkettenähnlichen Typen (Strings, Unicode-Strings undbytearray-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
pickleundcPickleinternieren 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
cPicklebehandelt 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
Bdbdes Modulsbdberhielt eine Funktion zum Überspringen von Modulen. Der Konstruktor nimmt jetzt ein Iterable mit glob-ähnlichen Mustern wiedjango.*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
binasciiunterstützt nun die Buffer-API, sodass es mitmemoryview-Instanzen und anderen ähnlichen Buffer-Objekten verwendet werden kann. (Aus 3.x zurückportiert von Florent Xicluna; bpo-7703.)Aktualisiertes Modul: Das Modul
bsddbwurde 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
BZ2Filedes Modulsbz2unterstützt nun das Kontextmanagementprotokoll, sodass Siewith bz2.BZ2File(...) as f:schreiben können. (Beigetragen von Hagen Fürstenau; bpo-3860.)Neue Klasse: Die Klasse
Counterim Modulcollectionsist 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 einenKeyErrorauszulö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 anderesCounterist, 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:
OrderedDictist im vorherigen Abschnitt PEP 372: Hinzufügen eines geordneten Dictionaries zu collections beschrieben.Neue Methode: Der Datentyp
dequehat jetzt einecount()-Methode, die die Anzahl der Elemente zurückgibt, die gleich dem übergebenen Argument x sind, und einereverse()-Methode, die die Elemente der Dek in-place umkehrt.dequestellt seine maximale Länge auch als schreibgeschütztes Attributmaxlenzur Verfügung. (Beide Funktionen hinzugefügt von Raymond Hettinger.)Die Klasse
namedtuplehat 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
MappingjetztNotImplementedzurück, wenn eine Zuordnung mit einem anderen Typ verglichen wird, der keineMappingist. (Behoben von Daniel Stutzbach; bpo-8729.)Konstruktoren für die Parsing-Klassen im Modul
ConfigParserakzeptieren 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 einzigenwith-Anweisung ermöglicht, wurde veraltet, da diewith-Anweisung jetzt mehrere Kontextmanager unterstützt.Das Modul
cookielibignoriert 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 Modulscopykopiert jetzt korrekt gebundene Instanzmethoden. (Implementiert von Robert Collins; bpo-1515.)Das Modul
ctypeskonvertiert jetzt immerNonein einen CNULL-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
timedeltades Modulsdatetimehat jetzt einetotal_seconds()-Methode, die die Anzahl der Sekunden in der Dauer zurückgibt. (Beigetragen von Brian Quinlan; bpo-5788.)Neue Methode: Die Klasse
Decimalhat jetzt eine Klassenmethodefrom_float(), die eine exakte Konvertierung einer Fließkommazahl in einenDecimaldurchfü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 gibtDecimal.from_float(0.1)Decimal('0.1000000000000000055511151231257827021181583404541015625')zurück. (Implementiert von Raymond Hettinger; bpo-4796.)Vergleiche von Instanzen von
Decimalmit 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 SieDecimalund Fließkommazahlen immer noch nicht in anderen Operationen wie der Addition kombinieren können, da Sie explizit wählen sollten, wie zwischen Float undDecimalkonvertiert wird. (Behoben von Mark Dickinson; bpo-2531.)Der Konstruktor für
Decimalakzeptiert 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
Contextakzeptieren jetzt ganze Zahlen sowie Instanzen vonDecimal; die einzigen Ausnahmen sind die Methodencanonical()undis_canonical(). (Patch von Juan José Conti; bpo-7633.)Beim Verwenden von Instanzen von
Decimalmit derformat()-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 jetztInvalidOperationanstatt stillschweigend einen wahren oder falschen Wert basierend auf dem Vergleichsoperator zurückzugeben. Ruhige NaN-Werte (oderNaN) sind jetzt hashbar. (Behoben von Mark Dickinson; bpo-7279.)Das Modul
diffliberzeugt 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 DateiMANIFESTneu, da selbst wenn die DateienMANIFEST.inodersetup.pynicht 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_DETAILdes Modulsdoctestignoriert jetzt den Namen des Moduls, das die zu testende Ausnahme enthält. (Patch von Lennart Regebro; bpo-7490.)Die Klasse
Messagedes Modulsemailakzeptiert jetzt eine Nutzlast mit Unicode-Wert und konvertiert die Nutzlast automatisch in die durchoutput_charsetangegebene Kodierung. (Hinzugefügt von R. David Murray; bpo-1368247.)Die Klasse
Fractionakzeptiert jetzt ein einzelnes Float oder eine Instanz vonDecimaloder 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 einenTypeErroraus. Dies behebt ein Versehen und lässt denFractionmit den anderen numerischen Typen übereinstimmen.Neue Klasse:
FTP_TLSim Modulftplibstellt 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 Modulfunctoolsnimmt 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 wiesorted(),min()undmax()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 Modulsgcgibt wahr zurück, wenn eine gegebene Instanz vom Garbage Collector verfolgt wird, andernfalls falsch. (Beigetragen von Antoine Pitrou; bpo-4688.)Das Modul
gzip'sGzipFileunterstützt jetzt das Kontextmanagement-Protokoll, sodass Siewith gzip.GzipFile(...) as f:schreiben können (beigetragen von Hagen Fürstenau; bpo-3860), und es implementiert jetzt die ABCio.BufferedIOBase, sodass Sie es mitio.BufferedReaderfü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
gzipwird diese nachgestellten Bytes jetzt verbrauchen. (Behoben von Tadek Pietraszek und Brian Curtin; bpo-2846.)Neues Attribut: Das Modul
hashlibhat jetzt ein Attributalgorithms, das ein Tupel mit den Namen der unterstützten Algorithmen enthält. In Python 2.7 enthälthashlib.algorithms('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'). (Beigetragen von Carl Chenet; bpo-7418.)Die Standardklasse
HTTPResponse, die vom Modulhttplibverwendet 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
HTTPConnectionundHTTPSConnectionunterstü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
ihooksunterstützt jetzt relative Importe. Beachten Sie, dassihooksein älteres Modul zur Anpassung von Importen ist und durch das Modulimputilersetzt wurde, das in Python 2.0 hinzugefügt wurde. (Unterstützung für relative Importe hinzugefügt von Neil Schemenauer.)Das Modul
imaplibunterstützt jetzt IPv6-Adressen. (Beigetragen von Derek Morr; bpo-1655.)Neue Funktion: Die Funktion
getcallargs()des Modulsinspectnimmt 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
iowurde 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_pyioumbenannt.Eine geringfügige daraus resultierende Änderung: Die Klasse
io.TextIOBasehat jetzt ein Attributerrors, das die Fehlereinstellung angibt, die für Kodierungs- und Dekodierungsfehler verwendet wird (einer von'strict','replace','ignore').Die Klasse
io.FileIOlöst jetzt eineOSErroraus, wenn ein ungültiger Dateideskriptor übergeben wird. (Implementiert von Benjamin Peterson; bpo-4991.) Die Methodetruncate()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 zucombinations()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 vonDecimal. (Implementiert von Raymond Hettinger; bpo-5032.)itertools.combinations()unditertools.product()lösten zuvorValueErrorfü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
jsonwurde 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.OrderedDicthatjson.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
Maildirdes Modulsmailboxzeichnet 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
mathhaterf()underfc()für die Fehlerfunktion und die komplementäre Fehlerfunktion erhalten,expm1(), dase**x - 1mit höherer Genauigkeit berechnet als mitexp()und 1 subtrahiert,gamma()für die Gamma-Funktion undlgamma()für den natürlichen Logarithmus der Gamma-Funktion. (Beigetragen von Mark Dickinson und nirinA raseliarison; bpo-3366.)Die Klassen
Manager*des Modulsmultiprocessingkö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 derPooleinen 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
nntplibunterstützt jetzt IPv6-Adressen. (Beigetragen von Derek Morr; bpo-1664.)Neue Funktionen: Das Modul
osumschließt die folgenden POSIX-Systemaufrufe:getresgid()undgetresuid(), die die realen, effektiven und gespeicherten GIDs und UIDs zurückgeben;setresgid()undsetresuid(), 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, wennfork()von einem Thread aufgerufen wird. (Behoben von Zsolt Cserna; bpo-7242.)Im Modul
os.pathbehalten die Funktionennormpath()undabspath()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
pydocbietet jetzt Hilfe für die verschiedenen Symbole, die Python verwendet. Sie können jetzt z.B.help('<<')oderhelp('@')aufrufen. (Beigetragen von David Laban; bpo-4739.)Die Funktionen
split(),sub()undsubn()des Modulsreakzeptieren 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 Modulrunpyfü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 vonsys.pathhinzugefügt und das Modul__main__importiert. Es wird erwartet, dass das Verzeichnis oder Zip-Archiv eine__main__.pyenthält; wenn nicht, könnte eine andere__main__.pyvon einer späteren Position insys.pathimportiert werden. Dies macht einen größeren Teil der Maschinerie vonrunpyfü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
shutilnimmtmake_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()undcopytree()vonshutillösen nun eine AusnahmeSpecialFileErroraus, 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
signalinstalliert 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
sitegeben 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, undgetuserbase()gibt den Wert der UmgebungsvariablenUSER_BASEzurück und liefert den Pfad zu einem Verzeichnis, das zur Speicherung von Daten verwendet werden kann. (Beigetragen von Tarek Ziadé; bpo-6693.)Das Modul
sitemeldet nun Ausnahmen, die beim Import des Modulssitecustomizeauftreten, und fängt die AusnahmeKeyboardInterruptnicht 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()undrecvfrom_into()schreiben nun in Objekte, die die Puffer-API unterstützen, am nützlichsten die Objektebytearrayundmemoryview. (Implementiert von Antoine Pitrou; bpo-8104.)Die Klasse
TCPServerdes ModulsSocketServerunterstützt nun Socket-Timeouts und das Deaktivieren des Nagle-Algorithmus. Das Klassenattributdisable_nagle_algorithmhat den StandardwertFalse; 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 Klassenattributtimeoutkann ein Timeout in Sekunden enthalten, das auf den Anforderungssocket angewendet wird; wenn innerhalb dieser Zeit keine Anforderung empfangen wird, wirdhandle_timeout()aufgerufen undhandle_request()kehrt zurück. (Beigetragen von Kristján Valur Jónsson; bpo-6192 und bpo-6267.)Aktualisiertes Modul: Das Modul
sqlite3wurde 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 Methodeenable_load_extension(True)auf, um Erweiterungen zu aktivieren, und rufen Sie dannload_extension()auf, um eine bestimmte Shared Library zu laden. (Aktualisiert von Gerhard Häring.)Die Objekte
SSLSocketdes Modulssslunterstü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 OpenSSLsSSL_MODE_AUTO_RETRYsetzt, was verhindert, dass ein Fehlercode vonrecv()-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) undssl.OPENSSL_VERSION_NUMBER(eine Ganzzahl) verfügbar. (Hinzugefügt von Antoine Pitrou; bpo-8321.)Das Modul
structignoriert nun keine Überlauffehler mehr schweigend, wenn ein Wert zu groß für einen bestimmten Integer-Formatcode ist (einer vonbBhHiIlLqQ); es löst jetzt immer eine Ausnahmestruct.erroraus. (Geändert von Mark Dickinson; bpo-1523.) Die Funktionpack()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 Modulssubprocessfü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 AusnahmeCalledProcessErroraus.>>> 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
subprocessversucht nun, seine internen Systemaufrufe nach Empfang eines SignalsEINTRerneut auszuführen. (Gemeldet von mehreren Personen; endgültiger Patch von Gregory P. Smith in bpo-1068268.)Neue Funktion:
is_declared_global()im Modulsymtablegibt 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
syslogverwendet nun den Wert vonsys.argv[0]als Identifikator anstelle des vorherigen Standardwerts'python'. (Geändert von Sean Reifschneider; bpo-8451.)Der Wert von
sys.version_infoist nun ein benanntes Tupel mit den Attributenmajor,minor,micro,releaselevelundserial. (Beigetragen von Ross Light; bpo-4285.)sys.getwindowsversion()gibt ebenfalls ein benanntes Tupel zurück, mit den Attributenmajor,minor,build,platform,service_pack,service_pack_major,service_pack_minor,suite_maskundproduct_type. (Beigetragen von Brian Curtin; bpo-7766.)Die Standard-Fehlerbehandlung des Moduls
tarfilehat 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.)tarfileunterstützt nun das Filtern derTarInfo-Objekte, die zu einer Tar-Datei hinzugefügt werden. Wenn Sieadd()aufrufen, können Sie ein optionales Argument filter angeben, das ein aufrufbares Objekt ist. Das aufrufbare Objekt filter erhält dieTarInfofür jede hinzuzufügende Datei und kann diese modifizieren und zurückgeben. Wenn das aufrufbare ObjektNonezurü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 KlasseTarFileunterstützt nun auch das Kontextmanagement-Protokoll. (Hinzugefügt von Lars Gustäbel; bpo-7232.)Die Methode
wait()der Klassethreading.Eventgibt nun bei Beendigung das interne Flag zurück. Das bedeutet, dass die Methode normalerweise true zurückgibt, dawait()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
unicodedatabereitgestellt 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 DatendateiUnihan.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 Modulsurlparsebehandelt 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
urlparseunterstü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
WeakSetim Modulweakrefist 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.ElementTreemaskiert 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
xmlrpclibundSimpleXMLRPCServer, 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 Attributencode_thresholdvonSimpleXMLRPCRequestHandlergesteuert, 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
ZipFiledes Modulszipfileunterstützt nun das Kontextmanagement-Protokoll, sodass Siewith zipfile.ZipFile(...) as f:schreiben können. (Beigetragen von Brian Curtin; bpo-5511.)zipfileunterstü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 vonread()undreadline()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 vonZipFileangegeben 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 Dateipyconfig.hzurü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
-boder--bufferpuffert 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.-coder--catchbewirkt, 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.-foder--failfastbewirkt, 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()undassertIsNotNone()nehmen einen Ausdruck und überprüfen, ob das ErgebnisNoneist oder nicht.assertIs()undassertIsNot()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()undassertNotIsInstance()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()undassertLessEqual()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 mitassertEqual()verglichen werden.assertRegexpMatches()undassertNotRegexpMatches()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()undassertNotIn()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()undassertTupleEqual()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 mitassertEqual()verwendet. Allgemeiner vergleichtassertSequenceEqual()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 mitassertEqual()vergleichen.assertDictContainsSubset()prüft, ob alle Schlüssel/Wert-Paare in first in second enthalten sind.assertAlmostEqual()undassertNotAlmostEqual()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 AttributsuiteClassdesTestLoader. (Behoben von Mark Roddy; bpo-6866.)Ein neuer Hook ermöglicht die Erweiterung der Methode
assertEqual()zur Handhabung neuer Datentypen. Die MethodeaddTypeEqualityFunc()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
XMLParserenthält, die verwendet wird. Dies ermöglicht die Überschreibung der internen Codierung der Dateip = ET.XMLParser(encoding='utf-8') t = ET.XML("""<root/>""", parser=p)
Fehler beim Parsen von XML lösen jetzt eine Ausnahme vom Typ
ParseErroraus, deren Instanzen ein Attributpositionmit 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()undElement.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 Attributtageines Elements aufNonesetzen, 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 Attributdefault_namespacesetzen, und neue Präfixe mitregister_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 verschiebenfrom 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 Methodegetiterator()ist jetzt veraltet, ebenso wiegetchildren(), 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 Beispielt = 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 – istNonefalse, aber ein kindloses Element auch? – es wird jetzt eineFutureWarningauslösen. In Ihrem Code sollten Sie explizit sein: schreiben Sielen(elem) != 0, wenn Sie an der Anzahl der Kinder interessiert sind, oderelem 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.pyund liest sie automatisch ein. Dave Malcolm trug einpython-gdb.pybei, das eine Reihe von Befehlen hinzufügt, die beim Debuggen von Python selbst nützlich sind. Zum Beispiel navigierenpy-upundpy-downeine Python-Stack-Ebene nach oben oder unten, was normalerweise mehreren C-Stack-Ebenen entspricht.py-printgibt den Wert einer Python-Variablen aus, undpy-btgibt den Python-Stack-Trace aus. (Hinzugefügt als Ergebnis von bpo-8032.)Wenn Sie die mit Python bereitgestellte Datei
.gdbinitverwenden, 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 ErweiterungenPyCode_New()aufrufen, was viele weitere Argumente hatte. (Hinzugefügt von Jeffrey Yasskin.)Neue Funktion:
PyErr_NewExceptionWithDoc()erstellt eine neue Ausnahmeklasse, genau wie die vorhandenePyErr_NewException(), nimmt aber ein zusätzliches Argument vom Typchar*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()undPyLong_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 FunktionenPyOS_ascii_strtod()undPyOS_ascii_atof()sind nun veraltet.Neue Funktion:
PySys_SetArgvEx()setzt den Wert vonsys.argvund kann optionalsys.pathaktualisieren, um das Verzeichnis einzuschließen, das das Skript mit dem Namensys.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ättesys.pathimmer 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 namensos.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 AnwendungPySys_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_TOLOWERundPy_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()undPyErr_Format()akzeptieren nun die Formatcodes%lldund%llufü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, deros.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 demthreading-Modul erstellten Sperren. C-Erweiterungsmodule, die interne Sperren haben oder selbstfork()aufrufen, profitieren nicht von dieser Bereinigung.(Behoben von Thomas Wouters; bpo-1590864.)
Die Funktion
Py_Finalize()ruft nun die interne Funktionthreading._shutdown()auf; dies verhindert, dass beim Herunterfahren eines Interpreters Ausnahmen ausgelöst werden. (Patch von Adam Olsen; bpo-1722344.)Bei Verwendung der Struktur
PyMemberDefzur Definition von Attributen eines Typs erlaubt Python nicht mehr, dass Sie versuchen, ein Attribut vom TypT_STRING_INPLACEzu löschen oder zu setzen.Globale Symbole, die vom Modul
ctypesdefiniert werden, sind nun mitPyoder mit_ctypespräfigiert. (Implementiert von Thomas Heller; bpo-3102.)Neue Konfigurationsoption: Der Schalter
--with-system-expaterlaubt das Erstellen des Modulspyexpat, um die systemweite Expat-Bibliothek zu verwenden. (Beigesteuert von Arfrever Frehtes Taifersar Arahesis; bpo-7609.)Neue Konfigurationsoption: Die Option
--with-valgrinddeaktiviert 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
LDCXXSHAREDzur 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¶
Das Modul
msvcrtenthält nun einige Konstanten aus der Header-Dateicrtassem.h:CRT_ASSEMBLY_VERSION,VC_ASSEMBLY_PUBLICKEYTOKENundLIBRARIES_ASSEMBLY_NAME_PREFIX. (Beigesteuert von David Cournapeau; bpo-4365.)Das Modul
_winregzum Zugriff auf die Registrierung implementiert nun die FunktionenCreateKeyEx()undDeleteKeyEx(), erweiterte Versionen der zuvor unterstützten Funktionen, die mehrere zusätzliche Argumente entgegennehmen.DisableReflectionKey(),EnableReflectionKey()undQueryReflectionKey()wurden ebenfalls getestet und dokumentiert. (Implementiert von Brian Curtin: bpo-7347.)Die neue API
_beginthreadex()wird verwendet, um Threads zu starten, und die nativen Thread-Local-Storage-Funktionen werden nun verwendet. (Beigesteuert von Kristján Valur Jónsson; bpo-3582.)Die Funktion
os.kill()funktioniert nun unter Windows. Der Signalwert kann die KonstantenCTRL_C_EVENT,CTRL_BREAK_EVENToder eine beliebige Ganzzahl sein. Die ersten beiden Konstanten senden Control-C- und Control-Break-Tastaturereignisse an Unterprozesse; jeder andere Wert verwendet die APITerminateProcess(). (Beigesteuert von Miki Tebeka; bpo-1220212.)Die Funktion
os.listdir()schlägt nun korrekt fehl für einen leeren Pfad. (Behoben von Hirokazu Yamamoto; bpo-5913.)Das Modul
mimetypesliest nun beim Initialisieren die MIME-Datenbank aus der Windows-Registrierung. (Patch von Gabriel Genellina; bpo-4969.)
Port-spezifische Änderungen: Mac OS X¶
Der Pfad
/Library/Python/2.7/site-packageswird nun ansys.pathangehä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 ansys.pathangehä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_SETFIBvon FreeBSD 7.1, die mit densocket()-Methodengetsockopt()/setsockopt()zum Auswählen einer alternativen Routing-Tabelle verwendet wird, ist nun im Modulsocketverfügbar. (Hinzugefügt von Kyle VanderBeek; bpo-8235.)
Andere Änderungen und Korrekturen¶
Zwei Benchmark-Skripte,
iobenchundccbench, wurden dem VerzeichnisToolshinzugefügt.iobenchmisst die Geschwindigkeit der integrierten Datei-I/O-Objekte, die vonopen()zurückgegeben werden, während verschiedene Operationen ausgeführt werden, undccbenchist 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.pyversteht 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 Attributeco_filenameder 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.pynimmt nun einen Schalter--randseed=entgegen, der eine Ganzzahl akzeptiert, die als Zufallssamen für die Option-rverwendet wird, die Tests in zufälliger Reihenfolge ausführt. Die Option-rberichtet auch den verwendeten Samen (Hinzugefügt von Collin Winter.)Ein weiterer Schalter von
regrtest.pyist-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-Fverwendet 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.pyals 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 vonstr()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 vonobject) 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 keineAttributeErrorauslö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 eineOverflowErroraus. 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 derformat()-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 jetztInvalidOperationanstatt stillschweigend einen wahren oder falschen Wert basierend auf dem Vergleichsoperator zurückzugeben. Ruhige NaN-Werte (oderNaN) sind jetzt hashbar. (Behoben von Mark Dickinson; bpo-7279.)Die Bibliothek
xml.etree.ElementTreemaskiert 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 vonStringIO-Objekten tut nun nichts mehr, wenn eine negative Länge angefordert wird, wie es andere dateiähnliche Objekte tun. (bpo-7348).Das Modul
syslogverwendet nun den Wert vonsys.argv[0]als Identifikator anstelle des vorherigen Standardwerts'python'. (Geändert von Sean Reifschneider; bpo-8451.)Die Standard-Fehlerbehandlung des Moduls
tarfilehat 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
urlparseund seine Funktionurlsplit()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 eineTypeError-Ausnahme aus, anstatt eineDeprecationWarningauszulösen (bpo-5080).Verwenden Sie die neue Funktion
PyOS_string_to_double()anstelle der alten FunktionenPyOS_ascii_strtod()undPyOS_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 FunktionPySys_SetArgv()auftreten konnten. Prüfen Sie, ob SiePySys_SetArgv()aufrufen und überlegen Sie sorgfältig, ob die AnwendungPySys_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,sslunterstützt nun Server Name Indication, TLS1.x-Einstellungen, Zugriff auf den plattformspezifischen Zertifikatsspeicher, die KlasseSSLContextund 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/urandomgecacht wird, anstatt/dev/urandombei jedem Aufruf neu zu öffnen. (Beigetragen von Alex Gaynor; bpo-21305.)hashlib.algorithms_guaranteedundhashlib.algorithms_availablewurden 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.