2017-02-20 39 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

如果你想有實際括號{}在輸出中,你需要這樣做:

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

格式把括號{}作爲參數內對一切。空括號表示位置值,其他所有內容都作爲關鍵字參數處理。

+0

其實,我試圖使用包含有效JSON的文本的格式。 –

+1

在這種情況下,您應該使用'json'模塊,就像@Barmar建議的一樣。通過'json.loads()'加載你的有效json並直接修改字段。或者直接在字段上使用'format()'。 –

+0

我想在最終字符串中混合格式化的值和JSON編碼的字符串。 'json'模塊不能這樣做。 –