Frequently Asked Questions
Pylint is a
static code checker, meaning it can analyse your code without
actually running it. Pylint checks for errors, tries to enforce a coding
standard, and tries to enforce a coding style.
1.2. 1.2 How is Pylint different from Pychecker?
1.3. 1.3 Who wrote Pylint?
Pylint's main author and maintainer is Sylvain Thénault. Pylint's development
is funded by
Logilab. For a full list of contributors, see the "Contributors"
section of Pylint's README file.
1.4. 1.4 Who uses Pylint?
In addition to many individuals, the following projects are known to use pylint
to help develop better
code:
2.1. 2.1 How do I install Pylint?
The easiest way to install Pylint, if you have the
setuptools package, is to
invoke
easy_install pylint
Otherwise, you'll have to download the source for Pylint and its dependencies
from the Logilab site, or through Pylint's repository. See the user manual for
detailed installation instructions.
2.2. 2.2 What kind of versioning system does Pylint use?
hg clone http://www.logilab.org/hg/pylint
2.3. 2.3 What are Pylint's dependencies?
Pylint requires the latest
logilab-astng and
logilab-common
packages. It should be compatible with any python version greater than
2.2.0.
3.1. 3.1 Can I give pylint a file as an argument instead of a module?
Pylint expects the name of a package or module as its argument. As a
convenience,
you can give it a file name if it's possible to guess a module name from
the file's path using the python path. Some examples :
"pylint mymodule.py" should always work since the current working
directory is automatically added on top of the python path
"pylint directory/mymodule.py" will work if "directory" is a python
package (i.e. has an __init__.py file) or if "directory" is in the
python path.
"pylint /whatever/directory/mymodule.py" will work if either:
-
"/whatever/directory" is in the python path
-
your cwd is "/whatever/directory"
-
"directory" is a python package and "/whatever" is in the python
path
-
"directory" is a python package and your cwd is "/whatever" and so
on...
3.2. 3.2 Where is the persistent data stored to compare between successive runs?
Analysis data are stored as a pickle file in a directory which is
localized using the following rules:
3.3. 3.3 How do I find the option name (for pylintrc) corresponding to a specific command line option?
You can always generate a sample pylintrc file with --generate-rcfile
Every option present on the command line before this will be included in
the rc file
For example:
pylint --disable=W0702,C0103 --class-rgx='[A-Z][a-z]+' --generate-rcfile
3.4. 3.4 I'd rather not run Pylint from the command line. Can I integrate it with my editor?
Yes! Pylint can be integrated with many popular editors and IDEs. The following
include Pylint by default:
4.1. 4.1 Is it possible to locally disable a particular message?
Yes, this feature has been added in pylint 0.11. This may be done by
adding "#pylint: disable=W0123,E4567" at the desired block level
or at the end of the desired line of code
4.2. 4.2 Why do I get a lot of spurious "unused variables messages" when using psyobj from
psyco?
This is actually due to a bug in psyco, making the locals()
function for objects inheriting from psyobj returning an empty
dictionary. For the moment, the only way to fix this is to use the
PYLINT_IMPORT environment variable to not use psyco during pylint
checking. Sample code
import os
try:
if os.environ.has_key('PYLINT_IMPORT'):
raise ImportError()
from psyco.classes import psyobj
except ImportError:
class psyobj:
pass
NOTICE: this problem should not occur with pylint >= 0.5 since from
this version pylint is not looking anymore for information in living
objects (i.e. it no longer imports analysed modules)
4.3. 4.3 I have a callback function where I have no control over received arguments. How do I avoid getting unused argument warnings?
Prefix (ui) the callback's name by cb_, as in cb_onclick(...). By
doing so arguments usage won't be checked. Another solution is to
use one of the names defined in the "dummy-variables" configuration
variable for unused argument ("_" and "dummy" by default).
4.4. 4.4 Is there a way to disable a message for a particular module only?
Yes, you can disable or enable (globally disabled) messages at the
module level by adding the corresponding option in a comment at the
top of the file:
# pylint: disable=W0401, E0202
# pylint: enable-msg=C0302
4.5. 4.5 What is the format of the configuration file?
pylint uses ConfigParser from the standard library to parse the configuration file.
It means that if you need to disable a lot of messages, you can use tricks like:
disable= W0401, # because I do not want it
E0202, # I have a good reason, trust me
C0302 # that's it
5. 5. Classes and Inheritance
5.1. 5.1 When is pylint considering a class as an interface?
A class is considered as an interface if there is a class named "Interface"
somewhere in its inheritance tree.
5.2. 5.2 When is pylint considering that a class is implementing a given interface?
Pylint is using the Zope 2 interfaces conventions, and so is
considering that a class is implementing interfaces listed in its
__implements__ attribute.
5.3. 5.3 When is pylint considering a class as an abstract class?
A class is considered as an abstract class if at least one of its
methods is doing nothing but raising NotImplementedError.
5.4. 5.4 How do I avoid "access to undefined member" messages in my mixin classes?
To do so you have to set the ignore-mixin-members option to
"yes" (this is the default value) and to name your mixin class with
a name which ends with "mixin" (whatever case).
6.1. 6.1 Pylint gave my code a negative rating out of ten. That can't be right!
Even though the final rating Pylint renders is nominally out of ten, there's no
lower bound on it. By default, the formula to calculate score is
10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
However, this option can be changed in the pylint rc file. If having negative
values really bugs you, you can set the formula to be the minimum of 0 and the
above expression.
6.2. 6.2 Why does Pychecker catch problems with imports that Pylint doesn't?
pychecker and pylint use different approaches. pychecker
imports the modules and rummages around in the result, hence it sees my
mangled sys.path. pylint doesn't import any of the candidate modules and
thus doesn't include any of import's side effects (good and bad). It
traverses an AST representation of the code.
6.3. 6.3 I think I found a bug in Pylint. What should I do?
Notice that if you don't find something you have expected in pylint's
tracker page, it may be on the tracker page of one of its dependencies, namely
astng and common:
6.4. 6.4 I have a question about Pylint that isn't answered here.
The
python-projects@logilab.org mailing list is a great place to discuss and
ask questions about Pylint. This is a
moderated mailing list, so if you're not subscribed email you send will have to
be validated first before actually being sent on the list.
If you prefer speaking french instead of english, you can use the
generic
forum-fr@logilab.org mailing list:
Notice though that this list has a very low traffic since most pylint related
discussions are done on the python-projects mailing list.