为什么将字节传递给类str构造函数特殊?

时间:2015-04-19 05:04:04

标签: python-3.x

官方Python3文档说这是关于将bytes传递给class str的单个参数构造函数:

  

将字节对象传递给str()而不进行编码或错误   参数属于返回非正式字符串的第一种情况   表示(另请参阅Python的-b命令行选项)。

参考:https://docs.python.org/3/library/stdtypes.html#str

非正式字符串表示 - >咦?

使用Python控制台(REPL),我发现以下奇怪之处:<​​/ p>

>>> ''
''
>>> b''
b''
>>> str()
''
>>> str('')
''
>>> str(b'')
"b''"  # What the heck is this?
>>> str(b'abc')
"b'abc'"
>>> "x" + str(b'')
"xb''"  # Woah.

(问题标题可以改进 - 我很难找到更好的问题。请帮助澄清。)

1 个答案:

答案 0 :(得分:1)

str背后的概念似乎是它返回一个“可打印的”字符串,通常是以人类可理解的形式。 documentation实际上使用短语“nicely printable”:

  

如果既没有给出编码也没有给出错误,则str(object)返回   object .__ str __(),这是“非正式”或可打印的字符串   对象的表示。对于字符串对象,这是字符串   本身。如果object没有__str __()方法,则str()会下降   回到返回的repr(对象)。

考虑到这一点,请注意元组或列表的str生成字符串版本,例如:

>>> str( (1, 2) )
'(1, 2)'
>>> str( [1, 3, 5] )
'[1, 3, 5]'

Python认为上述内容是这些对象的“可打印”形式。以此为背景,以下似乎更合理:

>>> str(b'abc')
"b'abc'"

如果没有提供编码,字节b'abc'只是字节,而不是字符。因此,str回退到“可打印的”形式,六个字符串b'abc'可以很好地打印。