String-Formatter Inhalt

Python bietet mit den sogenannten String Formatting Operations eine ganz einfache Möglichkeit, Strings und Werte zusammenzusetzen. Fast eine Art Template-System.

So sollte man es nicht machen:

   1 print "Das Ergebnis: " + wert + "! (Erstellt in " + str(duration) + " Sek.)"

Das ist nicht nur umständlich, weil man z.B. str() verwenden muss, um eine Zahl mit dem Text zu "verbinden", sondern auch unübersichtlich.

Werte als Tupel angeben

Stattdessen kann man im String Platzhalter einbauen und die Werte als Tupel dem %-Operator (der hier natürlich nicht für die Modulo-Operation steht) übergeben:

   1 print "Das Ergebnis: %s! (Erstellt in %s Sek.)" % (wert, duration)

Dabei werden beim Platzhalter %s alle Werte automatisch zu einem String konvertiert.

Hat man nur einen Wert zu übergeben, kann man sich das Tupel sparen (man sollte sich in diesem Fall allerdings sicher sein, dass der Wert an sich kein Tupel ist...):

   1 print "Das Beispiel: %s ist doof." % wert

Ausgaben formatieren

Neben %s gibt es noch eine ganze Reihe anderer Platzhalter. Die wichtigsten im Überblick (eine vollständige Liste steht in der Dokumentation):

   1 print "float: %f" % 1.234567
   2 print "...gerundet auf zwei Stellen: %.2f" % 1.234567

Ausgaben:

float: 1.234567
...gerundet auf zwei Stellen: 1.23

Weiteres Beispiel:

   1 bsp = ("a", "bbb", "ccccccc")
   2 
   3 print
   4 print "Liste unformatiert:"
   5 for no, txt in enumerate(bsp):
   6     print no, txt
   7 
   8 print
   9 print "Liste formatiert 1:"
  10 for no, txt in enumerate(bsp):
  11     print "%03d - |%7s|" % (no, txt)
  12 
  13 print
  14 print "Liste formatiert 2:"
  15 for no, txt in enumerate(bsp):
  16     print "%03d - |%-7s|" % (no, txt)

Ausgaben:

Liste unformatiert:
a
bbb
ccccccc

Liste formatiert 1:
- |      a|
- |    bbb|
- |ccccccc|

Liste formatiert 2:
- |a      |
- |bbb    |
- |ccccccc|

Im Wiki haben wir noch ein Beispiel wie man Zahlen mit Tausenderpunkt und Nachkommastellen formatieren kann.

Werte als dict angeben

Wenn man viele Werte hat, wird eine Übergabe in einem Tupel schnell unübersichtlich. In dem Fall kann man besser das ganze über ein dict übergeben.

   1 html = '''\
   2 <table>
   3     <tr>
   4         <td align="center"><b>%(info_text)s</b></td>
   5         <td align="center"><b>%(version)s</b></td>
   6         <td align="center"><b>%(datum)s</b></td>
   7     </tr>
   8 </table>''' % {
   9     "info_text": "Ein dummes Beispiel",
  10     "version": "1.0",
  11     "datum": datetime.now(),
  12 }
  13 print html

Vorsicht: der Typbuchstabe (hier "s") nach dem geklammerten Wertnamen wird gerne mal vergessen...

Templates

Ist einem die dict-Variante nicht einfach genug, bietet Python ab Version 2.4 auch die sogenannten Template Strings an, die in PEP 292 beschrieben werden.

   1 from string import Template
   2 from datetime import datetime
   3 
   4 template = Template('''\
   5 <table>
   6     <tr>
   7         <td align="center"><b>$info_text</b></td>
   8         <td align="center"><b>$version</b></td>
   9         <td align="center"><b>$datum</b></td>
  10     </tr>
  11 </table>''')
  12 
  13 mapping = {
  14     "info_text": "Ein dummes Beispiel",
  15     "version": "1.0",
  16     "datum": datetime.now(),
  17 }
  18 html = template.substitute(mapping)
  19 print html

Wie man sehen kann, leistet dies im Grunde das gleiche wie die dict-Variante. Jedoch bietet es einige zusätzliche Features. Beispielsweise dürfen mit der Option safe_substitute Werte auch fehlen -- bei der normalen String-Formatting-Operation würde ein KeyError ausgelöst werden.

Beispiel (Das datum fehlt):

   1 from string import Template
   2 
   3 template = Template('''\
   4 <table>
   5     <tr>
   6         <td align="center"><b>$info_text</b></td>
   7         <td align="center"><b>$version</b></td>
   8         <td align="center"><b>$datum</b></td>
   9     </tr>
  10 </table>''')
  11 
  12 mapping = {
  13     "info_text": "Ein dummes Beispiel",
  14     "version": "1.0",
  15 }
  16 html = template.safe_substitute(mapping)
  17 print html

Ausgaben:

<table>
    <tr>
        <td align="center"><b>Ein dummes Beispiel</b></td>
        <td align="center"><b>1.0</b></td>
        <td align="center"><b>$datum</b></td>
    </tr>
</table>

Echte Template-Sprachen

Will man komplexere Formatierungen erstellen, z.B. mit Schleifen, kommt man mit den hier vorgestellten Lösungen nicht weiter. Dazu muss man eine echte Templatesprache verwenden.

Mehr dazu: Template-Engines

Tags: Codesnippets | Tipps | String

String-Formatter (zuletzt geändert am 2009-06-17 16:14:22 durch anonym)