Python iter() 中 b'' 哨兵意味着什么?
假设我有一个过程,它会返回很多行内容,我想逐行处理这些内容:
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中是被忽略的。