当前位置: 代码迷 >> python >> 使用字符串模板格式时防止类型强制
  详细解决方案

使用字符串模板格式时防止类型强制

热度:36   发布时间:2023-06-13 13:36:50.0
>>> 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

这在部分的开头和转换表中都有记录,具体来说,在该部分的开头说明:

给定format % values ... 如果 format 是一个 Unicode 对象,或者如果使用%s转换的任何对象是 Unicode 对象,则结果也将是一个 Unicode 对象。

所以这是给定的。

这不涉及解决.encode是从我的理解高不可攀(和repr与荷兰国际集团%r是不是一种选择其一)。 str.__mod__是一个快速操作,对你来说并没有太多处理, .format有礼貌地为你调用.encode ,同时还提供其他好处(因此它存在的原因)。

旁白:如果有人在徘徊, 的规范中也记录了,对于.format ,格式字符串的类型将决定结果。

  相关解决方案