首先,簡單的問題:
如何使用一個理解的格式中的所有值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能夠控制結果。
來源
2017-10-20 05:23:48
wim
'tupvalue [0]' - >'('html',96)' - >''%s:%d'%('html',96)'什麼是混淆? –
@julien在問題 – Sjn73
@cᴏʟᴅsᴘᴇᴇᴅ中如何顯示樣本輸出格式說明符%s和%d如何從單個輸入值tupvalue [0] – Sjn73