2015-08-06 15 views
5

biegnę następujący kod:Format: KeyError przy użyciu nawiasów klamrowych w ciągach

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

Które wyrzuca błąd KeyError:

[[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 jest oczywiście coraz mylić przez zawijania {. Jak mogę się upewnić, że format próbuje jedynie zastąpić (poprawny) wewnętrzny {abc}.

czyli oczekiwany wynik to:

{"abc": "def"} 

(.. Jestem świadomy mogę użyć modułu json dla tego zadania, ale chcę uniknąć, że ja dużo raczej używać formatu)

Odpowiedz

14

Aby wstawić dosłownego klamra, dwukrotnie go:

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

(to udokumentowane here, ale nie szczególnie wyraźnie podkreślono).

2

owinąć zewnętrzne nawiasy w nawiasach:

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

że Twój blisko dwukrotnie klamra jest na niewłaściwym jeden. powinno być: ''{{" abc ":" {abc} "}}'' – tom

+0

@tom, yep, poprawiono literówkę –

0

najwyższej nawiasy klamrowe są interpretowane jako klucza zastępczego wewnątrz Twojego ciąg, dzięki czemu można uzyskać KeyError. Musisz uciec je tak:

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

, a następnie:

>>> print query 
{"abc": "def"} 
Powiązane problemy