繁体   English   中英

为什么Python的string.format pad不能用“\\ x00”?

[英]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:186parse_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM