编写尽可能接近Python 3.x语法的Python 2.7代码
因为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 个回答
你还需要使用新的异常语法,也就是说不再使用
try:
raise Exception, "Message"
except Exception, e:
pass
而是应该这样做:
try:
raise Exception("Message")
except Exception as e:
pass
另外,确保你所有的二进制字符串前面都加一个b,比如:
b'这是一个二进制字符串'
想要更全面地了解这个话题,可以查看 http://python3porting.com/noconv.html
把下面的代码放到一个叫 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
#
现在很多模块都被重新编写成可以在Python 2和Python 3上运行。这其实并不难,将来我们可以很轻松地放弃对Python 2的支持。
可以看看这个six模块,它可以帮助我们处理这个问题,把Python 2和Python 3之间的许多差异封装得很方便:
Six提供了一些简单的工具,用来处理Python 2和Python 3之间的差异。
它的网站(当然还有代码)列出了很多实现这个目标的方法。