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

时间:2017-02-09 23:09:59

标签: python python-2.x

>>> 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。

  1. 这是有记录/可靠的行为吗?
  2. 如何进行百分比样式替换,使返回类型与模板匹配?
  3. 明显的猜测不起作用:

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

    我对进行类型检查和/或显式解码/编码调用的解决方案不感兴趣。理想情况下,如果模板变量是unicode对象并且无法将其编码为ascii,我希望模板提升UnicodeEncodeError

1 个答案:

答案 0 :(得分:2)

String Formatting Operations部分的开头和转换表中都记录了这一点,具体来说,在本节开头部分说明了这一点:

  

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

所以这是给定的。

根据我的理解无法获得不涉及.encode的解决方案(并且repr %r也不是一个选项。 str.__mod__是一个快速操作,对你没有多大帮助,.format礼貌大胆为你调用.encode,同时还提供其他好东西(因此它存在的原因。)

除此之外:如果有人在徘徊,那么PEP 3101的规范中也记录了这一点,对于.format,格式字符串的类型将决定结果。