Herramientas para la nariz y pylint

¿Cuál es la forma correcta de usar nose.tools y mantener a pylint happy?

El siguiente código:

''' 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) 

Resultados en los siguientes errores de pylint:

 $ pylint -iy -rn /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 

Por supuesto, uno podría deshabilitar E1101, ¿hay una forma más limpia?

En lugar de deshabilitar E1101, debes poner:

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

en .pylintrc, en la sección [TYPECHECK] .

Tal como está en el documento pylint , esta opción es “útil para las clases con atributos establecidos dinámicamente”.

nose.tools.trivial simplemente inspecciona la clase nose.tools.trivial sobre la marcha y pone a disposición todos los métodos “públicos” a partir de assert disponibles en nose.tools o nose.tools.trivial :

nariz / herramientas / __ 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 

nariz / herramientas / 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 no puede manejar este comportamiento “hacky”.

Considere utilizar nose.tools.eq_ lugar de assert_equal y assert_equals (estos métodos son en realidad los mismos). Espero que ayude.

Pylint no entiende la magia subyacente de la nariz. Como se sugirió, las soluciones incluyen deshabilitar E1101 o ignorar clases relacionadas. Pero lo mejor es contribuir al proyecto pylint-brain presentando allí una descripción simple de la parte de la API que Pylint no ha captado. Esto debería ser bastante simple desde el documento y el ejemplo que encontrará allí.

Usando el pylint 1.4.3 (con astroid 1.3.6, común 0.63.2, Python 2.7.10), la configuración que se debe cambiar es ignored-modules , y no en las ignored-classes :

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