2012-05-18 141 views
5

用下面的代碼:pylint的抱怨上py.test:「模塊‘pytest’沒有‘加薪’成員」

import pytest 
def test_a(): 
    with pytest.raises(Exception): 
     1/0 

如果我在其上運行pylint的,它將使抱怨說:「加薪」不是模塊pytest的成員:

E: 3,9:test_a: Module 'pytest' has no 'raises' member 

這顯然是不正確的。任何想法爲什麼pylint正在犯這樣的錯誤?這是一個已知的錯誤?

py.test版本:

> py.test --version 
This is py.test version 2.2.3, imported from C:\Python27\lib\site-packages\pytest.pyc 

pylint的版本:

> pylint --version 
No config file found, using default configuration 
pylint 0.25.1, 
astng 0.23.1, common 0.57.1 
Python 2.7.2 (default, Jun 24 2011, 12:22:14) [MSC v.1500 64 bit (AMD64)] 
+0

這將是有用的,如果你能提供你正在使用(pylint的--version的輸出)pylint的版本,還有py.test的版本。 –

+0

@gurneyalex嗨Gurney,我已經更新了原來的問題,包括版本信息。謝謝。 – KFL

回答

3

最後一次我看到pylib確實處於較低水平蟒蛇的東西有些沉重的動態,如完全重新定義導入代碼。很可能這完全阻礙了pylint/astng,並阻止它獲取pytest模塊中的內容:pylint/astng不會導入它分析的代碼,它解析它,這意味着在導入時動態初始化的東西將會通常不被注意,這反過來會產生誤報,例如您所報告的錯誤。

從那裏,你面臨以下選擇:

  • 使用另一單元測試框架,少動比py.test
  • 沉默的警告/在你的測試代碼中的錯誤手動
  • 使用其他棉短絨這比pylint對py.test更快樂(我很想知道pychecker/pyflakes在代碼中的運行情況)
  • 編寫astng插件,它將幫助astng處理pylib技巧並將其作爲補丁提交給astng維護者(並從中獲得額外的功勞)
+3

嘿亞歷克斯。 pytest不再使用「pylib」動態導入邏輯,因爲實際上幾年後,2.0版本。但是,允許插件添加到「pytest.raises」實際發生的「pytest」名稱空間中。 – hpk42

+0

感謝精確@ hpk42。然而,動態地添加到pytest命名空間對於pylint的靜態分析來說是一個顯示器,所以我上面的答案中的結論仍然成立。 –

+0

pytest有沒有辦法讓pylint知道它的命名空間? – hpk42

3

您可以用一個pylintrc文件關閉此: ignored-classes=pytest

+0

這個答案會得到我的upvote,但你遺漏了一些我希望看到的信息。選項:'ignored-classes = pytest'的正確部分應放在pylintrc文件中的[TYPECHECK]下。此外,一個pylintrc文件可以放在幾個不同的位置,例如這篇文章:http://stackoverflow.com/a/16273555/955014 – imolit

相關問題