由于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
从__future__ import
Python 3.0开始,上述四个语句是必需的,但在Python 2.7.3的文档27.11中描述的2.7中不需要.未来声明定义
还有什么?
现在许多模块都以允许在Python 2和Python 3上执行的方式进行重写.事实证明这并不是很难,并且将来很容易放弃Python 2支持.
看看有助于完成此任务的六个模块,以方便的方式封装了许多差异:
Six提供了简单的实用程序,用于包装Python 2和Python 3之间的差异.
它的网站(当然还有代码)列出了许多实现这一目标的方法.
将下面的代码放到一个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 #
您还需要使用新的异常语法,即不再需要
try: raise Exception, "Message" except Exception, e: pass
相反,你应该这样做:
try: raise Exception("Message") except Exception as e: pass
还要确保在所有二进制字符串前加上ab,即:
这是一个二进制字符串'
有关此主题的更完整的介绍,请参阅http://python3porting.com/noconv.html
许多Python IDE在这里都有很大的帮助.
例如,PyCharm可以配置为检查与任何版本范围的兼容性,
并报告任何严重程度的问题:
try: input = raw_input range = xrange except NameError: pass
有两个让人想起......