Python bietet mindestens sechs Möglichkeiten zum Formatieren eines Strings:
In [1]: world = "Earth"
# method 1a
In [2]: "Hello, %s" % world
Out[2]: 'Hello, Earth'
# method 1b
In [3]: "Hello, %(planet)s" % {"planet": world}
Out[3]: 'Hello, Earth'
# method 2a
In [4]: "Hello, {0}".format(world)
Out[4]: 'Hello, Earth'
# method 2b
In [5]: "Hello, {planet}".format(planet=world)
Out[5]: 'Hello, Earth'
# method 2c
In [6]: f"Hello, {world}"
Out[6]: 'Hello, Earth'
In [7]: from string import Template
# method 3
In [8]: Template("Hello, $planet").substitute(planet=world)
Out[8]: 'Hello, Earth'
Eine kurze Geschichte der verschiedenen Methoden:
printf
Formatierung im Stil gibt es seit Pythons Kindheit- Die
Template
Klasse wurde in Python 2.4 eingeführt - Die
format
Methode wurde in Python 2.6 eingeführt f
-strings wurden in Python 3.6 eingeführt
Meine Fragen sind:
- Ist die
printf
Formatierung im Stil veraltet oder wird sie veraltet sein? - In der
Template class
ist diesubstitute
Methode veraltet oder veraltet gehen werden? (Ich spreche nicht darübersafe_substitute
, was meines Wissens einzigartige Fähigkeiten bietet)
Ähnliche Fragen und warum ich denke, dass sie keine Duplikate sind:
Python-String-Formatierung:% vs. .format - behandelt nur die Methoden 1 und 2 und fragt, welche besser ist; Meine Frage bezieht sich ausdrücklich auf die Ablehnung im Lichte des Zen von Python
Zeichenfolgenformatierungsoptionen: Vor- und Nachteile - behandelt nur die Methoden 1a und 1b in der Frage, 1 und 2 in der Antwort und auch nichts über die Ablehnung
Erweiterte Zeichenfolgenformatierung im Vergleich zu Vorlagenzeichenfolgen - hauptsächlich in Bezug auf die Methoden 1 und 3 - und nicht die Ablehnung
String-Formatierungsausdrücke (Python) - In der Antwort wird erwähnt, dass der ursprüngliche '%'-Ansatz veraltet sein soll . Aber was ist der Unterschied zwischen der geplanten Abschreibung , der ausstehenden Abschreibung und der tatsächlichen Abschreibung ? Und die
printf
-style-Methode löst nicht einmal a aus. WirdPendingDeprecationWarning
dies also wirklich veraltet sein? Dieser Beitrag ist auch ziemlich alt, so dass die Informationen möglicherweise veraltet sind.
Formatter
Unterricht vergessen haben ?Antworten:
Während es in den Dokumenten verschiedene Hinweise gibt, dass
.format
und F-Strings Strings überlegen sind%
, gibt es keinen Überlebensplan, um Letzteres jemals zu verwerfen.In Commit- Problem Nr. 14123: Erwähnen Sie ausdrücklich, dass die% -String-Formatierung im alten Stil Vorbehalte aufweist, aber nicht so schnell verschwindet. Durch Ausgabe, inspiriert zeigen , dass es keine aktuellen Pläne deprecate printf-Stil sind die Formatierung , die Dokumentation auf
%
-Formatieren bearbeitet wurden diese Phrase enthalten:(Hervorhebung von mir.)
Dieser Satz wurde später in Commit Close # 4966 entfernt: Überarbeiten Sie die Sequenzdokumente, um den Status des modernen Python besser zu erklären . Dies mag wie ein Zeichen dafür erscheinen, dass ein Plan, die
%
Formatierung zu verwerfen, wieder auf den Karten stand ... aber das Eintauchen in den Bug-Tracker zeigt, dass die Absicht das Gegenteil war. Auf dem Bug - Tracker, der Autor der Commit charakterisiert die Änderung wie folgt aus :Mit anderen Worten, wir haben zwei aufeinanderfolgende Änderungen an den
%
Formatierungsdokumenten vorgenommen, um ausdrücklich zu betonen, dass sie nicht veraltet oder gar entfernt werden. Die Dokumente sind sich weiterhin über die relativen Vorzüge verschiedener Arten der Zeichenfolgenformatierung%
einig , aber es ist auch klar, dass die Formatierung nicht veraltet oder entfernt wird.Darüber hinaus hat die letzte Änderung dieses Absatzes im März 2017 diesen ...
... dazu:
Beachten Sie, dass der Wechsel von "hilft zu vermeiden" zu "hilft zu vermeiden" und wie die klare Empfehlung von
.format
und F-Saiten durch flauschige, zweideutige Prosa darüber ersetzt wurde, wie jeder Stil "seine eigenen Kompromisse und Vorteile bietet" . Das heißt, es ist nicht nur eine formelle Ablehnung nicht mehr auf den Karten, sondern die aktuellen Dokumente erkennen offen an, dass die%
Formatierung zumindest einige "Vorteile" gegenüber den anderen Ansätzen hat.Ich würde daraus schließen, dass die Bewegung,
%
Formatierungen zu verwerfen oder zu entfernen, nicht nur ins Stocken geraten ist, sondern gründlich und dauerhaft besiegt wurde.quelle
%
. Nachdem die Richtlinie "Keine großen Code-Mods" gestrichen wurde, verblassen auch ihre Einwände. Auf lange%
Sicht wird die printf-Syntax ohnehin entfernt, wenn beide Formulare beibehalten werden und keine Vorteile mehr bestehen. Wir wissen nur noch nicht wann, und deshalb war es die Sprache wert, abgeschwächt zu werden.Die neue
.format()
Methode soll die alte%
Formatierungssyntax ersetzen . Letztere wurde de-betont, (aber nicht offiziell als veraltet noch ). In der Methodendokumentation heißt es:(Hervorhebung von mir).
Zur Aufrechterhaltung der Abwärtskompatibilität und macht Übergang zu erleichtern, das alte Format wird an Ort und Stelle gelassen jetzt . Aus dem ursprünglichen PEP 3101-Vorschlag :
Beachten Sie, dass es an der Zeit ist, das ältere System zu verwerfen . Es ist nicht veraltet, aber das neue System muss verwendet werden, wenn Sie neuen Code schreiben .
Das neue System hat den Vorteil, dass Sie den Tupel- und Wörterbuchansatz des alten Formatierers kombinieren können
%
:und ist durch den
object.__format__()
Hook erweiterbar, der zum Formatieren einzelner Werte verwendet wird.Beachten Sie, dass das alte System
%
und dieTemplate
Klasse hatten, wobei letztere es Ihnen ermöglicht, Unterklassen zu erstellen, die ihr Verhalten hinzufügen oder ändern. Das neue System hat dieFormatter
Klasse , die gleiche Nische zu füllen.Python 3 hat sich weiter von der Verwerfung entfernt und gibt stattdessen im Abschnitt "
printf
Formatierung von Zeichenfolgen im Stil" eine Warnung aus :Python 3.6 fügte auch formatierte Zeichenfolgenliterale hinzu , die die Ausdrücke in die Formatzeichenfolgen einfügen. Dies ist die schnellste Methode zum Erstellen von Zeichenfolgen mit interpolierten Werten und sollte verwendet werden, anstatt
str.format()
überall dort, wo Sie ein Literal verwenden können.quelle
Formatter
Sie benutzerdefinierte Formate erstellen, wie siedatetime
Objekte verwenden. Da.format
es sich um eine Funktion handelt, können Sie sie auch verwenden, um eine aufrufbare verzögerte Formatierung direkter zu erstellen: z. B.fmt = '{} - {}'.format; fmt(a, b)
Template
es mit%
oder mit dem alten System zusammenhängt . Insbesondere der PEP, den Sie verknüpfen, besagt, dass es zwar einige Überschneidungen zwischen diesem Vorschlag und gibtstring.Template
, es jedoch den Eindruck gibt, dass jeder einem bestimmten Bedarf dient und dass einer den anderen nicht umgeht. In Ihrer Antwort kann man verwirrt sein, dass dieTemplate
Formatierung, die Teil des alten Systems ist, ebenfalls veraltet ist.Formatter
Klasse die gleichen Bedürfnisse erfüllen wiestring.Template()
.[...]should be preferred to the % formatting[...]
Dieser Teil wurde aus der Dokumentation entfernt. docs.python.org/3/library/stdtypes.html#str.formatDer
%
Operator für die Formatierung von Zeichenfolgen ist nicht veraltet und wird trotz der anderen Antworten nicht entfernt.Jedes Mal, wenn das Thema auf der Python-Entwicklungsliste angesprochen wird, gibt es starke Kontroversen darüber, was besser ist, aber keine Kontroversen darüber, ob der klassische Weg entfernt werden soll - es wird bleiben. Obwohl Python 3.1 auf PEP 3101 bezeichnet wurde, war es gekommen und gegangen, und die
%
Formatierung ist immer noch vorhanden.Die Aussagen zur Beibehaltung des klassischen Stils sind klar: Es ist einfach, es ist schnell, es ist schnell für kurze Dinge zu tun. Die Verwendung der
.format
Methode ist nicht immer besser lesbar - und kaum jemand - selbst unter den Kernentwicklern - kann die vollständige Syntax verwenden, die von bereitgestellt wird,.format
ohne auf die Referenz achten zu müssen. Bereits 2009 hatte man Nachrichten wie diese: http: // mail. python.org/pipermail/python-dev/2009-October/092529.html - das Thema war seitdem kaum in den Listen aufgetaucht .Update 2016
In der aktuellen Python-Entwicklungsversion (die zu Python 3.6 wird) gibt es eine dritte Methode zur String-Interpolation, die in PEP-0498 beschrieben wird . Es definiert eine neue Quote Präfix
f""
(neben der aktuellenu""
,b""
undr""
).Durch das Präfixieren eines Strings durch
f
wird zur Laufzeit eine Methode für das String-Objekt aufgerufen, die automatisch Variablen aus dem aktuellen Bereich in den String interpoliert:quelle
__format__
. Zum Beispielformat(Decimal('0.1'), '.20f')
vs'%.20f' % Decimal('0.1')
. Letzteres zwingt die Dezimalstelle zu einem Float.f
in Python 3?f-strings
oben verwendeten sind neue Funktionen in der Sprache ab Python 3.6. Es ist in früheren Versionen nicht vorhanden und löst bei diesen einen Syntaxfehler aus.Guidos jüngste Position dazu scheint hier angegeben zu sein:
Was ist neu in Python 3.0?
Und das PEP3101 selbst, dessen letzte Modifikation auf (Fr, 30. September 2011) zurückgeht, also vermutlich in letzter Zeit keine Fortschritte.
quelle
In Bezug auf die älteren Python-Dokumente und PEP 3101 wurde festgestellt, dass der Operator% in Zukunft veraltet und aus der Sprache entfernt wird. Die folgende Anweisung war in den Python-Dokumenten für Python 3.0, 3.1 und 3.2 enthalten:
Wenn du zum gehst in Python 3.3- und 3.4-Dokumenten selben Abschnitt , sehen Sie, dass diese Anweisung entfernt wurde. Ich kann auch nirgendwo anders in der Dokumentation eine andere Aussage finden, die darauf hinweist, dass der Operator veraltet oder aus der Sprache entfernt wird. Es ist auch wichtig zu beachten, dass PEP3101 seit mehr als zweieinhalb Jahren nicht mehr geändert wurde (Fr, 30. September 2011).
Aktualisieren
PEP461 Das Hinzufügen von% Formatierung zu Bytes und Bytearray wird akzeptiert und sollte Teil von Python 3.5 oder 3.6 sein. Dies ist ein weiteres Zeichen dafür, dass der% -Operator lebt und tritt.
quelle