[英]Testing not known module in unittest with Python 3
我觀察到Python 3 unittest的奇怪行為。 在函數testValue
測試之后,存在一個不存在的模塊。
import sys
import unittest
class ModuleTest(unittest.TestCase):
def testValue(self):
import unknown_module
result = unknown_module.value
self.assertEqual(0.0, result)
if __name__ == "__main__":
print(sys.version)
unittest.main()
Python2正確地給出了以下輸出:
2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)]
E
======================================================================
ERROR: testValue (__main__.ModuleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\bin\WinPython-64bit-2.7.5.1\workspace\unknown_module_test.py", line 7, in testValue
import unknown_module
ImportError: No module named unknown_module
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
但是當引用unknown_module.value
時,Python 3聲明了一個AttributeError。
3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)]
E
======================================================================
ERROR: testValue (__main__.ModuleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "unknown_module_test.py", line 8, in testValue
result = unknown_module.value
AttributeError: 'module' object has no attribute 'value'
----------------------------------------------------------------------
Ran 1 test in 0.016s
FAILED (errors=1)
為什么不像Python 2那樣拋出Python 3一個ImportError
呢?
您正在導入隱式命名空間包。 引用Python 3.3什么是新頁面 :
對不需要__init__.py標記文件的包目錄的本機支持,並且可以自動跨越多個路徑段(受各種第三方方法命名空間包的啟發,如PEP 420中所述)
如果掃描完成而未返回模塊或包,並且至少記錄了一個目錄,則會創建命名空間包。 新的命名空間包:
- 將
__path__
屬性設置為在掃描期間找到並記錄的路徑字符串的可迭代。- 沒有
__file__
屬性。
和
命名空間包和常規包非常相似。 不同之處是:
- 部分命名空間包不一定都來自相同的目錄結構,甚至來自同一個加載器。 常規包是自包含的:所有部分都位於同一目錄層次結構中。
- 命名空間包沒有
__file__
屬性。- 命名空間包的
__path__
屬性是字符串的只讀可迭代,在修改父路徑時會自動更新。- 命名空間包沒有
__init__.py
模塊。- 命名空間包的
__loader__
屬性具有不同類型的對象。
從sys.path
刪除unknown_module
目錄,測試將失敗,就像在早期Python版本中那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.