[英]Why can't Python's string.format pad with “\x00”?
我想填充一个带有空字符的字符串(“\\ x00”)。 我知道有很多方法可以做到这一点,所以请不要用其他方式回答。 我想知道的是:为什么Python的string.format()
函数不允许使用空值填充?
测试用例:
>>> "{0:\x01<10}".format("bbb")
'bbb\x01\x01\x01\x01\x01\x01\x01'
这表明十六进制转义字符通常起作用。
>>> "{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
'bbb\x00\x00\x00\x00\x00\x00\x00'
这有效,但不使用string.format
>>> spaces = "{0: <10}".format("bbb")
>>> nulls = "{0:\x00<10}".format("bbb")
>>> spaces == nulls
True
Python显然代替空格( chr(0x20)
)而不是空格( chr(0x00)
)。
深入研究Python 2.7的源代码,我发现问题出在本节的./Objects/stringlib/formatter.h
,第./Objects/stringlib/formatter.h
行(2.7.3版)中:
/* Write into that space. First the padding. */
p = fill_padding(STRINGLIB_STR(result), len,
format->fill_char=='\0'?' ':format->fill_char,
lpad, rpad);
问题是当没有指定填充字符时,零/空字符( '\\0'
)被用作默认值。 这是为了启用此行为:
>>> "{0:<10}".format("foo")
'foo '
可以设置format->fill_char = ' ';
作为./Objects/stringlib/formatter.h:186
中parse_internal_render_format_spec()
的默认值,但有一些关于向后兼容性的内容,稍后会检查'\\0'
。 无论如何,我的好奇心得到了满足。 如果它有更多的历史或更好的解释原因,我会接受别人的答案。
原始问题的答案是它是python中的一个bug。
它被记录为被允许,但事实并非如此。 它是在2014年修复的。对于python 2,修复程序首先出现在2.7.7或2.7.8(我不知道如何判断哪个)
原始跟踪问题 。
因为Python2.7中的string.format
方法是Python3 string.format
的后端口。 Python2.7 unicode是Python 3字符串,其中Python2.7字符串是Python3字节。 字符串是在Python3中表达二进制数据的错误类型。 您将使用没有格式方法的字节。 所以你真的应该问为什么2.7中的format
方法完全应该只用在unicode类型上,因为那就是Python3中的字符串。
我猜这个答案就是把它放在那里太方便了。
作为一个相关的问题,为什么还没有字节format
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.