编写Python 2.7代码尽可能接近Python 3.x语法

由于Django还不支持Python 3.x,因此我使用Python 2.7。 不过,我想继续前进,并尽可能熟悉新的Python 3.x语法。 这导致我的问题:

  • 编写Python 2.7代码的最好方法是什么?它将尽可能与Python 3.x兼容?

我知道运行python -3

警告2to3无法修复的Python 3.x不兼容问题。

不过,我仍然习惯使用Python3.7语法,而仍然使用Python2.7。

例如,似乎我应该使用以下导入到我的代码:

 from __future__ import print_function from __future__ import unicode_literals from __future__ import division from __future__ import absolute_import 

上述四个__future__ import语句从Python 3.0开始是必需的,但在Python 2.7.3的文档27.11中描述的2.7中不需要。 未来的陈述定义

还有什么?

现在许多模块被重写的方式允许在Python 2和Python 3上执行。事实certificate,这并不是非常困难,将来只要放弃Python 2的支持就很容易。

看看有助于完成这个任务的六个模块,以便利的方式封装了许多差异:

Six提供了简单的实用程序来封装Python 2和Python 3之间的差异。

它的网站(当然还有代码)列出了很多方法来实现这一点。

把下面的代码放到py3k.py模块中,像这样from py3k import *from py3k import * 。 您需要将其放在每个文件中,但是如果没有人再使用Python 2.x,甚至可以将其保留在那里,或者您可以search并用空格replace导入行,然后删除文件。

 try: from future_builtins import * except ImportError: pass try: input = raw_input range = xrange except NameError: pass 

这就是我的模板文件的外观:

 #!/usr/bin/env python # -*- coding: utf-8 -*- """ """ from __future__ import division, absolute_import, \ print_function, unicode_literals from utils.py3k import * # @UnusedWildImport # 

您还需要使用新的exception语法,即没有更多

 try: raise Exception, "Message" except Exception, e: pass 

相反,你应该这样做:

 try: raise Exception("Message") except Exception as e: pass 

还要确保你所有的二进制string前缀为ab,即:

b'This是一个二进制string'

有关此主题的更全面的介绍,请参阅http://python3porting.com/noconv.html

许多Python IDE在这里可以有很大的帮助。

例如, PyCharm可以被configuration为检查与任何范围的版本的兼容性,

在这里输入图像说明

并在任何严重程度上报告问题:

在这里输入图像说明

 try: input = raw_input range = xrange except NameError: pass 

是想到的两个…

我build议你试试未来的图书馆 。 从他们的网站:

python-future是Python 2和Python 3之间缺less的兼容性层。它允许您使用一个干净的Python 3.x兼容的代码库,以最小的开销支持Python 2和Python 3。

它提供了未来和过去的软件包,包括来自Python 3和Python 2的特性的后端和转发端口。它还提供未来和巴氏杀菌,基于2to3的自定义脚本,可以帮助您轻松转换Py2或Py3代码,以支持Python 2和Python 3在一个单一的干净的Py3风格的代码库,模块模块。

使用python-future来兼容Python 2/3的着名项目是Mezzanine和ObsPy。

避免range()zip() ,而是使用xrange()itertools.izip()

我只是安装了2.7和3.2。 如果我需要在python 2 python 3的权力,我只是在两个python版本,通过HTTP或套接字交stream构build2脚本。