[英]Writing Python 2.7 code that is as close to Python 3.x syntax as possible
由于 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
以上四个__future__ import
语句从 Python 3.0 开始是必需的,但在 2.7 中不需要,如Python 2.7.3 的文档 27.11 中所述。 未来声明定义
还有什么?
如今,许多模块都以允许在 Python 2 和 Python 3 上执行的方式进行了重写。事实证明,这根本不是很难,而且在未来,放弃对 Python 2 的支持将非常容易。
看看有助于完成这项任务的六个模块,它们以一种方便的方式封装了许多差异:
六提供了简单的实用程序来包装 Python 2 和 Python 3 之间的差异。
它的网站(当然还有代码)列出了很多使这成为可能的方法。
将以下代码放入py3k.py
模块并像这样from py3k import *
: 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,即:
b'这是一个二进制字符串'
有关此主题的更完整介绍,请参阅http://python3porting.com/noconv.html
try:
input = raw_input
range = xrange
except NameError:
pass
有两个浮现在脑海...
我建议你尝试一下未来的图书馆。 从他们的网站:
python-future 是 Python 2 和 Python 3 之间缺少的兼容层。它允许您使用单个、干净的 Python 3.x 兼容代码库以最小的开销同时支持 Python 2 和 Python 3。
它为未来和过去的包提供了来自 Python 3 和 2 的功能的向后移植和向前移植。它还带有未来化和巴氏杀菌、定制的基于 2to3 的脚本,可帮助您轻松转换 Py2 或 Py3 代码以支持 Python 2 和 3在一个干净的 Py3 风格的代码库中,一个模块一个模块。
使用 python-future 实现 Python 2/3 兼容性的著名项目是 Mezzanine 和 ObsPy。
Avoing range()
和zip()
,使用xrange()
和itertools.izip()
代替。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.