gue*_*tli 9 python python-3.x python-unicode
我在Python IDE中启用了兼容性检查,现在我意识到继承的Python 2.7代码有很多调用unicode(),Python 3.x中不允许这样做.
我查看了Python2 的文档,发现没有提示如何升级:
我现在不想切换到Python3,但可能在将来.
该代码包含大约500个调用 unicode()
如何进行?
更新
用户vaultah阅读pyporting指南的评论 收到了几个赞成票.
我目前的解决方案就是这个(感谢Peter Brittain):
from builtins import str
Run Code Online (Sandbox Code Playgroud)
...我在pyporting docs中找不到这个暗示.....
Pet*_*ain 21
正如评论中已经指出的那样,已经有关于从2移植到3的建议.
有最近不得不端口一些我自己的代码2至3和维护每个兼容性现在,我衷心推荐使用蟒蛇的将来,它提供了一个很好的工具,以帮助更新您的代码(futurize),以及明确的指导如何编写交叉兼容的代码.
在您的具体情况下,我只需将所有调用转换为unicode以使用str,然后从builtins导入str.如今,任何有价值的IDE都会在一次操作中进行全局搜索和替换.
当然,如果您只是想使用自动转换(以及在代码中查找其他潜在问题),那就是未来应该捕获的东西.
您可以测试unicode()所运行的Python版本是否具有这种功能。如果没有,您可以unicode()为该str()函数创建一个别名,该别名在Python 3中与unicode()在Python 2中相同,因为所有字符串在Python 3中都是unicode。
# Python 3 compatibility hack
try:
unicode('')
except NameError:
unicode = str
Run Code Online (Sandbox Code Playgroud)
注意,更完整的端口可能是一个更好的主意。有关详细信息,请参见移植指南。
首先,作为一种策略,我会从你的程序中取出一小部分并尝试移植它。unicode您描述的调用次数告诉我,您的应用程序比大多数情况更关心字符串表示,并且每个用例通常都不同。
重要的考虑是所有字符串在 Python 3 中都是 unicode。如果您使用该str类型来存储“字节”(例如,如果它们是从文件中读取的),那么您应该意识到这些在 Python3 中不会是字节,而是以 unicode 字符开头。
我们来看几个案例。
首先,如果您根本没有任何非 ASCII 字符并且确实没有使用 Unicode 字符集,那么这很容易。您可以简单地将unicode()函数更改为str(). 这将确保作为参数传递的任何对象都被正确转换。然而,假设这很容易是一厢情愿的想法。
最有可能的是,您需要查看参数以unicode()了解它是什么,并确定如何处理它。
例如,如果您在 Python 2 中从文件中读取 UTF-8 字符并将它们转换为 Unicode,您的代码将如下所示:
data = open('somefile', 'r').read()
udata = unicode(data)
Run Code Online (Sandbox Code Playgroud)
但是在Python3中,read()返回Unicode数据开头,打开文件时必须指定unicode解码:
udata = open('somefile', 'r', encoding='UTF-8').read()
Run Code Online (Sandbox Code Playgroud)
如您所见,unicode()在移植时进行简单的转换可能在很大程度上取决于应用程序进行 Unicode 转换的方式和原因、数据的来源以及去向。
Python3 使字符串表示更加清晰,这是受欢迎的,但可能使移植令人生畏。例如,Python3 有一个正确的bytes类型,您可以像这样将字节数据转换为 unicode:
udata = bytedata.decode('UTF-8')
Run Code Online (Sandbox Code Playgroud)
或使用相反的转换将 Unicode 数据转换为字符形式。
bytedata = udata.encode('UTF-8')
Run Code Online (Sandbox Code Playgroud)
我希望这至少有助于确定策略。
小智 5
简短答案:将所有unicode通话替换为str通话。
长答案:在Python 3中,Unicode因其丰富而被字符串取代。如果仅使用Python 3,以下解决方案应该可以使用:
unicode = str
# the rest of your goes goes here
Run Code Online (Sandbox Code Playgroud)
如果将它与Python 2或Python 3一起使用,请改用以下命令:
import sys
if sys.version_info.major == 3:
unicode = str
# the rest of your code goes here
Run Code Online (Sandbox Code Playgroud)
另一种方式:在命令行中运行
$ 2to3 package -w
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20227 次 |
| 最近记录: |