Этот код:Python не работает с текстом, содержащий JSON
'From {"value": 1}, value={value}'.format(value=1)
терпит неудачу, как следующее (Python 2.7.12 и Python 3.6.x):
Traceback (most recent call last):
File "test_format.py", line 1, in <module>
'From {"value": 1}, value={value}'.format(value=1)
KeyError: '"value"
интерпретатор Python жалуется, что "value"
не было передано в аргументах для метода format
.
Но согласно format string syntax:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name ::= arg_name ("." attribute_name | "[" element_index "]")*
arg_name ::= [identifier | integer]
attribute_name ::= identifier
element_index ::= integer | index_string
index_string ::= <any source character except "]"> +
conversion ::= "r" | "s"
format_spec ::= <described in the next section>
replacement_field, который в данном случае состоит в идентификатор, не должны иметь кавычки. Вот лексическое определение для идентификатора:
identifier ::= (letter|"_") (letter | digit | "_")*
letter ::= lowercase | uppercase
lowercase ::= "a"..."z"
uppercase ::= "A"..."Z"
digit ::= "0"..."9"
Итак, в соответствии со спецификацией, {value}
должны быть признаны в качестве действительного идентификатора строки формата и {"value"}
следует игнорировать.
Возможно, Python не соответствует спецификации в документации. Что-либо внутри ключей принимается как идентификатор.
Почему python ведет себя так? Что мне здесь не хватает?
Почему вы пытаетесь создать JSON с использованием '.format()' в первую очередь? Используйте модуль 'json'. – Barmar
«{» значение «}' не может рассматриваться как поле замены, потому что «значение» является выражением, но не ключевым словом, цитата не разрешена. – LuCima
@LuCima См. Traceback, Python жалуется на аргумент с именем '" value "' –