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

48 投票
7 回答
12771 浏览
提问于 2025-04-16 17:17

因为Django还不支持Python 3.x,所以我现在在用Python 2.7。不过,我想尽量熟悉一下新的Python 3.x语法。这让我有了一个问题:

  • 有没有什么好的方法可以写出尽量兼容Python 3.x的Python 2.7代码呢?

我知道运行 python -3

提醒我一些Python 3.x不兼容的问题,这些问题是2to3工具无法轻易解决的。

不过,我想在使用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

上面这四个 __future__ import 语句是Python 3.0开始需要的,但在2.7中并不是必须的,具体可以参考Python 2.7.3的文档 27.11. Future Statement Definitions

还有什么其他的建议吗?

7 个回答

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

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


#
19

现在很多模块都被重新编写成可以在Python 2和Python 3上运行。这其实并不难,将来我们可以很轻松地放弃对Python 2的支持。

可以看看这个six模块,它可以帮助我们处理这个问题,把Python 2和Python 3之间的许多差异封装得很方便:

Six提供了一些简单的工具,用来处理Python 2和Python 3之间的差异。

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

撰写回答