问题描述
>>> 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。
- 这是记录在案/可靠的行为吗?
- 如何进行百分比样式替换以使返回类型与模板匹配?
明显的猜测不起作用:
>>> b'potato %b potato' % u'potato'
ValueError: unsupported format character 'b' (0x62) at index 8
我对进行类型检查和/或显式解码/编码调用的解决方案不感兴趣。
理想情况下,如果模板变量是一个 unicode 对象并且它不能被编码为 ascii,我希望模板引发UnicodeEncodeError
。
1楼
这在部分的开头和转换表中都有记录,具体来说,在该部分的开头说明:
给定
format % values
... 如果 format 是一个 Unicode 对象,或者如果使用%s
转换的任何对象是 Unicode 对象,则结果也将是一个 Unicode 对象。
所以这是给定的。
这不涉及解决.encode
是从我的理解高不可攀(和repr
与荷兰国际集团%r
是不是一种选择其一)。
str.__mod__
是一个快速操作,对你来说并没有太多处理, .format
有礼貌地为你调用.encode
,同时还提供其他好处(因此它存在的原因)。
旁白:如果有人在徘徊, 的规范中也记录了,对于.format
,格式字符串的类型将决定结果。