2017-10-20 54 views
0

我有一段代碼如下:如何格式說明取值,而元組列表被傳遞

tupvalue = [('html', 96), ('css', 115), ('map', 82)] 

所以在打印時在所希望的格式的上述元組用於特定索引I找到一個這樣的代碼:

>>> '%s:%d' % tupvalue[0] 
'html:96' 

我想知道如何單值tupvalue[0]被識別爲格式說明'%s:%d'兩個值的元組?請用文檔參考來解釋這個機制。

如何使用理解,以所需格式格式化tupvalue中的所有值,如示例所示?

+0

'tupvalue [0]' - >'('html',96)' - >''%s:%d'%('html',96)'什麼是混淆? –

+0

@julien在問題 – Sjn73

+0

@cᴏʟᴅsᴘᴇᴇᴅ中如何顯示樣本輸出格式說明符%s和%d如何從單個輸入值tupvalue [0] – Sjn73

回答

2

首先,簡單的問題:

如何使用一個理解的格式中的所有值tupvalue以所需的格式如示例所示?

這是一個列表理解:['%s:%d' % t for t in tupvalue]

現在,更難的問題!

如何單值tupvalue[0]識別爲格式指示符'%s:%d'兩個值的元組?

你的直覺有點奇怪,這裏是正確的。 元組是以字符串格式設置的語言專用的。

>>> '%s:%d' % ('css', 115) # tuple is seen as two elements 
'css:115' 
>>> '%s:%d' % ['css', 115] # list is just seen as one object! 
TypeError: not enough arguments for format string 

百分比樣式的字符串格式不正確地鴨式輸入。所以,如果你真的想格式化一個元組,你必須把它包在另一元組,不同於其他任何類型的對象:

>>> '%s' % [] 
'[]' 
>>> '%s' % ((),) 
'()' 
>>> '%s' %() 
TypeError: not enough arguments for format string 

文檔的相關章節是部分4.7.2. printf-style String Formatting,它在哪裏提到:

如果format需要單個參數,則值可能是單個非元組對象。否則,值必須是具有格式字符串指定的項目數的元組。

元組的奇怪處理是文檔的該部分開頭的註釋中所指出的怪癖之一,建議使用較新的字符串格式化方法str.format的原因之一。

請注意,字符串格式的處理髮生在運行時。你可以用抽象語法樹來驗證這一點:

>>> import ast 
>>> ast.dump(ast.parse('"%s" % val')) 
"Module(body=[Expr(value=BinOp(left=Str(s='%s'), op=Mod(), right=Name(id='val', ctx=Load())))])" 

'%s' % val解析對'%s'val二進制運算,這就好比str.__mod__(val)處理,在CPython的,這是一個BINARY_MODULO操作碼。這意味着當val收到的信息不正確時*通常可以由str類型決定如何處理,只有在表達式爲時纔會發生,即一旦解釋程序到達該行。所以,val是不是類型錯誤或者元素太少/太多並不重要 - 這是運行時錯誤,而不是語法錯誤。

除了在某些特殊情況下,CPython的窺視優化器能夠在編譯時「不斷摺疊」它。

*除非val的類型的子類str,在這種情況下type(val).__rmod__should be能夠控制結果。

+2

我很欣賞這一點,它非常有用。我希望OP決定接受你的答案。 –

+0

@wim感謝這樣一個徹底的解釋,並通過與這個列表比較來完成我的問題>>>'%s:%d'%['css',115]',其實這就是我的問題出現的地方 – Sjn73