在一系列Python版本中支持unittest2功能的最pythonic方法是什么?

时间:2012-11-12 13:14:04

标签: python unittest2

我可以想到两种方法来确保我可以在各种Python版本中使用unittest库中的现代功能:

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 个答案:

答案 0 :(得分:2)

我会使用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的版本中更加强大。

当我用C语言编写的模块的“加速”版本时,我经常使用try变体,在文件的末尾我放了一个:

try:
    from _accelerated import *
except ImportError:
    pass

用加密的方法覆盖python实现。

答案 1 :(得分:1)

我不喜欢在第二个版本中我们必须导入另一个模块(sys)这样的事实,所以我的偏好是第一个版本:

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

编辑:

事实证明,pyflakesflake8对上述版本不满意,并会报告“从行中重新定义未使用的'import'”错误或导入“W402'TestCase'但未使用的“错误。他们似乎更喜欢将其写成如下:

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

答案 2 :(得分:0)

对于我们这些避免from ... import ...成语的人来说,这会以对其余代码透明的方式导入正确的单元测试:

import sys
if sys.version_info < (2, 7):
    import unittest2 as unittest
else:
    import unittest