为什么stream.write几乎可以输出零以外的任何东西?
from StringIO import StringIO
v0 = 0
v1 = 1
a = [1, 0, v1, v0, "string", 0.0, 2.0]
stream = StringIO()
for v in a:
stream.write(v)
stream.write('n')
print stream.getvalue()
使用Python 2.7.6,运行此代码会生成:
1
1
string
2.0
fileobj.write()
的接口要求您编写字符串,始终:
file.write(str)
向文件中写入字符串。
强调我的。
这是一个实现细节,对于StringIO()
非字符串,只有发生才能工作。该代码通过使用优化"空字符串"情况
if not s: return
以避免进行不必要的字符串串联。这意味着,如果传入任何false值,例如数字0或None
或空容器,则不会进行写入。
在写入之前将对象转换为字符串:
for v in a:
stream.write(str(v))
stream.write('n')
如果你在这里使用C优化版本,你会出现错误:
>>> from cStringIO import StringIO
>>> f = StringIO()
>>> f.write(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be string or buffer, not int
它看起来像是在StringIO.py的第214行(函数write
):
if not s: return
(s
是您传递给write
的内容)。
换句话说,"falsy"值(如None、[]、0等)将被丢弃。