2012-11-12 46 views
1

我能想到的两种方式,以确保我能在广泛的Python版本使用现代特色从单元测试库:Python范围内支持unittest2功能的最蟒蛇方式是什么?

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 

其中哪一个是更Python ?

回答

1

我会使用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实现一。

+0

谢谢。我不测试python3,所以没有选择。 – snth

1

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

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

编辑:

原来pyflakesflake8对上述版本不满意,并将报告“重新定义未使用的'导入'从行...'错误或”W402'TestCase导入但未使用“错误。他们似乎更喜欢它写入如下:

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

这些工具是不是“法官”。他们简单点*可能*错误/改进。在这种情况下,我会说他们错了,你的第二个例子比第一个更糟。 – Bakuriu

+1

@Bakuriu我倾向于同意你的看法。只是有些项目的编码标准依赖于这些工具。 – snth

0

对于我们这些谁避免from ... import ...成语,这种进口权单元测试在透明的代码的其余部分的方式:

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