Какой самый питонный способ поддержки функций 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