2017-02-09 53 views
2
>>> b'potato {} potato'.format(u'potato') # return value matches the template 
'potato potato potato' 
>>> b'potato %s potato' % u'potato' # return value is coerced 
u'potato potato potato' 

str.format模板控制返回類型,但在str.__mod__模板被「提拔」爲Unicode。防止類型強制使用字符串格式化模板時

  1. 有記錄/可靠的行爲嗎?
  2. 如何做百分比樣式替換,使返回類型匹配模板?

顯而易見的猜測不工作:

>>> b'potato %b potato' % u'potato' 
ValueError: unsupported format character 'b' (0x62) at index 8 

我沒有興趣在做類型檢查和/或明確的解碼/編碼的呼叫解決方案。理想情況下,如果模板變量是unicode對象並且不能編碼爲ascii,我希望模板可以提升UnicodeEncodeError

+2

哇。看起來unicode/bytes的區別在Python 2中是模糊的和破裂的。如果只有某些版本的Python在那裏他們已經修復了這個...;) –

+1

1)強制發生在'%s'轉換類型中,I很確定這是在文檔的轉換表中記錄的。 2)懷疑它:( –

回答

2

這無論是在部分String Formatting Operations的開始,並在轉換表中記錄,特別是在部分的開頭就指出:

鑑於format % values ...如果格式是一個Unicode對象,如果使用%s轉換轉換的任何對象都是Unicode對象,則結果也將是Unicode對象。

所以這是一個給定的。

從我所瞭解的(repr%r不是一個選項)不涉及.encode解決方案是不可能的。 str.__mod__是一種快速操作,不會爲您處理太多,.format禮貌爲您呼叫.encode大膽,同時還提供其他好東西(因此它爲什麼存在)。

另外:如果有人徘徊,它也記錄在PEP 3101規範中,對於.format,格式字符串的類型將決定結果。