如何将 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
我在 Python IDE 中启用了兼容性检查,现在我意识到继承的 Python 2.7 代码有很多对 unicode()
的调用Python 3.x.
我查看了 Python2 的 docs,没有发现如何升级的提示:
我现在不想切换到 Python3,但也许将来会。
该代码包含对 unicode()
如何进行?
更新
用户 vaultah 阅读 pyporting 指南的评论已收到多个赞。
我目前的解决方案是这样的(感谢 Peter Brittain):
from builtins import str
...我在 pyporting 文档中找不到此提示.....
你可以测试下你运行的Python版本中是否有unicode()
这样的功能。如果没有,您可以为 str()
函数创建一个 unicode()
别名,它在 Python 3 中的作用与 unicode()
在 Python 2 中的作用相同,因为所有字符串都是Python 3.
# 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