>>> 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__
中,模板会被提升并且#39;到一个unicode。
明显的猜测不起作用:
>>> b'potato %b potato' % u'potato'
ValueError: unsupported format character 'b' (0x62) at index 8
我对进行类型检查和/或显式解码/编码调用的解决方案不感兴趣。理想情况下,如果模板变量是unicode对象并且无法将其编码为ascii,我希望模板提升UnicodeEncodeError
。
答案 0 :(得分:2)
在String Formatting Operations部分的开头和转换表中都记录了这一点,具体来说,在本节开头部分说明了这一点:
给定
format % values
...如果format是Unicode对象,或如果使用%s
转换转换的任何对象是Unicode对象,结果也会是一个Unicode对象。
所以这是给定的。
根据我的理解无法获得不涉及.encode
的解决方案(并且repr
%r
也不是一个选项。 str.__mod__
是一个快速操作,对你没有多大帮助,.format
有礼貌大胆为你调用.encode
,同时还提供其他好东西(因此它存在的原因。)
除此之外:如果有人在徘徊,那么PEP 3101的规范中也记录了这一点,对于.format
,格式字符串的类型将决定结果。