¿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
O actualice su astroid a 1.3.6, el problema de la nariz se solucionó: https://bitbucket.org/logilab/astroid/src/fdc592a3609ca7b882e12110d072a0e12f899338/astroid/brain/pynose.py?at=default