2017-09-11 47 views
11

Mam problemy z używaniem format z ciągiem, który wygląda jak słownik Python.Dlaczego Python interpretuje ten ciąg jako słownik podczas formatowania?

Chcę, aby wygenerować następujący ciąg: {"one":1} Gdy próbuję to zrobić jak:

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

interpreter rzuca KeyError:

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

Rozumiem, że problem prawdopodobnie obraca się wokół fakt, że ciąg zawiera {, który można pomylić z 's {}. Dlaczego tak się dzieje dokładnie i jak można go rozwiązać?

Znam formatowanie procentowe, ale chciałbym znaleźć rozwiązanie, które nie wymaga porzucenia format().

+0

Pamiętaj niż procentach formatowanie jest szybsze: format = ,7228269569986878,% = ,03355357599866693 (wynikiem 'timeit.timeit 'na twoim przykładzie) –

+0

@YaroslavSurzhikov Chyba że generujesz ogromne ilości ciągów, nie uważam, że to naprawdę ma znaczenie. – JAB

+0

Jeśli chcesz utworzyć ciąg słownika, rozważ 'str ({" jeden ": 1})'. – marcelm

Odpowiedz

15

Formatowanie '{"one": {}}' jest using an identifier as the field_name i będzie zasadniczo próbować szukać argumentów słowa kluczowego, które zostało dostarczonych do .format i ma nazwę '"one"'.

Jak stanu dokumentów:

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.

(Kopalnia nacisk)

Dlatego masz wyjątek KeyError; próbuje wyszukać klucz w odwzorowaniu argumentów słów kluczowych dostarczonych pod numer format. (która w tym przypadku jest pusta, stąd błąd).

Jako rozwiązanie, po prostu uciec zewnętrzne nawiasy klamrowe:

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

Ten sam środek ma zastosowanie, jeśli zdecydujesz się na użyciu f -strings w przyszłości:

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

Ah! Wiedziałem, że problemem jest ucieczka, ale użyłem "\" do ucieczki, a nie podwójnych nawiasów klamrowych. Dzięki! – user2891462

11

co potrzeba dwukrotnie nawiasy klamrowe {{}}, aby uciec przed nawiasami klamrowymi w formatowaniu ciągów.

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

z 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 }}.

Jeśli nie uciec szelki, str.format() będzie szukał wartości klucza '"one"' sformatować ciąg. Na przykład:

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

Szelki można uciec za pomocą podwójne szelki, przeznaczenie:

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