由于Django还不支持Python 3.x,我使用的是Python 2.7。但是,我想继续并尽可能熟悉新的Python 3.x语法。这引出了我的问题:
我知道正在运行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
还有什么?
答案 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)
答案 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()
。