2013-10-29 9 views
6

Ist es möglich, Pythons str.format(key=value) Syntax zu verwenden, um nur bestimmte Schlüssel zu ersetzen.Wie kann ich die Formatzeichenfolge umgehen?

dieses Beispiel vor:

my_string = 'Hello {name}, my name is {my_name}!' 

my_string = my_string.format(name='minerz029') 

die

KeyError: 'my_name' 

zurück Gibt es eine Möglichkeit, dies zu erreichen?

Antwort

0

Ein bisschen einfacher Problemumgehung, die ich benutze:

my_string = 'Hello {name}, my name is {my_name}!' 

to_replace = { 
    "search_for" : "replace_with", 
    "name" : "minerz029", 
} 

for search_str in to_replace: 
    my_string = my_string.replace('{' + search_str + '}', to_replace[search_str]) 

print(my_string) 

Diese leicht mit mehr Tasten in der to_replace dict erweitert werden kann, und beschweren sich gewohnt, auch wenn der Suchbegriff nicht existiert. Es könnte wahrscheinlich verbessert werden, um mehr von .format() Features zu bieten, aber es war genug für mich.

14

Sie können my_name mit doppelseitigem geschweiften Klammern entkommen, wie diese

>>> my_string = 'Hello {name}, my name is {{my_name}}!' 
>>> my_string.format(name='minerz029') 
'Hello minerz029, my name is {my_name}!' 

Wie Sie nach einmaliger Formatierung sehen kann, wird die äußere {} entfernt und {{my_name}} wird {my_name}. Wenn Sie später my_name formatieren möchten, können Sie es einfach wieder formatiert werden, wie dies

>>> my_string = 'Hello {name}, my name is {{my_name}}!' 
>>> my_string = my_string.format(name='minerz029') 
>>> my_string 
'Hello minerz029, my name is {my_name}!' 
>>> my_string.format(my_name='minerz029') 
'Hello minerz029, my name is minerz029!' 
+1

Aber ich muss '.format()' 'my_name' später. – minerz029

6

python3.2 + format_map hat mit dem Sie tun, um diese

>>> class D(dict): 
...  def __missing__(self, k):return '{'+k+'}' 
... 
>>> my_string = 'Hello {name}, my name is {my_name}!' 
>>> my_string.format_map(D(name='minerz029')) 
'Hello minerz029, my name is {my_name}!' 
>>> _.format_map(D(my_name='minerz029')) 
'Hello minerz029, my name is minerz029!' 

Jetzt ist es nicht notwendig, zusätzliche hinzuzufügen {} nur die Tasten, die Sie D bieten wird

Wie @steveha weist darauf hin, ersetzt werden, wenn Sie auf einem älteren Python3 sind Sie noch

können
+0

Ich habe das gerade getestet, und Sie brauchen nicht 'str.format_map (d)'; Sie können 'str.format (** d)' verwenden und es funktioniert gut. '.format_map()' ist jedoch effizienter, da keine Kopie des Diktats erstellt werden muss. – steveha

+0

@steveha, in Python2 konvertiert es immer noch zu einem 'dict', aber es funktioniert ok für Python3 –

+0

Richtig ... Ich habe in Python3 getestet. Python2 hat keine '.format_map()'. Ich meinte nur, dass in Python-Versionen, die '.format_map()' haben, du stattdessen 'str.format (** d)' verwenden kannst und es auch funktioniert. Tut mir leid, dass ich das nicht geschrieben habe. – steveha

Verwandte Themen