在代码中支持多个Python版本?

12 投票
3 回答
4863 浏览
提问于 2025-04-15 14:53

今天我在写一个针对Python 2.6的脚本时,尝试使用pyPdf 1.12。运行我的脚本,甚至在导入pyPdf时,系统就开始抱怨一些过时的功能(比如md5变成了hashsum,还有sets)。我想贡献一个补丁,让这个库在2.6上能正常工作,但我想作者可能不想破坏对旧版本(2.5及更早版本)的兼容性。

我在谷歌和Stack Overflow上搜索了很久,但到现在还没有找到相关的信息。我记得以前见过在导入语句周围使用try/except块的例子,能实现类似的效果,但现在找不到具体的例子。请问有没有什么普遍接受的最佳实践,来支持多个Python版本呢?

3 个回答

0

这里支持多个版本的Python。你可以选择a) 有条件地使用较新的版本,这需要一些额外的操作,或者b) 关闭警告,这其实应该是默认设置(在较新的Python版本中是这样的)。

4

你当然可以这样做

try:
  import v26
except ImportError:
  import v25

深入Python——将异常用于其他目的

12

有两种方法可以做到这一点:


(1) 就像你描述的那样:尝试某个操作,然后针对旧版本处理异常。比如,你可以先尝试导入 json 模块,如果失败了,就导入一个用户自定义的实现:

try:
    import json
except ImportError:
    import myutils.myjson as json

这是来自Django的一个例子(他们经常使用这种技巧):

try:
    reversed
except NameError:
    from django.utils.itercompat import reversed     # Python 2.3 fallback

如果可以使用迭代器 reversed,他们就用它。否则,他们会从 utils 包中导入自己的实现。


(2) 明确比较Python解释器的版本:

import sys
if sys.version_info < (2, 6, 0):
    # Do stuff for old version...
else:
    # Do 2.6+ stuff

sys.version_info 是一个元组,可以很方便地与其他类似的版本元组进行比较。

撰写回答