5

使用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,有没有更清洁的方法?

4

5 回答 5

4

而不是禁用 E1101,您应该输入:

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

在 .pylintrc[TYPECHECK]部分下。

正如它在pylint doc中所代表的那样,此选项“对于动态设置属性的类很有用”。

于 2013-06-18T06:27:25.120 回答
2

nose.tools.trivial只需动态检查unittest.TestCase类,并使所有“公共”方法从或开始assert可用:nose.toolsnose.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

鼻子/工具/琐碎.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_equaland assert_equals(这些方法实际上是相同的)。希望有帮助。

于 2013-06-17T21:03:42.827 回答
1

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

于 2013-06-18T07:19:54.293 回答
0

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

ignored-modules=nose.tools,nose.tools.trivial
于 2015-06-09T15:00:32.193 回答
0

或者将您的 astroid 升级到 1.3.6,鼻子问题已修复:https ://bitbucket.org/logilab/astroid/src/fdc592a3609ca7b882e12110d072a0e12f899338/astroid/brain/pynose.py?at=default

于 2015-06-09T15:06:46.837 回答