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

时间:2013-03-19 07:43:27

标签: python

假设我有一个返回一堆行的进程,我想迭代它们:

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 个答案:

答案 0 :(得分:4)

在python3中,字符串是byteliteral。在python 2中被忽略。

答案 1 :(得分:3)

我会尽力比我到目前为止读到的更准确。 (略有修订版)

Python表示法b'string'表示Python版本中支持它的字节字符串文字。已经为Python 2引入了PEP 358符号,作为向unicode支持迁移的一个步骤。 Python syntax for 2.6 does not mention the b prefix时的当前Python syntax for 2.7 does mention the b prefix。但是,PEP 358适用于Python 2.6和我见过的所有Python 2.6解释器。

迁移到Python 3后,字符串文字的默认 byte 更改为 unicode 。但是,__future__ module是为了简化迁移而引入的。以下说明了字符串文字的效果。

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中,这表示字节文字:是的,但至少在2.6版本之后也在Python 2中。
  • 在Python 2中忽略了这种表示法:如果你有一个已经支持它的Python 2版本而且除非< / em>你(或你看到的外国代码)如果你不关心与Python 3的兼容性(每个人应该考虑),只导入__future__ 并且通常针对第三方软件。)

在我看来,OP问题的最短有效答案是:

这是字符串文字的前缀,强制执行字节表示而不是在Python 2.6中引入的unicode表示,而不是更改Python 2的Python默认值(但是如果from __future__ import则需要注意可以看出。)