对具有不同结构的模块的多个版本使用导入

时间:2019-06-03 11:11:02

标签: python versioning

假设某个功能在软件包版本之间从一个模块移动到另一个模块,例如就像this question中一样,并且我们希望在我们的客户端代码中支持这两个版本,从而导入了此功能。我们应该简单地检查版本并将其与发生更改的第一个主要版本进行比较,还是有一个更优雅的解决方案?即诸如此类(在链接的问题中):

import tensorflow
from packaging import version
if version.parse(tensorflow.__version__) >= version.parse("1.12"):
    from tensorflow.python.training import device_util
else:
    from tensorflow.python.distribute import device_util

2 个答案:

答案 0 :(得分:1)

使用捕获ImportError的异常处理程序。

try:
    from tensorflow.python.training import device_util
except ImportError:
    # This method was moved in tensorflow 1.12
    from tensorflow.python.distribute import device_util

答案 1 :(得分:1)

标准方法是不检查版本,而是检查您感兴趣的特性是否存在。这样,您就不会受到特定版本线和提供者的束缚。例如:

if hasattr(module, 'foo'):
    # new version
else:
    # old version


try:
    import tkinter
except ImportError:
    import Tkinter as tkinter


ironpython = hasattr(Exception, 'clsException')    #the feature that interests us
<...>
if ironpython: import System

有时候,检查功能很困难,因此检查版本要容易得多

# ABI config variables are introduced in PEP 425
if sys.version_info[:2] < (3, 2):
    import warnings
    warnings.filterwarnings('ignore', r"Config variable '[^']+' is unset, "
                                      r"Python ABI tag may be incorrect",
                            category=RuntimeWarning)