2015-08-06 16 views
5

mit Ich bin mit dem folgenden Code:Format: KeyError wenn geschweiften Klammern in Strings

asset = {} 
asset['abc'] = 'def' 
print type(asset) 
print asset['abc'] 
query = '{"abc": "{abc}"}'.format(abc=asset['abc']) 
print query 

, die einen KeyError Fehler auslöst:

[[email protected]] : ~/Documents/vision/inputs/perma_sniff $ python ~/test.py 
<type 'dict'> 
def 
Traceback (most recent call last): 
    File "/home/user/test.py", line 5, in <module> 
    query = '\{"abc": "{abc}"\}'.format(abc=asset['abc']) 
KeyError: '"abc"' 

Format wird offensichtlich durch die Verpackung { verwirrt. Wie kann ich sicherstellen, dass Format versucht nur das (korrekte) innere {abc} zu ersetzen.

dh erwartete Ausgabe ist:

{"abc": "def"} 

(.. Ich bin bewusst, dass ich das json Modul für diese Aufgabe verwenden könnte, aber ich will, dass vermeiden, ich würde viel lieber Format verwenden)

Antwort

14

Um eine wörtliche Klammer einzufügen, verdoppeln bis:

query = '{{"abc": "{abc}"}}'.format(abc=asset['abc']) 

(Dies ist here dokumentiert, aber nicht besonders offensichtlich hervorgehoben).

2

die äußeren Klammern in Klammern wickeln:

query = '{{"abc": "{abc}"}}'.format(abc=asset['abc']) 
print query 
{"abc": "def"} 
+1

denken, dass Ihre Doppel schließen Klammer auf der falsche ist. sollte sein: ''{{" abc ":" {abc} "}}' – tom

+0

@tom, yep, Tippfehler behoben –

0

Die obersten geschweiften Klammern als Platzhalter Schlüssel in Ihrem String interpretiert werden, so erhalten Sie die KeyError. Sie müssen sie so entkommen:

asset = {} 
asset['abc'] = 'def' 
query = '{{"abc": "{abc}"}}'.format(**asset) 

Und dann:

>>> print query 
{"abc": "def"} 
Verwandte Themen