[Python-de] % Formatierung vs mystr.format()

Stefan Behnel python-de at behnel.de
Do Sep 5 06:13:36 CEST 2013


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



Mehr Informationen über die Mailingliste python-de