Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';t Python';s string.format pad,带“"\x00";?_Python_String Formatting - Fatal编程技术网

为什么可以';t Python';s string.format pad,带“"\x00";?

为什么可以';t Python';s string.format pad,带“"\x00";?,python,string-formatting,Python,String Formatting,我想用空字符(“\x00”)填充字符串。我知道很多方法可以做到这一点,所以请不要用其他方法回答。我想知道的是:为什么Python的string.format()函数不允许使用空值填充 测试用例: >>> "{0:\x01<10}".format("bbb") 'bbb\x01\x01\x01\x01\x01\x01\x01' 这可以工作,但不使用string.format >>> spaces = "{0: <10}".format("bbb")

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

测试用例:

>>> "{0:\x01<10}".format("bbb")
'bbb\x01\x01\x01\x01\x01\x01\x01'
这可以工作,但不使用
string.format

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

>空格=”{0:因为Python2.7中的
string.format
方法是Python3
string.format
的后端口。Python2.7 unicode是Python3字符串,其中Python2.7字符串是Python3字节。字符串是在Python3中表示二进制数据的错误类型。您将使用没有格式方法的字节。因此,确实应该e问为什么
格式
方法在2.7中是字符串,而实际上它应该是unicode类型,因为这就是Python3中的字符串

我猜答案是在那里放太方便了


关于为什么还没有深入研究Python 2.7的源代码,我在
/Objects/stringlib/formatter.h
的第718-722行(版本2.7.3)中发现了这个问题:

问题在于,当未指定填充字符时,零/空字符(
'\0'
)被用作默认字符。这是为了启用此行为:

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

{0:原始问题的答案是它是python中的一个bug

它被证明是被允许的,但不是。它是在2014年修复的。对于python 2,该修复首次出现在2.7.7或2.7.8中(我不知道如何区分)


原始跟踪。

请在否决投票时留下评论,这样我可以改进这个问题。我已经做了研究,知道了
ljust
和其他完成任务的方法。我想知道python 2.7为什么会这样。使用
print“bbb”+“\x00”*7
可以得到一个带7个空格的字符串。Shell始终打印“\x00”作为空格字符。如果没有打印shell,则返回字符串的
repr
版本。这将产生相同的结果:
u”{0:\x00@bonsaiviking是的,关键是
.format
不适用于二进制数据,也不应用于二进制数据。尝试对二进制数据使用unicode方法是行不通的。
>>> "bbb" + "\x00" * 7
'bbb\x00\x00\x00\x00\x00\x00\x00'
>>> spaces = "{0: <10}".format("bbb")
>>> nulls  = "{0:\x00<10}".format("bbb")
>>> spaces == nulls
True
/* Write into that space. First the padding. */
p = fill_padding(STRINGLIB_STR(result), len,
                 format->fill_char=='\0'?' ':format->fill_char,
                 lpad, rpad);
>>> "{0:<10}".format("foo")
'foo       '