鼻子工具和pylint

时间:2013-06-17 20:27:13

标签: python testing nose pylint

使用nose.tools并保持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错误:

$ 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,有更清洁的方式吗?

5 个答案:

答案 0 :(得分:4)

您应该输入:

,而不是禁用E1101
ignored-classes=nose.tools,nose.tools.trivial

[TYPECHECK]部分的.pylintrc中。

它位于pylint doc中,此选项“对于具有动态设置属性的类非常有用”。

答案 1 :(得分:2)

nose.tools.trivial只需动态检查unittest.TestCase课程,并从assertnose.tools {/ 1}开始提供nose.tools.trivial所有“公开”方法:

鼻子/工具/ __ 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无法处理这种“hacky”行为。

考虑使用nose.tools.eq_代替assert_equalassert_equals(这些方法实际上是相同的)。希望有所帮助。

答案 2 :(得分:1)

Pylint不了解鼻子底层的魔法。如建议的那样,解决方案包括禁用E1101或忽略相关类。但最好是通过提交Pylint未掌握的API部分的简单描述来为pylint-brain project做出贡献。从您在那里找到的文档和示例中,这应该非常简单。

答案 3 :(得分:0)

使用pylint 1.4.3(使用astroid 1.3.6,通用0.63.2,Python 2.7.10),必须更改的设置为ignored-modules,而不是ignored-classes

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

答案 4 :(得分:0)