如何将 Python 2 unicode() 函数转换为正确的 Python 3.x 语法

how to convert Python 2 unicode() function into correct Python 3.x syntax

我在 Python IDE 中启用了兼容性检查,现在我意识到继承的 Python 2.7 代码有很多对 unicode() 的调用Python 3.x.

允许

我查看了 Python2 的 docs,没有发现如何升级的提示:

我现在不想切换到 Python3,但也许将来会。

该代码包含对 unicode()

的大约 500 次调用

如何进行?

更新

用户 vaultah 阅读 pyporting 指南的评论已收到多个赞。

我目前的解决方案是这样的(感谢 Peter Brittain):

from builtins import str

...我在 pyporting 文档中找不到此提示.....

你可以测试下你运行的Python版本中是否有unicode()这样的功能。如果没有,您可以为 str() 函数创建一个 unicode() 别名,它在 Python 3 中的作用与 unicode() 在 Python 2 中的作用相同,因为所有字符串都是Python 3.

中的 unicode
# Python 3 compatibility hack
try:
    unicode('')
except NameError:
    unicode = str

请注意,更完整的端口可能是更好的主意;有关详细信息,请参阅 the porting guide

正如评论中已经指出的那样,已经有 advice on porting from 2 to 3

最近不得不将我自己的一些代码从 2 移植到 3 并暂时保持每个代码的兼容性,我全心全意地推荐使用 python-future, which provides a great tool to help update your code (futurize) as well as clear guidance for how to write cross-compatible code

在您的具体情况下,我会简单地将所有调用转换为 unicode 以使用 str,然后 import str from builtins。如今,任何值得称道的 IDE 都可以在一次操作中进行全局搜索和替换。

当然,如果您只想使用自动转换(并寻找代码中的其他潜在问题),那也是 futurize 应该捕捉到的东西。

首先,作为一种策略,我会采用您程序的一小部分并尝试移植它。您所描述的 unicode 调用次数向我表明,您的应用程序比大多数应用程序更关心字符串表示形式,并且每个用例通常都不同。

重要的考虑因素是 所有字符串在 Python 3 中都是 unicode。如果您使用 str 类型来存储 "bytes" (例如,如果它们是从文件中读取的),那么您应该知道这些不会是 Python3 中的字节,而是将以 unicode 字符开头。

我们来看几个案例。

首先,如果您根本没有任何非 ASCII 字符并且确实没有使用 Unicode 字符集,那很容易。您可能只需将 unicode() 函数更改为 str()。这将确保任何作为参数传递的对象都被正确转换。然而,认为这很容易是一厢情愿的想法。

很可能,您需要查看 unicode() 的参数以了解它是什么,并确定如何处理它。

例如,如果您从 Python2 中的文件中读取 UTF-8 字符并将它们转换为 Unicode,您的代码将如下所示:

data = open('somefile', 'r').read()
udata = unicode(data)

但是,在Python3中,read() returns Unicode数据开头,打开文件时必须指定unicode解码:

udata = open('somefile', 'r', encoding='UTF-8').read()

如您所见,仅在移植时转换 unicode() 可能在很大程度上取决于应用程序进行 Unicode 转换的方式和原因、数据的来源以及去向。

Python3 使字符串表示更加清晰,这是受欢迎的,但可能会使移植令人生畏。例如,Python3 有一个正确的 bytes 类型,您可以像这样将字节数据转换为 unicode:

udata = bytedata.decode('UTF-8')

或使用相反的转换将 Unicode 数据转换为字符形式。

bytedata = udata.encode('UTF-8')

我希望这至少有助于确定策略。

简短回答:将所有 unicode 个调用替换为 str 个调用。

长答案:在 Python3 中,Unicode 因其丰富而被字符串取代。如果您仅使用 Python 3:

,则以下解决方案应该有效
unicode = str
# the rest of your goes goes here

如果您将它与 Python 2 或 Python 3 一起使用,请改用它:

import sys
if sys.version_info.major == 3:
    unicode = str
# the rest of your code goes here

另一种方式:运行命令行中的这个

$ 2to3 package -w