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

时间:2011-05-09 13:03:08

标签: python python-3.x

由于Django还不支持Python 3.x,我使用的是Python 2.7。但是,我想继续并尽可能熟悉新的Python 3.x语法。这引出了我的问题:

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

我知道正在运行python -3

  

警告2to3无法轻易解决的Python 3.x不兼容问题。

但是,我仍然对使用Python 2.7时习惯Python 3.x语法感兴趣。

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

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

从Python 3.0开始,上述四个__future__ import语句是必需的,但在Python 2.7.3's documentation 27.11. Future Statement Definitions

中描述的2.7中不需要

还有什么?

7 个答案:

答案 0 :(得分:19)

现在很多模块都以允许在Python 2和Python 3上执行的方式进行重写。事实证明这并不是很难,将来很容易放弃Python 2支持。

查看帮助完成此任务的six模块,以方便的方式封装许多差异:

  

Six提供了简单的实用程序   包裹它们之间的差异   Python 2和Python 3。

它的网站(当然还有代码)列出了许多实现这一目标的方法。

答案 1 :(得分:10)

将以下代码放入py3k.py模块并将其导入如下: from py3k import *。你需要把它放在每个文件中,但如果没有人再使用Python 2.x你甚至可以把它留在那里,或者你可以只搜索和用空格替换导入行,然后删除该文件。

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


#

答案 2 :(得分:8)

您还需要使用新的异常语法,即不再需要

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

你应该这样做:

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

还要确保在所有二进制字符串前加上b,即:

b'这是二进制字符串'

有关此主题的更完整的封面,请参阅http://python3porting.com/noconv.html

答案 3 :(得分:8)

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

例如,

PyCharm可以配置为检查与任何版本范围的兼容性,

enter image description here

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

enter image description here

答案 4 :(得分:6)

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

有两个人想起来......

答案 5 :(得分:3)

我建议你试试future library。从他们的网站:

  

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

     

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

     

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

答案 6 :(得分:1)

使用range()zip()代替xrange()itertools.izip()