2012-11-12 95 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