编写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脚本。