我可以想到两种方法来确保我可以在各种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?
答案 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
编辑:
事实证明,pyflakes
和flake8
对上述版本不满意,并会报告“从行中重新定义未使用的'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