2013-07-25 13 views
7

Ist es möglich, ein Wort mit der Formatierung von Zeichenfolgen zu formatieren? Zum BeispielPython: Groß-/Kleinschreibung eines Wortes mit string.format()

"{user} did such and such.".format(user="foobar") 

sollte "Foobar hat so und so."

Beachten Sie, dass mir .capitalize() bekannt ist; aber hier ist eine (sehr vereinfachte Version) Code Ich verwende:

printme = random.choice(["On {date}, {user} did la-dee-dah. ", 
         "{user} did la-dee-dah on {date}. " 
         ]) 

output = printme.format(user=x,date=y) 

Wie Sie sehen können, nur user als x.capitalize() im .format() definieren, funktioniert nicht, da dann wäre es auch (falsch angewendet werden) zum ersten Szenario. Und da ich das Schicksal nicht vorhersagen kann, gibt es keine Möglichkeit zu wissen, welches random.choice im Voraus ausgewählt wurde. Was kann ich tun?

addt'l Anmerkung: Gerade output = random.choice(['xyz'.format(),'lmn'.format()]) (in anderen Worten, jede Zeichenfolge Formatierung einzeln und dann .capitalize() für diejenigen verwenden, die es brauchen) tun, ist kein gangbarer Weg, da printme von tatsächlich ist die Wahl ~ 40 + Zeichenfolgen

+0

Warum sind Sie beliebig recasing Benutzernamen? –

+0

@ IgnacioVazquez-Abrams Benutzername ist eigentlich gleich einem Benutzernamen ** oder ** ein Pronomen - für Pronomen würde man sie nicht immer groß schreiben. – tehsockz

+0

Warte ... du würdest die Anzeige eines Benutzernamens ändern, aber kein Pronomen? Warum würdest du das tun? Die Leute erwarten, dass ihre Benutzernamen genau so sind, wie sie es in die Box eingegeben haben. – user2357112

Antwort

5

Sie können Ihre eigene Unterklasse von string.Formatter erstellen, mit der Sie eine benutzerdefinierte conversion erkennen können, die Sie verwenden können, um Ihre Strings neu zu schreiben.

myformatter.format('{user!u} did la-dee-dah on {date}, and {pronoun!l} liked it. ', 
         user=x, date=y, pronoun=z) 
+2

Und nur als Referenz, falls jemand diese Frage hat, [hier ist die Funktion, die geändert werden muss] (http://hg.python.org/cpython/file/2.7/Lib/string.py#l602). – tehsockz

+1

s/geändert/overridden/ –

4

können Sie zusätzliche Werte übergeben und nur sie nicht benutzen, wie diese leichte Option

printme = random.choice(["On {date}, {user} did la-dee-dah. ", 
         "{User} did la-dee-dah on {date}. " 
         ]) 

output = printme.format(user=x, date=y, User=x.capitalize()) 

Die beste Wahl hängt wahrscheinlich, ob Sie diese genug tun, Ihren eigenen fullblown Formatter müssen.

+2

Ich mag diesen Ansatz! Ja, ich mache es in einem größeren Maßstab (mehr als 600 Nachrichten und verschiedene Funktionen - nicht nur Großschreibung), so dass es nicht wirklich auf meine Situation passt, aber immer noch etwas zu beachten. – tehsockz

0

Wie gesagt @ IgnacioVazquez-Abrams, erstellen Sie eine Unterklasse von string.Formatter können Sie die Formatzeichenfolge Verarbeitung zu erweitern/ändern.

In Ihrem Fall müssen Sie die convert_field -Methodenüberladung

from string import Formatter 
class ExtendedFormatter(Formatter): 
    """An extended format string formatter 

    Formatter with extended conversion symbol 
    """ 
    def convert_field(self, value, conversion): 
     """ Extend conversion symbol 
     Following additional symbol has been added 
     * l: convert to string and low case 
     * u: convert to string and up case 

     default are: 
     * s: convert with str() 
     * r: convert with repr() 
     * a: convert with ascii() 
     """ 

     if conversion == "u": 
      return str(value).upper() 
     elif conversion == "l": 
      return str(value).lower() 
     # Do the default conversion or raise error if no matching conversion found 
     super(ExtendedFormatter, self).convert_field(value, conversion) 

     # return for None case 
     return value 


# Test this code 

myformatter = ExtendedFormatter() 

template_str = "normal:{test}, upcase:{test!u}, lowcase:{test!l}" 


output = myformatter.format(template_str, test="DiDaDoDu") 
print(output) 
Verwandte Themen