【问题标题】:Standard solution for supporting Python 2 and Python 3支持 Python 2 和 Python 3 的标准解决方案
【发布时间】:2015-12-07 02:02:34
【问题描述】:

我正在尝试编写一个向前兼容的程序,我想知道在需要不同导入的情况下,处理这种情况的“最佳”方法是什么。

在我的具体情况下,我使用 Python2 中的 ConfigParser.SafeConfigParser(),它在 Python3 中变为 configparser.ConfigParser()

到目前为止,我已经通过在导入时使用 try-except 或在 Python 版本上使用条件(使用 sys)使其工作。两者都有效,但我想知道是否有推荐的解决方案(也许我还没有尝试过)。

预计到达时间: 感谢大家。我使用six.moves 没有问题。

【问题讨论】:

  • 除了python版本之外,导入可能引发异常的原因还有很多!所以以 sys.version_info 为条件一定是这两个想法中更好的一个。
  • @nigel222 从标准库导入不应抛出异常;如果他们这样做你有更大的问题。版本检查更脆弱,什么也得不到。
  • 它并不仅仅与标准库有关,而不是一般的条件导入。此外,“更大的问题”比您想象的更常见,如果系统是由没有 IT 背景的人(业余爱好者、大学研究员等)维护的桌面,我更愿意直接了解它们,而不是必须调试“曾经工作”的错误导入!

标签: python python-3.x import module compatibility


【解决方案1】:

这个模式很标准:

try:
    from configparser import ConfigParser
except ImportError:
    from ConfigParser import SafeConfigParser as ConfigParser

【讨论】:

  • 我可能会评论这一点,注意一个适用于 Python 2 和另一个 3+,但是是的!
  • 如果您不想安装额外的模块,这是正确的解决方案。
  • 谢谢。我已经想出了这个解决方案,但我不知道这是标准。在我的情况下,我可以使用 Six.move,但如果我必须使用不是由 Six 处理的第 3 方模块,我将使用它。
【解决方案2】:

使用six!这是一个 python 兼容性模块,可以消除 python3 和 python2 之间的差异。文档available here 将帮助您解决此问题以及您遇到的任何其他问题..

特别是你的情况,你可以

from six.moves import configparser
import six

if six.PY2:
  ConfigParser = configparser.SafeConfigParser
else:
  ConfigParser = configparser.ConfigParser

你会很高兴的。

【讨论】:

  • 看起来...不错,但为什么ConfigParser 的赋值不是由import 语句处理?我原以为这是six.moves 模块的重点。
  • ...哦,我看到 import 语句 正在 处理 ConfigParser => configparser 模块名称更改。明白了。
  • 这是我使用的解决方案,是的,六个正在处理分配。
【解决方案3】:

您也可以这样做:

import sys
if sys.version[:1] == '2':
    from configparser import ConfigParser
else:
    from ConfigParser import SafeConfigParser as ConfigParser

阅读更多Here

【讨论】:

  • 正如我的问题中所述,我已经找到 如何 来做到这一点,但我正在寻找最佳实践解决方案,据我所知,这是最后的选择.
猜你喜欢
  • 1970-01-01
  • 2018-04-08
  • 2020-02-15
  • 2013-03-16
  • 1970-01-01
  • 2017-01-19
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多