导入特定于版本的 python 模块的最佳方法

Posted

技术标签:

【中文标题】导入特定于版本的 python 模块的最佳方法【英文标题】:Best way to import version-specific python modules 【发布时间】:2010-09-25 10:33:57 【问题描述】:

哪种方法最适合在 python 中导入特定于版本的模块?我的用例是我正在编写将部署到 python 2.3 环境中并在几个月内升级到 python 2.5 的代码。这个:

if sys.version_info[:2] >= (2, 5):
    from string import Template
else:
    from our.compat.string import Template

或者这个

try:
    from string import Template
except ImportError:
    from our.compat.string import Template

我知道这两种情况都同样正确并且可以正常工作,但哪种情况更可取?

【问题讨论】:

【参考方案1】:

总是第二种方式 - 你永远不知道会安装哪些不同的 Python 安装。 Template 是一个不太重要的特定情况,但是当您测试功能而不是版本控制时,您总是更健壮。

这就是我如何让Testoob 支持 Python 2.2 - 2.6:我尝试以不同的方式导入一个模块,直到它工作为止。它也与 3rd-party 库有关。

这是一个极端情况 - 支持 ElementTree 出现的不同选项:

try: import elementtree.ElementTree as ET
except ImportError:
    try: import cElementTree as ET
    except ImportError:
        try: import lxml.etree as ET
        except ImportError:
            import xml.etree.ElementTree as ET # Python 2.5 and up

【讨论】:

对于 Python 2.5 及更高版本您错过了from xml.etree import cElementTree as ET【参考方案2】:

我可能会争辩说第二个更可取。有时,您可以将模块从较新版本的 python 安装到较旧版本中。例如,wsgiref 是 Python 2.5 自带的,但它被安装到旧版本中并不少见(我认为它可以与 python 2.3 一起使用)。

【讨论】:

以上是关于导入特定于版本的 python 模块的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

导入模块的 Python 类型提示

导入模块的最佳方法Python [重复]

处理仅由某些 Python 类使用的导入的最佳方法

将特定于语言环境的字符串转换为 BigDecimal 的最佳方法

Python 模块是如何工作的

懒惰地导入 UI 模块/组件的最佳方法是啥