Python iter() 中 b'' 哨兵意味着什么?

6 投票
2 回答
2612 浏览
提问于 2025-04-17 19:36

假设我有一个过程,它会返回很多行内容,我想逐行处理这些内容:

import subprocess

myCmd = ['foo', '--bar', '--baz']
myProcess = subprocess.Popen(myCmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for myLine in iter(myProcess.stdout.readline, b''):
    print myLine

在这个例子中,我传给iter()的哨兵参数是什么作用?我传的是值b''。我觉得我明白''的意思——当遇到空行时就停止处理——但是我不太明白b''是什么意思。

2 个回答

4

我会尽量把我读到的内容说得更清楚一些。(稍微修改过的版本)

在支持的Python版本中,b'string'表示一个字节字符串。这种写法是为了向Unicode支持迁移而在Python 2中引入的,具体是通过PEP 358。在Python 2.6的官方文档中并没有提到b这个前缀,而在Python 2.7的文档中则提到了。不过,PEP 358是为了Python 2.6设计的,我见过的所有Python 2.6的解释器都支持这个写法。

随着Python 3的推出,字符串的默认类型从字节变成了Unicode。不过,为了让迁移更顺利,引入了__future__模块。下面的例子展示了字符串字面量的效果。

Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 'abc'
'abc'
>>> b'abc'
'abc'
>>> from __future__ import unicode_literals
>>> 'abc'
u'abc'
>>> b'abc'
'abc'

我希望能说明以下说法的有效性是有限的:

  • 在Python 3中,这表示一个字节字面量: 是的,但在Python 2中,从2.6版本开始也是如此。
  • 在Python 2中,这个写法被忽略: 更确切地说,如果你使用的Python 2版本已经支持这个写法,那么它没有效果,除非你(或者你查看的外部代码)导入了__future__并且如果你不在乎与Python 3的兼容性(这点每个人都应该考虑,很多第三方软件也常常会关注这点)。

我认为对提问者问题的最简洁有效的回答是:

这是一个字符串字面量的前缀,强制使用字节表示,而不是Unicode表示,最早在Python 2.6中引入,并没有改变Python 2的默认设置(但如果能看到from __future__ import,就值得注意)。

4

在Python 3中,字符串是字节字面量。这个在Python 2中是被忽略的。

撰写回答