2016-08-01 53 views
-4

我在我的Python IDE中启用了兼容性检查,现在我意识到继承的Python 2.7代码有很多调用unicode()这是不允许的Python 3.x.如何将Python 2的unicode()函数转换为正确的Python 3.x语法

我看着Python2的docs并没有发现提示如何升级:

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

的代码包含大约500呼叫unicode()

如何进行?

更新

用户vaultah的阅读pyporting指南已经收到几个upvotes的评论。

我目前的解决办法是这样的(感谢Peter布里泰恩):

from builtins import str 

...我找不到这个提示在pyporting文档.....

+5

https://docs.python.org/3/howto/pyporting.html – vaultah

+0

@vaultah这不是一个普遍的问题。它只是关于'unicode()'调用。我目前工作的代码库中,大约有700个调用这个方法的地方。我该怎么办? – guettli

+2

这个问题没有很好的答案。如果你幸运的话,你可以删除对“unicode”的调用,你很好。所有字符串在Python 3中都是unicode。如果这不起作用,那么期望* lot *的工作。当从Python 2切换到3时,从str到unicode文字和字节的转换是迄今为止最不兼容的改变。 – Phillip

回答

12

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

最近刚刚不得不端口一些我自己的代码从2到3,保持现在每个兼容性,我衷心推荐使用python-future,它提供了一个很好的工具,以帮助更新您的代码(futurize),以及明确的指导为how to write cross-compatible code

在你的具体情况下,我会简单地将所有调用转换为unicode使用str然后import str from builtins。目前任何值得使用的IDE都将在全球范围内进行搜索并取代一次操作。

当然,如果您只想使用自动转换(并在您的代码中查找其他潜在问题),那么也应该捕获这类事物。

+1

是的,'futurize'将帮助转换代码库; 'unicode()'调用将被转换为'str()'调用,其中'from builtins import str'导入在顶部。请注意,通常会为Python 2上的'future'库添加一个安装类型的需求(以提供backported'builtins'模块)。 –

+0

这将打破sqlalchemy,以及其他图书馆。 –

1

您可以测试是否有是您运行的Python版本中的unicode()这样的函数。如果没有,你可以创建一个unicode()别名str()函数,该函数在Python 3在Python 2什么unicode()做了,因为所有的字符串都是Unicode的在Python 3

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

注意,更完整的端口可能是一个更好的主意;详情请参阅the porting guide

+0

是的,这个手工解决方案应该工作。但我想我会用Peter Brittain的答案解释未来的图书馆。 – guettli

4

首先,作为一种策略,我会采取一小部分程序并尝试将其移植。您所描述的unicode调用的数量向我建议,您的应用程序比大多数人更关心字符串表示,每个用例通常都不相同。

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

我们来看几个例子。

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

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

例如,如果从在Python 2文件读取UTF-8字符,将它们转换为Unicode代码应该是这样的:

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

然而,在Python3,read()返回的Unicode数据首先,和Unicode解码必须在打开文件时指定:

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

正如你所看到的,可移植很大程度上取决于应用程序如何以及为什么这样做的Unicode convers当转化unicode()简单离子,数据来自哪里以及去哪里。

Python3为字符串表示带来更大的清晰度,这是值得欢迎的,但可以使移植变得艰巨。例如,Python3具有适当bytes类型,并且您字节数据为Unicode这样转换:使用相反的变换

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

或转换Unicode数据至字符形式。

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

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

+0

很好的答案,它解释了正确地替换'unicode()'的重要性 –

1

简短回答:将所有unicode呼叫替换为str呼叫。

长答案:在Python 3中,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 
相关问题