Использование импорта с несколькими версиями модуля с различной структурой - PullRequest
0 голосов
/ 03 июня 2019

Предположим, что функция была перемещена из одного модуля в другой между версиями пакета, например как в этот вопрос , и мы хотели бы поддержать обе версии в нашем клиентском коде, который импортирует эту функцию. Должны ли мы просто проверить версию и сравнить ее с первой основной версией, где произошли изменения, или есть более элегантное решение? То есть как то так (в контексте связанного вопроса):

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 ]

1 голос
/ 03 июня 2019

Стандартным способом является не проверка версии, а наличие интересующей вас характеристики.Таким образом, вы не привязаны к конкретной версии версии и провайдеру.Например:

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)
1 голос
/ 03 июня 2019

Использовать обработчик исключений, перехватывающий 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
...