gpt4 book ai didi

python - 为什么 Python 的 string.format 不能用 "\x00"填充?

转载 作者:太空狗 更新时间:2023-10-29 21:03:36 27 4
gpt4 key购买 nike

我想用空字符 ("\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 的这一部分,第 718-722 行(在版本 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 = ' '; 设置为 parse_internal_render_format_spec() 中的默认值,位于 ./Objects/stringlib/formatter。 h:186,但有一些关于向后兼容性的信息,稍后会检查 '\0'。无论如何,我的好奇心得到了满足。如果别人的回答比这有更多的历史或更好的解释,我会接受。

关于python - 为什么 Python 的 string.format 不能用 "\x00"填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16741435/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com