Почему Python интерпретирует эту строку как словарь при форматировании?

У меня возникают проблемы с использованием format со строкой, которая выглядит как словарь Python.

Я хочу сгенерировать следующую строку: {"one":1} Если я попытаюсь сделать это как:

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

интерпретатор бросает KeyError:

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

Я понимаю, что проблема, вероятно, связана с тем, что строка содержит {, которую можно путать с format {}. Почему это происходит точно и как это можно решить?

Я знаю процентное форматирование, но я хотел бы найти решение, которое не включает канавку format().

Ответ 1

Форматирование '{"one": {}}' с использованием идентификатора как field_name и по существу попытается найти аргумент ключевого слова, который был подается на .format и имеет имя '"one"'.

Как указано в документах:

Сама field_name начинается с arg_name, которая является либо числом, либо ключевым словом. Если это число, это относится к позиционному аргументу, и если это ключевое слово, оно ссылается на именованный аргумент ключевого слова.

(акцент мой)

Вот почему вы получаете исключение KeyError; он пытается найти ключ в сопоставлении аргументов ключевого слова, предоставленных format. (который в этом случае пуст, следовательно, ошибка).

В качестве решения просто избегайте внешних фигурных скобок:

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

То же самое средство защиты применяется, если вы решите использовать f -строки в будущем:

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

Ответ 2

Вам нужно удвоить фигурные скобки {{ }}, чтобы избежать фигурных скобок в форматировании строк.

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

from doc:

Строки формата содержат "поля замены", окруженные фигурными фигурными скобками {}. Все, что не содержится в фигурных скобках, считается буквальным текст, который не изменяется на выходе. Если вам нужно включить символ скобки в буквальном тексте, он может быть экранирован удвоением: {{ и }}.

Если вы не удаляете скобки, str.format() будет искать значение ключа '"one"' для форматирования строки. Например:

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

Ответ 3

Скобки могут быть экранированы с помощью двойных фигурных скобок, используйте:

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