2017-02-20 3 views
2

にこのコードを含むテキストでは動作しません: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はそのように動作しますか?私はここで何が欠けていますか?

+1

なぜ最初に '.format()'を使ってJSONを作成しようとしていますか? 'json'モジュールを使います。 – Barmar

+0

"value"は式であるがキーワードではないので、引用符は許可されないので、 '{" value "}"は置換フィールドとして扱うことができません。 – LuCima

+0

@LuCimaトレースバックを参照してください。Pythonは '' value "'という名前の引数を苦情を申し立てています –

答えて

3

あなたは、出力の実際の括弧{}を持っているしたい場合は、この実行する必要があります。everythin引数として括弧内の{}

'{{"value": 1}}, {}'.format(0) 

フォーマットのお菓子を。角括弧は位置の値を意味し、それ以外はすべてキーワード引数として扱われます。

+0

実際には、有効なJSONを含むテキストにformatを使用しようとしています。 –

+1

この場合、@ Barmarのように 'json'モジュールを使うべきです。 json.loads()で有効なjsonをロードし、フィールドを直接変更してください。フィールド上で直接 'format()'を使うこともできます。 –

+0

最終的な文字列に、フォーマットされた値とJSONエンコードされた文字列を混在させたい。 'json'モジュールはそれを行うことができません。 –