2013-06-17 4 views
5

nose.tools를 사용하고 행복 pylint를 유지하는 올바른 방법은 무엇입니까?코 도구와 pylint

다음 코드 : 다음 pylint 오류에

''' 
This is a test 
''' 

import nose.tools 
import nose.tools.trivial 

nose.tools.assert_equal(1, 1) 
nose.tools.assert_equals(1, 1) 

nose.tools.trivial.assert_equal(1, 1) 
nose.tools.trivial.assert_equals(1, 1) 

결과 : 물론

$ pylint -i y -r n /tmp/aseq.py 
************* Module aseq 
E1101: 8,0: Module 'nose.tools' has no 'assert_equal' member 
E1101: 9,0: Module 'nose.tools' has no 'assert_equals' member 
E1101: 11,0: Module 'nose.tools.trivial' has no 'assert_equal' member 
E1101: 12,0: Module 'nose.tools.trivial' has no 'assert_equals' member 

은, 하나는 E1101을 사용하지 수, 깨끗한 방법은 무엇입니까?

단순히 비행에 unittest.TestCase 클래스를 검사하고 있습니다

답변

2

nose.tools.trivial 모든 nose.tools 또는 nose.tools.trivial에서 사용할 수 assert부터 "공개"방법 :

코/도구/__ init__.py :

from nose.tools.nontrivial import * 
from nose.tools.nontrivial import __all__ as nontrivial_all 
from nose.tools.trivial import * 
from nose.tools.trivial import __all__ as trivial_all 

__all__ = trivial_all + nontrivial_all 

코/도구 /trivial.py :

... 

class Dummy(unittest.TestCase): 
    def nop(): 
     pass 
_t = Dummy('nop') 

for at in [ at for at in dir(_t) 
      if at.startswith('assert') and not '_' in at ]: 
    pepd = pep8(at) 
    vars()[pepd] = getattr(_t, at) 
    __all__.append(pepd) 

... 

Pylint는이 "해킹"동작을 처리 할 수 ​​없습니다.

assert_equalassert_equals 대신에 nose.tools.eq_을 사용하는 것이 좋습니다 (실제로 이러한 방법은 동일합니다). 희망이 도움이됩니다.

+0

이것은 좋은 통찰력입니다. 'nose/tools/trivial.py'에있는 것처럼 보일지라도,'assertEqual' /'assertEquals'의 unittest 구현의 버전은'assert_equal' /'assert_equals' 등으로 추가됩니다. 그러나'assertEqual'과' assertEquals'는 추가되지 않습니다. nose.tools는 unittest의 구현과는 달리 자체 eq_ 구현을 제공합니다 (둘 다 같아지기를 원하지만). – user650654

+0

물론, 좋은 지적, 나는'assert_equal'과'assert_equals'을 의미했습니다. 네,'eq_'는'unittest.TestCase'의'assertEqual/assertEquals' 메쏘드와 조금 다르게 작동합니다. – alecxe

4

대신 E1101을 사용하지 않도록 설정, 당신은 넣어해야합니다 .pylintrc에서

ignored-classes=nose.tools,nose.tools.trivial 

을의 [TYPECHECK] 섹션.

pylint doc에있는 것처럼이 옵션은 "속성이 동적으로 설정된 클래스에 유용합니다."

+1

이것은 정상적으로 작동하는 것처럼 들리지만, pylint는 여전히 같은 오류를 던지고 있습니다. 내가 뭘 놓치고 있니? nosetests 버전 1.3.0을 사용하고 있습니다. –

+0

난 단지 python = 2.7.4, nose = 1.3.0, pylint = 1.0.0으로 virtualenv를 시도해 본다. rcfile은'pylint --generate-rcfile'에 의해 얻어진다. : 더 이상 E1101,'ignored- rcfile에있는 클래스들. 같은 것을 시도해 볼 수 있습니까? –

1

Pylint는 코의 기본 마법을 이해하지 못합니다. 제안 된대로 솔루션에는 E1101을 사용하지 않도록 설정하거나 관련 클래스를 무시하는 것이 포함됩니다. 그러나 가장 좋은 점은 Pylint가 파악하지 못한 API에 대한 간단한 설명을 제출하여 pylint-brain project에 기여하는 것입니다. 이것은 당신이 찾을 수있는 문서와 예제에서 매우 간단해야합니다. pylint 1.4.3 사용

+0

흠, 그 링크가 죽은 것 같습니다. – user650654

+0

@ user650654 실제로, https://bitbucket.org/logilab/pylint-brain을 사용하십시오. – sthenault

+0

좋은 생각처럼 들리지만 프로덕션 환경에서 이것을 사용하려면 pip 설치가 필요합니다. 버전을 공개 할 계획이 있습니까? –

0

(별 모양 1.3.6과를, 일반 0.63.2, 2.7.10 파이썬), 변경할 수있는 설정은 ignored-modules이며,하지 ignored-classes :

ignored-modules=nose.tools,nose.tools.trivial