python - 更改用于 ‘print’ 参数类型强制的字符串类型

标签 python unicode compatibility python-2.x type-coercion

我怎样才能说服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/

相关文章:

python只获取类属性没有父类(super class)

python - 在 Google App Engine 上处理 db.Timeout

python - 如何在 Python 中获取 Linux 控制台窗口的宽度

f# - VS2008 和 VS2010 并行的 FSharp.Compiler.CodeDom

java - test 和 src 目录/代码之间的差异在 test 文件夹中不起作用

python - 如何设置 matplotlib 图的边距?

unicode - 这个混合字符串如何在 unicode 单词边界上拆分

java - 在指定unicode文字的java代码中获取空字 rune 字错误

C# windows窗体无法显示简体中文字符

iphone - 将 Xcode 4.2 中的默认编译器更改为 GCC 4.2 有什么问题吗?