2013-06-17 9 views
5

Was ist der richtige Weg, nose.tools zu verwenden und pylint glücklich zu halten?Nase Werkzeuge und pylint

Der folgende Code:

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

Ergebnisse in den folgenden Pylint Fehler:

$ 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 

Natürlich ein E1101 deaktivieren könnte, gibt es eine sauberere Weg?

Antwort

2

nose.tools.trivial einfach unittest.TestCase Klasse on the fly inspiziert und macht alle "öffentlichen" Methoden aus assert erhältlich von nose.tools oder nose.tools.trivial Start:

Nase/tools/__ 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 

Nase/tools /trivial.py:

Pylint kann dieses "hacky" Verhalten nicht behandeln.

Verwenden Sie nose.tools.eq_ anstelle von assert_equal und assert_equals (diese Methoden sind eigentlich die gleichen). Ich hoffe, das hilft.

+0

Dies ist ein guter Einblick. Es sieht zwar so aus, dass in 'nose/tools/trivial.py'" pep8 "Versionen der unittest-Implementierungen von' assertEqual'/'assertEquals' als' assert_equal'/'assert_equals' usw. angehängt werden. Aber' assertEqual' und ' assertEquals' werden nicht hinzugefügt. nose.tools bietet eine eigene Implementierung von 'eq_', die sich von den Implementierungen von unittest unterscheidet (obwohl beide gleich sein sollen). – user650654

+0

Sicher, guter Punkt, ich meinte 'assert_equal' und' assert_equals'. Ja, 'eq_' funktioniert etwas anders als' assertEqual/assertEquals' Methoden von 'unittest.TestCase'. – alecxe

4

Statt E1101 zu deaktivieren, sollten Sie setzen:

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

in .pylintrc unter dem [TYPECHECK] Abschnitt.

Wie es in der pylint doc steht, ist diese Option "nützlich für Klassen mit Attributen dynamisch festgelegt".

+1

Das klingt wie es sollte funktionieren, aber Pylint wirft immer noch den gleichen Fehler. Was vermisse ich? Ich verwende nosetests Version 1.3.0. –

+0

Ich versuche es einfach in einem virtualenv mit python = 2.7.4, nose = 1.3.0 und pylint = 1.0.0, mit dem rcfile bekomme ich 'pylint --generate-rcfile': nicht mehr E1101 wenn ich den' ignored- Klassen in Rcfile. Kannst du das Gleiche versuchen? –

1

Pylint versteht die zugrunde liegende Magie nicht. Wie vorgeschlagen, umfassen die Lösungen das Deaktivieren von E1101 oder das Ignorieren verwandter Klassen. Aber das Beste ist, zu der pylint-brain project beizutragen, indem man dort eine einfache Beschreibung des Teils der API eingibt, der von Pylint nicht erfasst wird. Dies sollte ziemlich einfach aus dem Dokument und Beispiel sein, das Sie dort finden.

+0

hmm, dieser Link scheint tot zu sein. – user650654

+0

@ user650654 verwenden Sie tatsächlich https://bitbucket.org/logilab/pylint-brain statt – sthenault

+0

Klingt wie eine gute Idee, aber ich brauche eine Pip-Installation, um dies in der Produktion zu verwenden. Gibt es Pläne, eine Version zu veröffentlichen? –

0

Mit Pylint 1.4.3 (mit astroid 1.3.6, gemeinsamen 0.63.2, Python 2.7.10), die Einstellung, die geändert werden muss, ist ignored-modules, und nicht ignored-classes:

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