Ce code :
'From {"value": 1}, value={value}'.format(value=1)
Les échecs sont les suivants (Python 2.7.12 et 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"
L'interpréteur Python se plaint que "value"
n'a pas été passé dans les arguments pour format
méthode.
Mais selon le syntaxe de la chaîne de format :
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>
El champ_de_remplacement qui, dans ce cas, est composé d'une identifiant Je n'aurais pas dû. guillemets . Voici la définition lexicale d'un identifiant :
identifier ::= (letter|"_") (letter | digit | "_")*
letter ::= lowercase | uppercase
lowercase ::= "a"..."z"
uppercase ::= "A"..."Z"
digit ::= "0"..."9"
Donc selon la spécification, {value}
doit être reconnu comme un identifiant de chaîne de format valide et {"value"}
doivent être ignorés.
Python semble ne pas suivre les spécifications de la documentation. Tout ce qui se trouve à l'intérieur des clés est accepté comme identifiant .
Pourquoi python se comporte-t-il ainsi ? Qu'est-ce qui m'échappe ici ?