% Formatierung vs mystr.format()

Hallo, die Formatierung mit format() hat sicherlich Vorteile, die alte Methode finde ich jedoch einiges kompakter und darum finde ich sie in der Regel besser. In einer alten Version der Doku steht, das die % Formatierung deprecated ist: http://docs.python.org/release/3.1.5/library/stdtypes.html#old-string-format... In einer neuen Version konnte ich diese Stelle nicht mehr finden. Nur einen Abschnitt der die Nachteile der % Methode erläutert: http://docs.python.org/3/library/stdtypes.html#printf-style-string-formattin... Ich gehe davon aus, dass die % Methode *nicht* mehr deprecated ist. Oder soll das wirklich abgeschafft werden? Ich persönlich finde es nicht sinnvoll bei bestehenden Projekten die % Formatierung durch die format-Methode zu ersetzen. Wie seht ihr das? Gruß, Thomas -- Thomas Guettler http://www.thomas-guettler.de/

Hallo,
die Formatierung mit format() hat sicherlich Vorteile, die alte Methode finde ich jedoch einiges kompakter und darum finde ich sie in der Regel besser.
In einer alten Version der Doku steht, das die % Formatierung deprecated ist:
http://docs.python.org/release/3.1.5/library/stdtypes.html#old-string-
Thomas Guettler wrote: formatting-operations
In einer neuen Version konnte ich diese Stelle nicht mehr finden. Nur einen Abschnitt der die Nachteile der % Methode erläutert:
http://docs.python.org/3/library/stdtypes.html#printf-style-string-
formatting
Ich gehe davon aus, dass die % Methode *nicht* mehr deprecated ist. Oder soll das wirklich abgeschafft werden?
Nein, siehe auch http://bugs.python.org/issue14123
Ich persönlich finde es nicht sinnvoll bei bestehenden Projekten die % Formatierung durch die format-Methode zu ersetzen.
D'accord.
Wie seht ihr das?
Ich verwende die alte Methode immer, wenn ich zu faul bin, die Position von "!" und ":" im interactive interpreter zu überprüfen ;) Das einzige Problem mit %, das ich sehe, ist die Sonderbehandlung von (Nicht-)Tupeln:
for value in 1, "2", (3, "3"): ... print "value=%r" % value ... value=1 value='2' Traceback (most recent call last): File "<stdin>", line 2, in <module> TypeError: not all arguments converted during string formatting

Hallo Thomas, On 2013-09-03 17:15, Thomas Guettler wrote:
die Formatierung mit format() hat sicherlich Vorteile, die alte Methode finde ich jedoch einiges kompakter und darum finde ich sie in der Regel besser. [...] Ich persönlich finde es nicht sinnvoll bei bestehenden Projekten die % Formatierung durch die format-Methode zu ersetzen. Wie seht ihr das?
ich habe eine schwache Bevorzugung der `format`-Variante, auch, wenn sie in vielen Fällen etwas mehr Schreibarbeit benötigt. Die Ersetzung von `%`-Formatierung durch `format`-Formatierung in bestehenden Projekten sehe ich ähnlich wie die Ersetzung von `try ... finally` durch `with` (in den Fällen, wo es um Ressourcen-Freigabe geht): Man muss keine Änderung vornehmen, aber die neue Notation erscheint mir sauberer. Davon abgesehen, kann `format` noch ein bisschen mehr, als nur besser mit Tupeln umgehen. Zum Beispiel ist so etwas möglich:
"{0}, {1} - und noch mal {0}".format(1, 2) '1, 2 - und noch mal 1'
d = {"a": 1, "b": 2} "{0[a]} und {0[b]}".format(d) '1 und 2'
class X(object): pass ... x = X() x.a = 3 x.b = 4 "{0.a} und {0.b}".format(x) '3 und 4'
oder auch "gemischt":
"{0[a]} und {1.b}".format(d, x) '1 und 4'
Viele Grüße Stefan

Stefan Schwarzer, 04.09.2013 23:15:
Davon abgesehen, kann `format` noch ein bisschen mehr, als nur besser mit Tupeln umgehen. Zum Beispiel ist so etwas möglich:
"{0}, {1} - und noch mal {0}".format(1, 2) '1, 2 - und noch mal 1'
d = {"a": 1, "b": 2} "{0[a]} und {0[b]}".format(d) '1 und 2'
Das kannst du mit %-Formatierung auch schon: >>> '%(a)s + %(b)s = %(a)s' % dict(a=1, b=0) '1 + 0 = 1'
class X(object): pass ... x = X() x.a = 3 x.b = 4 "{0.a} und {0.b}".format(x) '3 und 4'
Das geht mit %-Formatierung wirklich nicht. Ist manchmal ganz nett. Allerdings kannst du sowas machen wie >>> '%(a)s + %(b)s = %(a)s' % vars(x) '3 + 4 = 3' Ansonsten gibt es auch noch string.Template(): >>> import string >>> t = string.Template('$a + $b = $a') >>> t.substitute(a=1, b=0) '1 + 0 = 1' Das string.Template() ist besonders schnell wenn ich es öfter brauche, da der Formatierungstext nicht jedes Mal neu geparst werden muss. Kann aber keine Zahlenformatierung etc. Bei übersetzten Projekten brauche ich da aber eh Babel (oder irgend ein anderes I18n-Tool), da hilft mir sowas wie "%.2f" oder .format() nicht weiter. Ich benutze inzwischen alle drei mal hier und mal da. Die .format() Syntax ist vor allem bei übersetztem Text praktisch, da "Nutzbar für {timeframe}" für die Übersetzer lesbarer und weniger fehleranfällig ist als "Nutzbar für %(timeframe)s" Stefan
participants (4)
-
Peter Otten
-
Stefan Behnel
-
Stefan Schwarzer
-
Thomas Guettler