Почему 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)