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

Using import with multiple versions of a module with different structure

假设一个函数在包版本之间从一个模块移动到另一个模块,例如如在 中,我们希望在我们的客户端代码中支持两个版本,导入此函数。我们应该简单地检查版本并将其与发生更改的第一个主要版本进行比较,还是有更优雅的解决方案? IE。像这样的事情(在链接问题的上下文中):

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

使用异常处理程序捕获 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

标准方法是不检查版本,而是检查您感兴趣的特性是否存在。这样,您就不会绑定到特定的版本行和提供程序。例如:

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)