【问题标题】:Python: How can I create a Python project compatible to Python 2 and Python 3?Python:如何创建兼容 Python 2 和 Python 3 的 Python 项目?
【发布时间】:2013-05-21 08:14:11
【问题描述】:

我想创建一个与 Python 2.7 和 Python 3.3 兼容的包。 逻辑应该只存在一次。

您通常如何表示编程逻辑 - 在 Python 2.7 或 Python 3.3 中? 还是选择其他方式?

编辑:核心如何处理这个问题?

【问题讨论】:

  • Python3 并非 100% 向后兼容 Python2,因此在使用哪些函数时您必须非常谨慎。
  • @AshwiniChaudhary 2to3 将 Python 2.x 代码转换为与 Python 2.7 不向后兼容的 Python 3 代码。
  • 那么,您是否建议在 Python 2.7 中对包进行编码并稍后将其转换为 Python 3.3?
  • Porting HOWTO。该文档非常全面。

标签: python python-2.7 python-3.x


【解决方案1】:

您只需使用相同的语言部分,并在其他部分进行条件或异常处理即可。

这取决于你的软件做什么,以及你需要支持什么版本的 Python,这更难或更容易。通过仅支持 Python 2.6、2.7 和 3.3,它变得相对简单。

如何在关于 SO 的问题中无法回答,因为它有很多内容。

我建议你看看这本书:http://python3porting.com/,尤其是“支持 Python 2 和 3 无需 2to3 转换”一章和附录,其中有大量关于如何解决大多数不兼容问题的示例。

six 库也可能很有用。

【讨论】:

    【解决方案2】:

    我倾向于使用大量的 __future__ 导入(可能在 Python 3 中被安全地忽略了),并且偶尔将 try except 用于一些导入语句。此外,我为basestring / str 兼容性定义了一个字符串类型。取决于我每个模块需要什么。

    例如:

    from __future__ import absolute_import
    from __future__ import unicode_literals
    from __future__ import division
    from __future__ import print_function
    try:
        import ConfigParser as cfgparser
    except ImportError:
        import configparser as cfgparser
    try:
        stringtype = basestring
    except NameError:
        stringtype = str
    

    我认为six 包已经做到了这一点,所以这可能是另一个不错的选择。

    【讨论】:

    • 另外,from io import open 为您提供了严格的 Python 3 open 内置函数(其中包括二进制文件与文本文件的平台无关含义)。
    • 这只是您需要做的事情的一小部分。我认为这不是一个非常有用的答案。
    • @lennart 我同意它不完整。这正是我需要使用的,而且主要是基于每个模块(因此,ConfigParser 导入并不总是存在)。它更像是一个例子,而不是一个完整的答案,我认为这可能有助于让某人开始。对于更完整的答案,porting howto Martijn 指出确实包含大部分信息(它也提到了six)。
    • 我建议不要使用unicode_literals 未来模块,主要是因为我遇到的其他模块/第三方库的回归,如in the futures doc 所述。修复起来很麻烦。更谨慎的方法,例如使用u'' 前缀是可取的。由于样板文件,我投了赞成票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多