【发布时间】:2016-01-05 13:18:54
【问题描述】:
如何说服 Python 2 的 print 将其参数强制转换为 unicode?
Python 2 print 功能,无论是语句还是函数,显然都将其参数强制转换为字节类型 str:
>>> import sys
>>> import io
>>> sys.version_info[0:2]
(2, 7)
>>> print >> sys.stderr, None
None
>>> print >> io.StringIO(), None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unicode argument expected, got 'str'
将print 变成一个函数并没有帮助;无论如何,相同的内部参数处理似乎发生在 Python 2 上:
>>> from __future__ import print_function
>>> import sys
>>> import io
>>> sys.version_info[0:2]
(2, 7)
>>> print(None, file=sys.stderr)
None
>>> print(None, file=io.StringIO())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unicode argument expected, got 'str'
由于我想用 io.StringIO 实例替换标准流(以使代码在 Python 2 和 Python 3 下的测试套件中运行),所以上述失败让我死了。
使用 io.BytesIO 实例可以在 Python 2 的 print 上工作,但在 Python 3 的 print 上会中断。并且目标是让代码尽可能使用 Unicode,因此io.BytesIO 不是一个可接受的解决方案。
我需要print 的每个输出都是 Unicode,而不是字节。
如何更改print 用于强制输出参数的类型,并改用Unicode 文本类型unicode?
【问题讨论】:
-
一个简单的解决方案是使用
io.BytesIO() -
如果您在 Python 的内置
unittest框架中运行,使用buffer参数可能会为您完成这项工作。没有那个,我相信我已经成功地将sys.stdout替换为只需要一两个函数的模拟对象,但这是一段时间前的事情,所以我不记得了。 -
你试过
from python23compat import print吗? -
我在 python 2.7 中遇到了与
io.StringIO相同的错误。切换到StringIO.StringIO()对我有用。
标签: python unicode compatibility python-2.x type-coercion