我怎样才能说服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
相反?
最佳答案
非常困惑,但也许其中有一些有用的东西:
import sys
import io
if sys.version_info >= (3, 0):
bytes_out = io.BytesIO()
out_buffer = io.TextIOWrapper(bytes_out, encoding="utf-8")
else:
out_buffer = io.BytesIO()
# print now supports all variants
print(None, file=out_buffer)
print(b"hello", file=out_buffer)
print("£", file=out_buffer)
out_buffer.flush()
out_buffer.seek(0)
if sys.version_info >= (3, 0):
my_unicode = out_buffer.read()
else:
my_unicode = out_buffer.read().decode("utf-8")
关于python - 更改用于 ‘print’ 参数类型强制的字符串类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33006966/