繁体   English   中英

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

[英]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.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 开始是必需的,但在 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


#

许多 Python IDE 在这里可以提供很大帮助。

例如, PyCharm可以配置为检查与任何版本范围的兼容性,

在此处输入图片说明

并报告任何严重程度的问题:

在此处输入图片说明

您还需要使用新的异常语法,即不再使用

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM