Какой самый питонный способ поддержки функций unittest2 в разных версиях Python?

Я могу придумать два способа обеспечить использование современных функций из библиотеки unittest в широком диапазоне версий Python:

try:
    from unittest2 import TestCase
except ImportError:
    from unittest import TestCase

или же

import sys
if sys.verson_info.major>=2 and sys.version_info.minor>=7:
    from unittest import TestCase
else:
    from unittest2 import TestCase

Какой из них более Pythonic?

3 ответа

Решение

Я бы использовал try заявление. Это часто используемая идиома. Также ваш sys версия не подходит для python3.3:

>>> if sys.version_info.major>=2 and sys.version_info.minor>=7:
...     from unittest import TestCase
... else:
...     from unittest2 import TestCase
... 
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
ImportError: No module named 'unittest2'

Пока должно быть:

>>> import sys
>>> major, minor = sys.version_info.major, sys.version_info.minor
>>> if (major >= 2 and minor >= 7) or (major >= 3 and minor >= 2):
...     from unittest import TestCase
... else:
...     from unittest2 import TestCase
... 
>>> 

Это также показывает, что try Версия является более надежной в версиях Python.

Я часто использую try вариант, когда у меня есть "ускоренная" версия модуля, написанная на C, в конце файла я помещаю:

try:
    from _accelerated import *
except ImportError:
    pass

переписать реализацию python на ускоренную.

Мне не нравится тот факт, что во второй версии мы должны импортировать другой модуль (sys) поэтому я предпочитаю первую версию:

try:
    from unittest2 import TestCase
except ImportError:
    from unittest import TestCase

РЕДАКТИРОВАТЬ:

Оказывается, что pyflakes а также flake8 недовольны вышеприведенной версией и сообщат об "переопределении неиспользованной ошибки" import "from line..." или "W402 'TestCase' импортирован, но не используется". Кажется, они предпочитают, чтобы это было написано следующим образом:

try:
    import unittest2
    TestCase = unittest2.TestCase
except ImportError:
    import unittest
    TestCase = unittest.TestCase

Для тех из нас, кто избегает from ... import ... идиома, это импортирует правильный unittest способом, прозрачным для остальной части кода:

import sys
if sys.version_info < (2, 7):
    import unittest2 as unittest
else:
    import unittest
Другие вопросы по тегам