2017-09-11 1 views
11

Ich habe Probleme mit format mit einer Zeichenfolge, die wie ein Python-Wörterbuch aussieht.Warum interpretiert Python diese Zeichenfolge beim Formatieren als Wörterbuch?

Ich möchte die folgende Zeichenfolge generieren: {"one":1} Wenn ich versuche, es zu tun, wie:

'{"one":{}}'.format(1) 

der Dolmetscher wirft einen KeyError:

>>> a = '{"one":{}}'.format(1) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: '"one"' 

Ich verstehe, dass das Problem wahrscheinlich dreht sich um die Tatsache, dass die Zeichenfolge { enthält, die mit format{} verwechselt werden kann. Warum passiert das genau und wie kann es gelöst werden?

Ich kenne die prozentuale Formatierung, aber ich würde gerne eine Lösung finden, die keine format() Grabenbildung beinhaltet.

+0

Beachten Sie als Prozentsatz Formatierung ist schneller: format = ,7228269569986878,% = ,03355357599866693 (Ergebnis der 'timeit.timeit 'auf Ihrem Beispiel) –

+0

@YaroslavSurzhikov Wenn Sie nicht riesige Mengen an Saiten generieren, glaube ich nicht, dass das wirklich zählt. – JAB

+0

Wenn Sie eine Zeichenkette aus einem Wörterbuch erstellen möchten, betrachten Sie 'str ({" eins ": 1})'. – marcelm

Antwort

15

Die Formatierung von '{"one": {}}' ist using an identifier as the field_name und wird im Wesentlichen versuchen, für ein Keyword Argument zu suchen, die zu .format geliefert worden sind und haben den Namen '"one"'.

Als docs Zustand:

The field_name itself begins with an arg_name that is either a number or a keyword. If it’s a number, it refers to a positional argument, and if it’s a keyword, it refers to a named keyword argument.

(Hervorhebung von mir)

Das ist, warum Sie die KeyError Ausnahme erhalten; Es versucht, nach einem Schlüssel in der Zuordnung von Schlüsselwortargumenten zu suchen, die an format bereitgestellt werden. (was in diesem Fall leer ist, daher der Fehler).

Als Lösung entkommen nur die äußeren geschweiften Klammern:

>>> '{{"one":{}}}'.format(1) 
'{"one":1}' 

Das gleiche Mittel gilt, wenn Sie sich mit f -Strings in Zukunft entscheiden:

>>> f'{{"one": {1}}}' 
'{"one": 1}' 
+1

Ah! Ich wusste, dass die Flucht das Problem war, aber ich benutzte '\', um zu entkommen, nicht doppelte geschweifte Klammern. Vielen Dank! – user2891462

11

Sie geschweiften Klammern verdoppelt müssen {{}}, um geschweifte Klammern in der Zeichenfolgenformatierung zu umgehen.

a= '{{"one":{}}}'.format(1) 

von doc:

Format strings contain “replacement fields” surrounded by curly braces {} . Anything that is not contained in braces is considered literal text, which is copied unchanged to the output. If you need to include a brace character in the literal text, it can be escaped by doubling: {{ and }}.

Wenn Sie Klammern nicht entkommen, str.format() wird für den Wert der Schlüssel '"one"' suchen die Zeichenfolge zu formatieren. Zum Beispiel:

b = '{"one"} foo'.format(**{'"one"':1}) 
print(b) # 1 foo 
1

Zahnspange kann durch die Verwendung von zwei Klammern, die Verwendung entwertet werden:

'{{"one":{}}}'.format(1) 
Verwandte Themen