繁体   English   中英

为什么\\ x00没有被repr转换为\\ 0

[英]Why is \x00 not converted to \0 by repr

这是关于Python的repr的一个有趣的奇怪之处:

制表符\\x09表示为\\t 但是,此约定不适用于null终止符。

为什么\\x00表示为\\x00 ,而不是\\0

示例代码:

# Some facts to make sure we are on the same page
>>> '\x31' == '1'
True
>>> '\x09' == '\t'
True
>>> '\x00' == '\0'
True

>>> x = '\x31'
>>> y = '\x09'
>>> z = '\x00'
>>> x
'1' # As Expected
>>> y
'\t' # Okay
>>> z
'\x00' # Inconsistent - why is this not \0

答案很简单:因为这不是所使用的特定逃生。 字符串表示仅使用单字符转义符\\\\\\n\\r\\t ,(当存在"'字符时加上\\' )因为有明确的测试。

其余的要么考虑打印和包括原来的样子,或者使用更长的转义序列(取决于Python版本和字符串类型在内, \\xhh\\uhhhh\\Uhhhhhhhh ,总是用最短的3个选项是要适应价值)。

此外,在生成repr()输出时,对于由空字节后跟数字'1''7' (所以bytes([0x00, 0x49])bytes([0x00, 0x4A]) bytes([0x00, 0x49])组成的字符串bytes([0x00, 0x4A])等等,你不能只在输出中使用\\0而不必转义下面的数字。 '\\01'是单个八进制转义序列,与'\\x001' ,后者是两个字节。 虽然强制输出始终使用三个八进制数字(例如'\\0001' )可能是一种解决方法,但更简单的方法是坚持使用标准化,更简单的转义序列格式。 向前扫描以查看下一个字符是否是八进制数字并且切换输出样式只会产生令人困惑的输出(想象一下SO上的问题: '\\x001''\\0Ol'之间有什么区别?

输出始终保持一致。 除了单引号(可以用'\\' ,取决于"字符"的存在),Python将始终对给定的代码点使用相同的转义序列样式

如果要研究生成输出的代码,可以在Objects/unicodeobject.c unicode_repr()函数中找到Python 3 str.__repr__实现,该函数使用

/* Escape quotes and backslashes */
if ((ch == quote) || (ch == '\\')) {
    PyUnicode_WRITE(okind, odata, o++, '\\');
    PyUnicode_WRITE(okind, odata, o++, ch);
    continue;
}


/* Map special whitespace to '\t', \n', '\r' */
if (ch == '\t') {
    PyUnicode_WRITE(okind, odata, o++, '\\');
    PyUnicode_WRITE(okind, odata, o++, 't');
}
else if (ch == '\n') {
    PyUnicode_WRITE(okind, odata, o++, '\\');
    PyUnicode_WRITE(okind, odata, o++, 'n');
}
else if (ch == '\r') {
    PyUnicode_WRITE(okind, odata, o++, '\\');
    PyUnicode_WRITE(okind, odata, o++, 'r');
}

对于单字符转义,然后在下面进行更长时间的检查。 对于Python 2, 类似但更短的PyString_Repr()函数做了很多相同的事情。

如果它试图使用\\0 ,那么当数字紧跟在它之后它必须是特殊情况,以防止它们被解释为八进制文字。 始终使用\\x00更简单,始终正确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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