为什么可以使用&x00&来测试Python的字符串格式板?

2022-04-10 00:00:00 python string-formatting

问题描述

我想用空字符("x00")填充一个字符串。我知道有很多方法可以做到这一点,所以请不要用其他方法来回答。我想知道的是:为什么Python的string.format()函数不允许用空值填充?

测试用例:

>>> "{0:x01<10}".format("bbb")
'bbbx01x01x01x01x01x01x01'

这表明十六进制转义字符通常有效。

>>> "{0:x00<10}".format("bbb")
'bbb       '

但"x00"变为空格("x20")。

>>> "{0:{1}<10}".format("bbb","x00")
'bbb       '
>>> "{0:{1}<10}".format("bbb",chr(0))
'bbb       '

甚至尝试了其他几种方法。

>>> "bbb" + "x00" * 7
'bbbx00x00x00x00x00x00x00'

此方法有效,但不使用string.format

>>> spaces = "{0: <10}".format("bbb")
>>> nulls  = "{0:x00<10}".format("bbb")
>>> spaces == nulls
True

Python显然正在替换空格(chr(0x20)),而不是Null(chr(0x00))。


解决方案

,因为Python2.7中的string.format方法是来自Python3string.format的后端。Python2.7 Unicode是Python3字符串,其中,Python2.7字符串是Python3字节。在Python3中,字符串的类型不适合表示二进制数据。您将使用没有格式方法的字节。因此,您真的应该问,为什么在2.7中对字符串使用format方法,而实际上它应该只在Unicode类型上,因为这就是在Python3中成为字符串的类型。

我想答案是把它放在那里太方便了。

作为一个相关问题,为什么还没有format on bytes

相关文章