Pylint Docs
Pylint Docs
Release 2.4.4
1 Introduction 3
1.1 What is Pylint? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 What Pylint is not? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Tutorial 5
2.1 Intro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Your First Pylint’ing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 The Next Step . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3 User Guide 11
3.1 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 Running Pylint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3 Pylint output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.4 Messages control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.5 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.6 Editor and IDE integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4 How To Guides 27
4.1 How to Write a Checker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.2 How To Write a Pylint Plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.3 Transform plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5 Technical Reference 35
5.1 Startup and the Linter Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.2 Checkers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.3 Optional Pylint checkers in the extensions module . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.4 Pylint features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.5 Pylint and C extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
6 Development 73
6.1 Contributing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
i
7.4 4. Message Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
7.5 5. Classes and Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
7.6 6. Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
9 Support 83
Index 179
ii
Pylint Documentation, Release 2.4.4
Pylint is a tool that checks for errors in Python code, tries to enforce a coding standard and looks for code smells. It
can also look for certain type errors, it can recommend suggestions about how particular blocks can be refactored and
can offer you details about the code’s complexity.
Contents 1
Pylint Documentation, Release 2.4.4
2 Contents
CHAPTER 1
Introduction
Pylint is a tool that checks for errors in Python code, tries to enforce a coding standard and looks for code smells. It
can also look for certain type errors, it can recommend suggestions about how particular blocks can be refactored and
can offer you details about the code’s complexity.
Other similar projects would include pychecker (now defunct), pyflakes, flake8, and mypy. The default coding style
used by Pylint is close to PEP 8.
Pylint will display a number of messages as it analyzes the code and it can also be used for displaying some statistics
about the number of warnings and errors found in different files. The messages are classified under various categories
such as errors and warnings.
Last but not least, the code is given an overall mark, based on the number and severity of the warnings and errors.
What Pylint says is not to be taken as gospel and Pylint isn’t smarter than you are: it may warn you about things that
you have conscientiously done.
Pylint tries hard to report as few false positives as possible for errors, but it may be too verbose with warnings. That’s
for example because it tries to detect things that may be dangerous in a context, but are not in others, or because it
checks for some things that you don’t care about. Generally, you shouldn’t expect Pylint to be totally quiet about your
code, so don’t necessarily be alarmed if it gives you a hell lot of messages for your project!
The best way to tackle pylint’s verboseness is to:
• enable or disable the messages or message categories that you want to be activated or not for when pylint
is analyzing your code. This can be done easily through a command line flag. For instance, disabling all
convention messages is simple as a --disable=C option added to pylint command.
• create a custom configuration file, tailored to your needs. You can generate one using pylint’s command
--generate-rcfile.
3
Pylint Documentation, Release 2.4.4
4 Chapter 1. Introduction
CHAPTER 2
Tutorial
2.1 Intro
Beginner to coding standards? Pylint can be your guide to reveal what’s really going on behind the scenes and help
you to become a more aware programmer.
Sharing code is a rewarding endeavor. Putting your code out there can be either an act of philanthropy, coming
of age, or a basic extension of belief in open source. Whatever the motivation, your good intentions may not have
the desired outcome if people find your code hard to use or understand. The Python community has formalized some
recommended programming styles to help everyone write code in a common, agreed-upon style that makes the most
sense for shared code. This style is captured in PEP 8, the "Style Guide for Python Code". Pylint can be a quick and
easy way of seeing if your code has captured the essence of PEP 8 and is therefore friendly to other potential users.
Perhaps you’re not ready to share your code but you’d like to learn a bit more about writing better code and don’t know
where to start. Pylint can tell you where you may have run astray and point you in the direction to figure out what you
have done and how to do better.
This tutorial is all about approaching coding standards with little or no knowledge of in-depth programming or the
code standards themselves. It’s the equivalent of skipping the manual and jumping right in.
My command line prompt for these examples is:
robertk01 Desktop$
Running Pylint with no arguments will invoke the help dialogue and give you an idea of the arguments available to
you. Do that now, i.e.:
5
Pylint Documentation, Release 2.4.4
If you need more detail, you can also ask for an even longer help message, like so:
robertk01 Desktop$ pylint --long-help
...
Even more stuff
...
Pay attention to the last bit of this longer help output. This gives you a hint of what Pylint is going to pick on:
Output:
Using the default text output, the message format is :
MESSAGE_TYPE: LINE_NUM:[OBJECT:] MESSAGE
There are 5 kind of message types :
* (C) convention, for programming standard violation
* (R) refactor, for bad code smell
* (W) warning, for python specific problems
* (E) error, for probable bugs in the code
* (F) fatal, if an error occurred which prevented pylint from doing
further processing.
When Pylint is first run on a fresh piece of code, a common complaint is that it is too noisy. The current default
configuration is set to enforce all possible warnings. We’ll use some of the options I noted above to make it suit your
preferences a bit better (and thus make it emit messages only when needed).
We’ll use a basic Python script as fodder for our tutorial. The starting code we will use is called simplecaeser.py and
is here in its entirety:
1 #!/usr/bin/env python3
2
3 import string
4
5 shift = 3
6 choice = input("would you like to encode or decode?")
7 word = input("Please enter text")
8 letters = string.ascii_letters + string.punctuation + string.digits
9 encoded = ''
10 if choice == "encode":
(continues on next page)
6 Chapter 2. Tutorial
Pylint Documentation, Release 2.4.4
-----------------------------------
Your code has been rated at 6.32/10
Previous experience taught me that the default output for the messages needed a bit more info. We can see the second
line is:
This basically means that line 1 violates a convention C0111. It’s telling me I really should have a docstring. I agree,
but what if I didn’t fully understand what rule I violated. Knowing only that I violated a convention isn’t much help
if I’m a newbie. Another piece of information there is the message symbol between parens, missing-docstring
here.
If I want to read up a bit more about that, I can go back to the command line and try this:
Yeah, ok. That one was a bit of a no-brainer, but I have run into error messages that left me with no clue about what
went wrong, simply because I was unfamiliar with the underlying mechanism of code theory. One error that puzzled
my newbie mind was:
:too-many-instance-attributes (R0902): *Too many instance attributes (%s/%s)*
I get it now thanks to Pylint pointing it out to me. If you don’t get that one, pour a fresh cup of coffee and look into it
- let your programmer mind grow!
Now that we got some configuration stuff out of the way, let’s see what we can do with the remaining warnings.
If we add a docstring to describe what the code is meant to do that will help. There are 5 invalid-name messages
that we will get to later. Lastly, I violated the convention of using spaces around an operator such as = so I’ll fix that
too. To sum up, I’ll add a docstring to line 2, and put spaces around the = sign on line 16.
Here is the updated code:
1 #!/usr/bin/env python3
2 """This script prompts a user to enter a message to encode or decode
3 using a classic Caeser shift substitution (3 letter shift)"""
4
5 import string
6
7 shift = 3
8 choice = input("would you like to encode or decode?")
9 word = input("Please enter text")
10 letters = string.ascii_letters + string.punctuation + string.digits
11 encoded = ''
12 if choice == "encode":
13 for letter in word:
14 if letter == ' ':
15 encoded = encoded + ' '
16 else:
17 x = letters.index(letter) + shift
18 encoded = encoded + letters[x]
19 if choice == "decode":
20 for letter in word:
21 if letter == ' ':
22 encoded = encoded + ' '
23 else:
24 x = letters.index(letter) - shift
25 encoded = encoded + letters[x]
26
27 print(encoded)
8 Chapter 2. Tutorial
Pylint Documentation, Release 2.4.4
------------------------------------------------------------------
Your code has been rated at 7.37/10 (previous run: 6.32/10, +1.05)
Nice! Pylint told us how much our code rating has improved since our last run, and we’re down to just the
invalid-name messages.
There are fairly well defined conventions around naming things like instance variables, functions, classes, etc. The
conventions focus on the use of UPPERCASE and lowercase as well as the characters that separate multiple words
in the name. This lends itself well to checking via a regular expression, thus the should match (([A-Z_][A-Z1-
9_]*)|(__.*__))$.
In this case Pylint is telling me that those variables appear to be constants and should be all UPPERCASE. This is
an in-house convention that has lived with Pylint since its inception. You too can create your own in-house naming
conventions but for the purpose of this tutorial, we want to stick to the PEP 8 standard. In this case, the variables I
declared should follow the convention of all lowercase. The appropriate rule would be something like: "should match
[a-z_][a-z0-9_]{2,30}$". Notice the lowercase letters in the regular expression (a-z versus A-Z).
If we run that rule using a --const-rgx='[a-z\_][a-z0-9\_]{2,30}$' option, it will now be quite quiet:
-------------------------------------------------------------------
Your code has been rated at 10.00/10 (previous run: 7.37/10, +2.63)
Regular expressions can be quite a beast so take my word on this particular example but go ahead and read up on them
if you want.
Tip: It would really be a pain to specify that regex on the command line all the time, particularly if we’re using many
other options. That’s what a configuration file is for. We can configure our Pylint to store our options for us so we
don’t have to declare them on the command line. Using a configuration file is a nice way of formalizing your rules and
quickly sharing them with others. Invoking pylint --generate-rcfile will create a sample rcfile with all the
options set and explained in comments.
10 Chapter 2. Tutorial
CHAPTER 3
User Guide
3.1 Installation
From the source distribution, extract the tarball, go to the extracted directory and simply run
You should give Pylint the name of a python package or module, or some number of packages or modules. Pylint
will not import this package or module, though uses Python internals to locate them and as such is subject
11
Pylint Documentation, Release 2.4.4
to the same rules and configuration. You should pay attention to your PYTHONPATH, since it is a common error to
analyze an installed version of a module instead of the development version.
It is also possible to analyze Python files, with a few restrictions. The thing to keep in mind is that Pylint will try to
convert the file name to a module name, and only be able to process the file if it succeeds.
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 it is an implicit namespace package) or
if "directory" is in the python path.
For more details on this see the Frequently Asked Questions.
It is also possible to call Pylint from another Python program, thanks to the Run() function in the pylint.lint
module (assuming Pylint options are stored in a list of strings pylint_options) as:
import pylint.lint
pylint_opts = ['--version']
pylint.lint.Run(pylint_opts)
To silently run Pylint on a module_name.py module, and get its standard output and error:
3. If the current working directory is in a Python module, Pylint searches up the hierarchy of Python modules until
it finds a pylintrc file. This allows you to specify coding standards on a module-by-module basis. Of course,
a directory is judged to be a Python module if it contains an __init__.py file.
4. The file named by environment variable PYLINTRC
5. if you have a home directory which isn’t /root:
1. .pylintrc in your home directory
2. .config/pylintrc in your home directory
6. /etc/pylintrc
The --generate-rcfile option will generate a commented configuration file on standard output according to the
current configuration and exit. This includes:
• Any configuration file found as explained above
• Options appearing before --generate-rcfile on the Pylint command line
Of course you can also start with the default values and hand-tune the configuration.
Other useful global options include:
--ignore=<file[,file...]> Add files or directories to the blacklist. They should be base names, not paths.
--output-format=<format> Select output format (text, json, custom).
--msg-template=<template> Modify text output message template.
--list-msgs Generate pylint’s messages.
--list-msgs-enabled Display a list of what messages are enabled and disabled with the given configu-
ration.
--full-documentation Generate pylint’s full documentation, in reST format.
It is possible to speed up the execution of Pylint. If the running computer has more CPUs than one, then the work for
checking all files could be spread across all cores via Pylints’s sub-processes. This functionality is exposed via the -j
command-line parameter. If the provided number is 0, then the total number of CPUs will be autodetected and used.
Example:
This will spawn 4 parallel Pylint sub-process, where each provided module will be checked in parallel. Discovered
problems by checkers are not displayed immediately. They are shown just after checking a module is complete.
There are some limitations in running checks in parallel in the current implementation. It is not possible to use custom
plugins (i.e. --load-plugins option), nor it is not possible to use initialization hooks (i.e. the --init-hook
option).
Pylint returns bit-encoded exit codes. If applicable, the table below lists the related stderr stream message output.
The default format for the output is raw text. You can change this by passing pylint the
--output-format=<value> option. Possible values are: json, parseable, colorized and msvs (visual
studio).
Moreover you can customize the exact way information are displayed using the –msg-template=<format string>
option. The format string uses the Python new format syntax and the following fields are available :
path relative path to the file
abspath absolute path to the file
line line number
column column number
module module name
obj object within the module (if any)
msg text of the message
msg_id the message code (eg. I0011)
symbol symbolic name of the message (eg. locally-disabled)
C one letter indication of the message category
category fullname of the message category
For example, the former (pre 1.0) default format can be obtained with:
For each python module, Pylint will first display a few ’*’ characters followed by the name of the module. Then, a
number of messages with the following format:
You can get another output format, useful since it’s recognized by most editors or other development tools using the
--output-format=parseable option.
The message type can be:
• [I]nformational messages that Pylint emits (do not contribute to your analysis score)
• [R]efactor for a "good practice" metric violation
• [C]onvention for coding standard violation
• [W]arning for stylistic problems, or minor programming issues
• [E]rror for important programming issues (i.e. most probably bug)
• [F]atal for errors which prevented further processing
Sometimes the line of code which caused the error is displayed with a caret pointing to the error. This may be
generalized in future versions of Pylint.
Example (extracted from a run of Pylint on itself...):
Following the analysis message, Pylint can display a set of reports, each one focusing on a particular aspect of the
project, such as number of messages by categories, modules dependencies. These features can be enabled through the
--reports=y option, or its shorthand version -rn.
For instance, the metrics report displays summaries gathered from the current run.
• the number of processed modules
• for each module, the percentage of errors and warnings
• the total number of errors and warnings
• percentage of classes, functions and modules with docstrings, and a comparison from the previous run
• percentage of classes, functions and modules with correct name (according to the coding standard), and a com-
parison from the previous run
• a list of external dependencies found in the code, and where they appear
Finally, Pylint displays a global evaluation score for the code, rated out of a maximum score of 10.0. This output can
be suppressed through the --score=n option, or its shorthand version -sn.
The evaluation formula can be overridden with the --evaluation=<python_expression> option.
pylint has an advanced message control for its checks, offering the ability to enable / disable a message either from
the command line or from the configuration file, as well as from the code itself.
For all of these controls, pylint accepts the following values:
• a symbolic message: no-member, undefined-variable etc.
• a numerical ID: E1101, E1102 etc.
• The name of the group of checks. You can grab those with pylint --list-groups. For example, you can
disable / enable all the checks related to type checking, with typecheck or all the checks related to variables
with variables
• Corresponding category of the checks
– C convention related checks
– R refactoring related checks
– W various warnings
– E errors, for probable bugs in the code
– F fatal, if an error occurred which prevented pylint from doing further processing.
• All the checks with all
def test():
# Disable all the no-member violations in this function
# pylint: disable=no-member
...
• All the violations in a block. For instance, each separate branch of an if statement is considered a separate
block, as in the following example:
def meth5(self):
# pylint: disable=no-member
# no error
print(self.bla)
if self.blop:
# pylint: enable=no-member
# disable all no-members for this block
print(self.blip)
else:
# This is affected by the scope disable
print(self.blip)
# pylint: enable=no-member
print(self.blip)
if self.blop:
# pylint: enable=no-member
# disable all no-members for this block
print(self.blip)
else:
# This emits a violation
print(self.blip)
• If the violation occurs on a block starting line, then it applies only to that line
if self.blop: # pylint: disable=no-member; applies only to this line
# Here we get an error
print(self.blip)
else:
# error
print(self.blip)
__revision__ = None
class Foo(object):
"""block-disable test"""
def __init__(self):
pass
def meth3(self):
"""test one line disabling"""
# no error
(continues on next page)
def meth4(self):
"""test re-enabling"""
# pylint: disable=no-member
# no error
print(self.bla)
print(self.blop)
# pylint: enable=no-member
# error
print(self.blip)
def meth5(self):
"""test IF sub-block re-enabling"""
# pylint: disable=no-member
# no error
print(self.bla)
if self.blop:
# pylint: enable=no-member
# error
print(self.blip)
else:
# no error
print(self.blip)
# no error
print(self.blip)
def meth6(self):
"""test TRY/EXCEPT sub-block re-enabling"""
# pylint: disable=no-member
# no error
print(self.bla)
try:
# pylint: enable=no-member
# error
print(self.blip)
except UndefinedName: # pylint: disable=undefined-variable
# no error
print(self.blip)
# no error
print(self.blip)
def meth7(self):
"""test one line block opening disabling"""
if self.blop: # pylint: disable=no-member
# error
print(self.blip)
else:
# error
print(self.blip)
# error
print(self.blip)
def meth8(self):
"""test late disabling"""
(continues on next page)
3.5 Configuration
Introduction
Pylint recognizes a number of different name types internally. With a few exceptions, the type of the name is governed
by the location the assignment to a name is found in, and not the type of object assigned.
Default behavior
Pylint provides set of predefined naming styles. Those predefined naming styles may be used to adjust Pylint config-
uration to coding style used in linted project.
Following predefined naming styles are available:
• snake_case
• camelCase
• PascalCase
• UPPER_CASE
• any - fake style which does not enforce any limitations
Following options are exposed:
3.5. Configuration 19
Pylint Documentation, Release 2.4.4
--module-naming-style=<style>
--const-naming-style=<style>
--class-naming-style=<style>
--function-naming-style=<style>
--method-naming-style=<style>
--attr-naming-style=<style>
--argument-naming-style=<style>
--variable-naming-style=<style>
--class-attribute-naming-style=<style>
--inlinevar-naming-style=<style>
If predefined naming styles are too limited, checker behavior may be further customized. For each name type, a
separate regular expression matching valid names of this type can be defined. If any of custom regular expressions are
defined, it overrides *-naming-style option value.
Regular expressions for the names are anchored at the beginning, any anchor for the end must be supplied explicitly.
Any name not matching the regular expression will lead to an instance of invalid-name.
--module-rgx=<regex>
--const-rgx=<regex>
--class-rgx=<regex>
--function-rgx=<regex>
--method-rgx=<regex>
--attr-rgx=<regex>
--argument-rgx=<regex>
--variable-rgx=<regex>
--class-attribute-rgx=<regex>
--inlinevar-rgx=<regex>
Multiple naming styles for custom regular expressions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
Large code bases that have been worked on for multiple years often exhibit an evolution in style as well. In some
cases, modules can be in the same package, but still have different naming style based on the stratum they belong to.
However, intra-module consistency should still be required, to make changes inside a single file easier. For this case,
Pylint supports regular expression with several named capturing group.
Rather than emitting name warnings immediately, Pylint will determine the prevalent naming style inside each module
and enforce it on all names.
Consider the following (simplified) example:
The regular expression defines two naming styles, snake for snake-case names, and camel for camel-case names.
In sample.py, the function name on line 1 and 7 will mark the module and enforce the match of named group
snake for the remaining names in the module:
def valid_snake_case(arg):
...
def InvalidCamelCase(arg):
...
def more_valid_snake_case(arg):
...
Because of this, the name on line 4 will trigger an invalid-name warning, even though the name matches the given
regex.
Matches named exempt or ignore can be used for non-tainting names, to prevent built-in or interface-dictated
names to trigger certain naming styles.
--name-group=<name1:name2:...,...>
Default value: empty
Format: comma-separated groups of colon-separated names.
This option can be used to combine name styles. For example, function:method enforces that functions
and methods use the same style, and a style triggered by either name type carries over to the other. This requires
that the regular expression for the combined name types use the same group names.
Name Hints
--include-naming-hint=y|n
Default: off
Include a hint (regular expression used) for the correct name format with every invalid-name warning.
• Visual Studio, see the Python > Run PyLint command on a project’s context menu.
• Eric IDE, see the Project > Check menu,
• Spyder, see the View -> Panes -> Static code analysis pane and its corresponding documentation.
• pyscripter, see the Tool -> Tools menu.
• Visual Studio Code, see the Preferences -> Settings menu.
To enable flymake for Python, insert the following into your .emacs:
Finally, by default flymake only displays the extra information about the error when you hover the mouse over the
highlighted line. The following will use the minibuffer to display messages when you the cursor is on the line.
;; To avoid having to mouse hover for the error message, these functions make flymake
˓→error messages
Alternative, if you only wish to pollute the minibuffer after an explicit flymake-goto-* then use the following instead
of a post-command-hook
which pylint
Within PyCharm:
1. Navigate to the preferences window
2. Select "External Tools"
3. Click the plus sign at the bottom of the dialog to add a new external task
4. In the dialog, populate the following fields:
Name Pylint
Description A Python source code analyzer which looks for programming errors, helps enforcing a
coding standard and sniffs for some code smells.
$ which pylint
/usr/local/bin/pylint
The output will tell you where Pylint can be found; in this case, in /usr/local/bin.
1. select TextMate > Preferences
2. select the Variables tab
3. find and check that a PATH variable exists, and that it contains the appropriate path (if the path to Pylint
were /usr/local/bin/pylint as above, then the variable would need to contain /usr/local/bin).
An actual example in this case might be $PATH:/opt/local/bin:/usr/local/bin:/usr/texbin,
which includes other paths.
... and try running Pylint again.
See Pylint command line arguments for general switches. Command line arguments can be used to load Pylint plugins,
such as that for Django:
Options can also be specified in a pylintrc or .pylintrc file in the workspace folder, as described on Pylint
command line arguments.
To control which Pylint messages are shown, add the following contents to an options file:
[MESSAGES CONTROL]
# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time.
#enable=
# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once).
#disable=
The Python extension maps Pylint message categories to VS Code categories through the following settings. If desired,
change the setting to change the mapping.
How To Guides
You can find some simple examples in the distribution (custom.py and custom_raw.py).
There are three kinds of checkers:
• Raw checkers, which analyse each module as a raw file stream.
• Token checkers, which analyse a file using the list of tokens that represent the source code in the file.
• AST checkers, which work on an AST representation of the module.
The AST representation is provided by the astroid library. astroid adds additional information and methods
over ast in the standard library, to make tree navigation and code introspection easier.
Let’s implement a checker to make sure that all return nodes in a function return a unique constant. Firstly we will
need to fill in some required boilerplate:
import astroid
class UniqueReturnChecker(BaseChecker):
__implements__ = IAstroidChecker
name = 'unique-returns'
priority = -1
msgs = {
'W0001': (
'Returns a non-unique constant.',
(continues on next page)
27
Pylint Documentation, Release 2.4.4
msgs = {
'message-id': (
'displayed-message', 'message-symbol', 'message-help'
)
}
– The message-id should be a 5-digit number, prefixed with a message category. There are mul-
tiple message categories, these being C, W, E, F, R, standing for Convention, Warning, Error,
Fatal and Refactoring. The rest of the 5 digits should not conflict with existing checkers and
they should be consistent across the checker. For instance, the first two digits should not be different
across the checker.
– The displayed-message is used for displaying the message to the user, once it is emitted.
– The message-symbol is an alias of the message id and it can be used wherever the message id can
be used.
– The message-help is used when calling pylint --help-msg.
We have also defined an optional component of the checker. The options list defines any user configurable options. It
has the following format:
options = (
'option-symbol': {'argparse-like-kwarg': 'value'},
)
• The option-symbol is a unique name for the option. This is used on the command line and in config
files. The hyphen is replaced by an underscore when used in the checker, similarly to how you would use
argparse.Namespace.
Next we’ll track when we enter and leave a function.
In the constructor we initialise a stack to keep a list of return nodes for each function. An AST checker is a visitor,
and should implement visit_<lowered class name> or leave_<lowered class name> methods for
the nodes it’s interested in. In this case we have implemented visit_functiondef and leave_functiondef
to add a new list of return nodes for this function, and to remove the list of return nodes when we leave the function.
Finally we’ll implement the check. We will define a visit_return function, which is called with a astroid.
node_classes.Return node.
We’ll need to be able to figure out what attributes a astroid.node_classes.Return node has available. We
can use astroid.extract_node() for this:
For astroid.extract_node(), you can use #@ at the end of a line to choose which statements will be extracted
into nodes.
For more information on astroid.extract_node(), see the astroid documentation.
Now we know how to use the astroid node, we can implement our check.
self._function_stack[-1].append(node)
Once we have established that the source code has failed our check, we use add_message() to emit our failure
message.
Finally, we need to register the checker with pylint. Add the register function to the top level of the file.
def register(linter):
linter.register_checker(UniqueReturnChecker(linter))
It is very simple to get to a point where we can use pdb. We’ll need a small test case. Put the following into a Python
file:
def test():
if True:
return 5
return 5
def test2():
if True:
return 1
return 5
After inserting pdb into our checker and installing it, we can run pylint with only our checker:
Note: my_plugin refers to a module called my_plugin.py. This module can be made available to pylint by
putting this module’s parent directory in your PYTHONPATH environment variable or by adding the my_plugin.py
file to the pylint/checkers directory if running from source.
Pylint is very well suited to test driven development. You can implement the template of the checker, produce all of
your test cases and check that they fail, implement the checker, then check that all of your test cases work.
Pylint provides a pylint.testutils.CheckerTestCase to make test cases very simple. We can use the
example code that we used for debugging as our test cases.
import my_plugin
import pylint.testutils
def test_finds_non_unique_ints(self):
func_node, return_node_a, return_node_b = astroid.extract_node("""
def test(): #@
if True:
return 5 #@
return 5 #@
""")
self.checker.visit_functiondef(func_node)
self.checker.visit_return(return_node_a)
with self.assertAddsMessages(
pylint.testutils.Message(
msg_id='non-unique-returns',
node=return_node_b,
),
):
self.checker.visit_return(return_node_b)
def test_ignores_unique_ints(self):
func_node, return_node_a, return_node_b = astroid.extract_node("""
def test(): #@
if True:
return 1 #@
return 5 #@
""")
with self.assertNoMessages():
self.checker.visit_functiondef(func_node)
self.checker.visit_return(return_node_a)
self.checker.visit_return(return_node_b)
Once again we are using astroid.extract_node() to construct our test cases. pylint.testutils.
CheckerTestCase has created the linter and checker for us, we simply simulate a traversal of the AST tree using
the nodes that we are interested in.
Pylint provides support for writing two types of extensions. First, there is the concept of checkers, which can be used
for finding problems in your code. Secondly, there is also the concept of transform plugin, which represents a way
through which the inference and the capabilities of Pylint can be enhanced and tailored to a particular module, library
of framework.
In general, a plugin is a module which should have a function register, which takes an instance of pylint.
lint.PyLinter as input.
A plugin can optionally define also function load_configuration, which takes an instance of pylint.lint.
PyLinter as input. This function is called after Pylint loads configuration from configuration file and command line
interface. This function should load additional plugin specific configuration to Pylint.
So a basic hello-world plugin can be implemented as:
# Inside hello_plugin.py
def register(linter):
print 'Hello world'
We can run this plugin by placing this module in the PYTHONPATH and invoking pylint as:
We can extend hello-world plugin to ignore some specific names using load_configuration function:
# Inside hello_plugin.py
def register(linter):
print 'Hello world'
def load_configuration(linter):
Depending if we need a transform plugin or a checker, this might not be enough. For the former, this is enough to
declare the module as a plugin, but in the case of the latter, we need to register our checker with the linter object, by
calling the following inside the register function:
linter.register_checker(OurChecker(linter))
Pylint is a static analysis tool and Python is a dynamically typed language. So there will be cases where Pylint cannot
analyze files properly (this problem can happen in statically typed languages also if reflection or dynamic evaluation
is used).
The plugins are a way to tell Pylint how to handle such cases, since only the user would know what needs to be done.
They are usually operating on the AST level, by modifying or changing it in a way which can ease its understanding
by Pylint.
4.3.2 Example
Let us run Pylint on a module from the Python source: warnings.py and see what happens:
Did we catch a genuine error? Let’s open the code and look at WarningMessage class:
class WarningMessage(object):
def __str__(self):
...
Ah, the fields (message, category etc) are not defined statically on the class. Instead they are added using
setattr. Pylint would have a tough time figuring this out.
We can write a transform plugin to tell Pylint how to analyze this properly.
One way to fix our example with a plugin would be to transform the WarningMessage class, by setting the attributes
so that Pylint can see them. This can be done by registering a transform function. We can transform any node in the
parsed AST like Module, Class, Function etc. In our case we need to transform a class. It can be done so:
import astroid
from astroid import MANAGER
def register(linter):
# Needed for registering the plugin.
pass
def transform(cls):
if cls.name == 'WarningMessage':
import warnings
for f in warnings.WarningMessage._WARNING_DETAILS:
cls.locals[f] = [astroid.ClassDef(f, None)]
MANAGER.register_transform(astroid.ClassDef, transform)
Let’s go through the plugin. First, we need to register a class transform, which is done via the
register_transform function in MANAGER. It takes the node type and function as parameters. We need to
change a class, so we use astroid.ClassDef. We also pass a transform function which does the actual
transformation.
transform function is simple as well. If the class is WarningMessage then we add the attributes to its locals (we
are not bothered about type of attributes, so setting them as class will do. But we could set them to any type we want).
That’s it.
Note: We don’t need to do anything in the register function of the plugin since we are not modifying anything in
the linter itself.
Lets run Pylint with this plugin and see:
All the false positives associated with WarningMessage are now gone. This is just an example, any code transfor-
mation can be done by plugins.
See astroid/brain for real life examples of transform plugins.
Technical Reference
5.2 Checkers
All of the default pylint checkers exist in pylint.checkers. This is where most of pylint’s brains exist. Most
checkers are AST based and so use astroid. pylint.checkers.utils provides a large number of utility
methods for dealing with astroid.
35
Pylint Documentation, Release 2.4.4
load-plugins=pylint.extensions.docparams,pylint.extensions.docstyle
compare-to-empty-string (C1901) Avoid comparisons to empty string Used when Pylint detects com-
parison to an empty string constant.
compare-to-zero (C2001) Avoid comparisons to zero Used when Pylint detects comparison to a 0 con-
stant.
This used to be the bad-builtin core checker, but it was moved to an extension instead. It can be used for finding
prohibited used builtins, such as map or filter, for which other alternatives exists.
If you want to control for what builtins the checker should warn about, you can use the bad-functions option:
...
bad-functions List of builtins function names that should not be used, separated by a comma
Default: map,filter
bad-builtin (W0141) Used builtin function %s Used when a black listed builtin function is used (see the
bad-function option). Usual black listed functions are the ones like map, or filter , where Python
offers now some cleaner alternative like list comprehension.
You can now use this plugin for finding complexity issues in your code base.
Activate it through pylint --load-plugins=pylint.extensions.mccabe. It introduces a new warning,
too-complex, which is emitted when a code block has a complexity higher than a preestablished value, which can
be controlled through the max-complexity option, such as in this example:
$ cat a.py
def f10():
"""McCabe rating: 11"""
myint = 2
if myint == 5:
return myint
elif myint == 6:
return myint
elif myint == 7:
return myint
elif myint == 8:
return myint
(continues on next page)
too-complex (R1260) %s is too complex. The McCabe rating is %d Used when a method or function is
too complex based on McCabe Complexity Cyclomatic
bad-docstring-quotes (C0198) Bad docstring quotes in %s, expected """, given %s Used when a doc-
string does not have triple double quotes.
docstring-first-line-empty (C0199) First line empty in %s docstring Used when a blank line is found at
the beginning of a docstring.
else-if-used (R5501) Consider using "elif" instead of "else if" Used when an else statement is immedi-
ately followed by an if statement and does not contain statements that would be unrelated to it.
redefined-variable-type (R0204) Redefinition of %s type from %s to %s Used when the type of a variable
changes inside a method or a function.
overlapping-except (W0714) Overlapping exceptions (%s) Used when exceptions in handler overlap or
are identical
If you document the parameters of your functions, methods and constructors and their types systematically in your
code this optional component might be useful for you. Sphinx style, Google style, and Numpy style are supported.
(For some examples, see https://pypi.python.org/pypi/sphinxcontrib-napoleon .)
You can activate this checker by adding the line:
load-plugins=pylint.extensions.docparams
:param x: bla x
:type x: int
:param y: bla y
:type y: float
:return: sum
:rtype: float
Args:
x (int): bla x
y (float): bla y
z (int): bla z
Returns:
float: sum
Raises:
OSError: bla
'''
return x + y + z
Parameters
----------
x: int
bla x
y: float
bla y
z: int
bla z
Returns
-------
float
sum
You’ll be notified of missing parameter documentation but also of naming inconsistencies between the signature
and the documentation which often arise when parameters are renamed automatically in the code, but not in the
documentation.
Constructor parameters can be documented in either the class docstring or the __init__ docstring, but not both:
class ClassFoo(object):
'''Sphinx style docstring foo
:param y: bla y
:type y: int
'''
def __init__(self, x, y):
pass
class ClassBar(object):
def __init__(self, x, y):
'''Google style docstring bar
Args:
x (float): bla x
y (int): bla y
'''
pass
In some cases, having to document all parameters is a nuisance, for instance if many of your functions or methods just
follow a common interface. To remove this burden, the checker accepts missing parameter documentation if one of
the following phrases is found in the docstring:
• For the other parameters, see
• For the parameters, see
(with arbitrary whitespace between the words). Please add a link to the docstring defining the interface, e.g. a
superclass method, after "see":
def callback(x, y, z):
'''Sphinx style docstring for callback ...
:param x: bla x
:type x: int
Args:
x (int): bla x
Naming inconsistencies in existing parameter and their type documentations are still detected.
missing-return-type-doc (W9012) Missing return type documentation Please document the type re-
turned by this method.
missing-yield-doc (W9013) Missing yield documentation Please add documentation about what this gen-
erator yields.
missing-yield-type-doc (W9014) Missing yield type documentation Please document the type yielded
by this method.
redundant-returns-doc (W9008) Redundant returns documentation Please remove the return/rtype doc-
umentation from this method.
redundant-yields-doc (W9010) Redundant yields documentation Please remove the yields documenta-
tion from this method.
General options
ignore Add files or directories to the blacklist. They should be base names, not paths.
Default: CVS
ignore-patterns Add files or directories matching the regex patterns to the blacklist. The regex matches
against base names, not paths.
persistent Pickle collected data for later comparisons.
Default: yes
load-plugins List of plugins (as comma separated values of python module names) to load, usually to
register additional checkers.
jobs Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the number of processors
available to use.
Default: 1
unsafe-load-any-extension Allow loading of arbitrary C extensions. Extensions are imported into the
active Python interpreter and may run arbitrary code.
limit-inference-results Control the amount of potential inferred values when inferring a single object.
This can help the performance when dealing with large functions or complex, nested conditions.
Default: 100
extension-pkg-whitelist A comma-separated list of package or module names from where C extensions
may be loaded. Extensions are loading into the active Python interpreter and may run arbitrary code.
suggestion-mode When enabled, pylint would attempt to guess common misconfiguration and emit user-
friendly hints instead of false-positive error messages.
Default: yes
exit-zero Always return a 0 (non-error) status code, even if lint errors are found. This is primarily useful
in continuous integration scripts.
from-stdin Interpret the stdin as a python script, whose filename needs to be passed as the mod-
ule_or_package argument.
confidence Only show warnings with the listed confidence levels. Leave empty to show all. Valid levels:
HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED.
enable Enable the message, report, category or checker with the given id(s). You can either give multiple
identifier separated by comma (,) or put this option multiple time (only on the command line, not in
the configuration file where it should appear only once). See also the "–disable" option for examples.
disable Disable the message, report, category or checker with the given id(s). You can either give multiple
identifiers separated by comma (,) or put this option multiple times (only on the command line, not
in the configuration file where it should appear only once). You can also use "–disable=all" to
disable everything first and then reenable specific checks. For example, if you want to run only the
similarities checker, you can use "–disable=all –enable=similarities". If you want to run only the
classes checker, but have no Warning level messages displayed, use "–disable=all –enable=classes
–disable=W".
Default: print-statement,parameter-unpacking,unpacking-in-except,
old-raise-syntax,backtick,long-suffix,old-ne-operator,
old-octal-literal,import-star-module-level,non-ascii-bytes-literal,
apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,
coerce-builtin,execfile-builtin,file-builtin,long-builtin,
raw_input-builtin,reduce-builtin,standarderror-builtin,
unicode-builtin,xrange-builtin,coerce-method,delslice-method,
getslice-method,setslice-method,no-absolute-import,
old-division,dict-iter-method,dict-view-method,
next-method-called,metaclass-assignment,indexing-exception,
raising-string,reload-builtin,oct-method,hex-method,
nonzero-method,cmp-method,input-builtin,round-builtin,
intern-builtin,unichr-builtin,map-builtin-not-iterating,
zip-builtin-not-iterating,range-builtin-not-iterating,
filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,
div-method,idiv-method,rdiv-method,exception-message-attribute,
invalid-str-codec,sys-max-int,bad-python3-import,
deprecated-string-function,deprecated-str-translate-call,
deprecated-itertools-function,deprecated-types-field,
next-method-defined,dict-items-not-iterating,
dict-keys-not-iterating,dict-values-not-iterating,
deprecated-operator-function,deprecated-urllib-function,
xreadlines-attribute,deprecated-sys-function,exception-escape,
comprehension-escape
Reports options
output-format Set the output format. Available formats are text, parseable, colorized, json and msvs
(visual studio). You can also give a reporter class, e.g. mypackage.mymodule.MyReporterClass.
Default: text
reports Tells whether to display a full report or only the messages.
evaluation Python expression which should return a score less than or equal to 10. You have access to
the variables ’error’, ’warning’, ’refactor’, and ’convention’ which contain the number of messages
in each category, as well as ’statement’ which is the total number of statements analyzed. This score
is used by the global evaluation report (RP0004).
Default: 10.0 - ((float(5 * error + warning + refactor + convention)
/ statement) * 10)
score Activate the evaluation score.
Default: yes
msg-template Template used to display messages. This is a python new-style format string used to
format the message information. See doc for all details.
Async checker
not-async-context-manager (E1701) Async context manager ’%s’ doesn’t implement __aenter__ and
__aexit__. Used when an async context manager is used with an object that does not implement the
async context management protocol. This message can’t be emitted when using Python < 3.5.
yield-inside-async-function (E1700) Yield inside async function Used when an yield or yield from state-
ment is found inside an async function. This message can’t be emitted when using Python < 3.5.
Basic checker
good-names Good variable names which should always be accepted, separated by a comma.
Default: i,j,k,ex,Run,_
bad-names Bad variable names which should always be refused, separated by a comma.
Default: foo,bar,baz,toto,tutu,tata
name-group Colon-delimited sets of names that determine each other’s naming style when the name
regexes allow several styles.
include-naming-hint Include a hint for the correct naming format with invalid-name.
property-classes List of decorators that produce properties, such as abc.abstractproperty. Add to this list
to register other decorators that produce valid properties. These decorators are taken in consideration
only for invalid-name.
Default: abc.abstractproperty
argument-naming-style Naming style matching correct argument names.
Default: snake_case
argument-rgx Regular expression matching correct argument names. Overrides argument- naming-
style.
attr-naming-style Naming style matching correct attribute names.
Default: snake_case
attr-rgx Regular expression matching correct attribute names. Overrides attr-naming- style.
class-naming-style Naming style matching correct class names.
Default: PascalCase
class-rgx Regular expression matching correct class names. Overrides class-naming- style.
class-attribute-naming-style Naming style matching correct class attribute names.
Default: any
class-attribute-rgx Regular expression matching correct class attribute names. Overrides class-
attribute-naming-style.
const-naming-style Naming style matching correct constant names.
Default: UPPER_CASE
const-rgx Regular expression matching correct constant names. Overrides const-naming- style.
function-naming-style Naming style matching correct function names.
Default: snake_case
function-rgx Regular expression matching correct function names. Overrides function- naming-style.
inlinevar-naming-style Naming style matching correct inline iteration names.
Default: any
inlinevar-rgx Regular expression matching correct inline iteration names. Overrides inlinevar-naming-
style.
method-naming-style Naming style matching correct method names.
Default: snake_case
method-rgx Regular expression matching correct method names. Overrides method-naming- style.
module-naming-style Naming style matching correct module names.
Default: snake_case
module-rgx Regular expression matching correct module names. Overrides module-naming- style.
variable-naming-style Naming style matching correct variable names.
Default: snake_case
variable-rgx Regular expression matching correct variable names. Overrides variable- naming-style.
no-docstring-rgx Regular expression which should only match function or class names that do not re-
quire a docstring.
Default: ^_
docstring-min-length Minimum line length for functions/classes that require docstrings, shorter ones
are exempt.
Default: -1
not-in-loop (E0103) %r not properly in loop Used when break or continue keywords are used outside a
loop.
function-redefined (E0102) %s already defined line %s Used when a function / class / method is rede-
fined.
continue-in-finally (E0116) ’continue’ not supported inside ’finally’ clause Emitted when the continue
keyword is found inside a finally clause, which is a SyntaxError.
abstract-class-instantiated (E0110) Abstract class %r with abstract methods instantiated Used when
an abstract class with abc.ABCMeta as metaclass has abstract methods and is instantiated.
star-needs-assignment-target (E0114) Can use starred expression only in assignment target Emitted
when a star expression is not used in an assignment target.
duplicate-argument-name (E0108) Duplicate argument name %s in function definition Duplicate argu-
ment names in function definitions are syntax errors.
return-in-init (E0101) Explicit return in __init__ Used when the special class method __init__ has an
explicit return value.
too-many-star-expressions (E0112) More than one starred expression in assignment Emitted when
there are more than one starred expressions (*x) in an assignment. This is a SyntaxError.
nonlocal-and-global (E0115) Name %r is nonlocal and global Emitted when a name is both nonlocal
and global.
used-prior-global-declaration (E0118) Name %r is used prior to global declaration Emitted when a
name is used prior a global declaration, which results in an error since Python 3.6. This message
can’t be emitted when using Python < 3.6.
return-outside-function (E0104) Return outside function Used when a "return" statement is found out-
side a function or method.
return-arg-in-generator (E0106) Return with argument inside generator Used when a "return" state-
ment with an argument is found outside in a generator function or method (e.g. with some "yield"
statements). This message can’t be emitted when using Python >= 3.3.
invalid-star-assignment-target (E0113) Starred assignment target must be in a list or tuple Emitted
when a star expression is used as a starred assignment target.
bad-reversed-sequence (E0111) The first reversed() argument is not a sequence Used when the first
argument to reversed() builtin isn’t a sequence (does not implement __reversed__, nor __getitem__
and __len__
nonexistent-operator (E0107) Use of the non-existent %s operator Used when you attempt to use the
C-style pre-increment or pre-decrement operator – and ++, which doesn’t exist in Python.
yield-outside-function (E0105) Yield outside function Used when a "yield" statement is found outside a
function or method.
init-is-generator (E0100) __init__ method is a generator Used when the special class method __init__
is turned into a generator by a yield in its body.
misplaced-format-function (E0119) format function is not called on str Emitted when format function
is not called on str object. e.g doing print("value: {}").format(123) instead of print("value: {}".for-
mat(123)). This might not be what the user intended to do.
nonlocal-without-binding (E0117) nonlocal name %s found without binding Emitted when a nonlocal
variable does not have an attached name somewhere in the parent scopes
lost-exception (W0150) %s statement in finally block may swallow exception Used when a break or a
return statement is found inside the finally clause of a try...finally block: the exceptions raised in the
try clause will be silently swallowed instead of being re-raised.
assert-on-tuple (W0199) Assert called on a 2-item-tuple. Did you mean ’assert x,y’? A call of assert on
a tuple will always evaluate to true if the tuple is not empty, and will always evaluate to false if it is.
self-assigning-variable (W0127) Assigning the same variable %r to itself Emitted when we detect that
a variable is assigned to itself
comparison-with-callable (W0143) Comparing against a callable, did you omit the parenthesis? This
message is emitted when pylint detects that a comparison with a callable was made, which might
suggest that some parenthesis were omitted, resulting in potential unwanted behaviour.
dangerous-default-value (W0102) Dangerous default value %s as argument Used when a mutable value
as list or dictionary is detected in a default value for an argument.
duplicate-key (W0109) Duplicate key %r in dictionary Used when a dictionary expression binds the
same key multiple times.
useless-else-on-loop (W0120) Else clause on loop without a break statement Loops should only have an
else clause if they can exit early with a break statement, otherwise the statements under else should
be on the same scope as the loop itself.
expression-not-assigned (W0106) Expression "%s" is assigned to nothing Used when an expression that
is not a function call is assigned to nothing. Probably something else was intended.
confusing-with-statement (W0124) Following "as" with another context manager looks like a tuple.
Emitted when a with statement component returns multiple values and uses name binding with as
only for a part of those values, as in with ctx() as a, b. This can be misleading, since it’s not clear if
the context manager returns a tuple or if the node without a name binding is another context manager.
unnecessary-lambda (W0108) Lambda may not be necessary Used when the body of a lambda expres-
sion is a function call on the same argument list as the lambda itself; such lambda expressions are in
all but a few cases replaceable with the function being called in the body of the lambda.
assign-to-new-keyword (W0111) Name %s will become a keyword in Python %s Used when assignment
will become invalid in future Python release due to introducing new keyword.
redeclared-assigned-name (W0128) Redeclared variable %r in assignment Emitted when we detect
that a variable was redeclared in the same assignment.
pointless-statement (W0104) Statement seems to have no effect Used when a statement doesn’t have (or
at least seems to) any effect.
pointless-string-statement (W0105) String statement has no effect Used when a string is used as a state-
ment (which of course has no effect). This is a particular case of W0104 with its own message so
you can easily disable it if you’re using those strings as documentation, instead of comments.
unnecessary-pass (W0107) Unnecessary pass statement Used when a "pass" statement that can be
avoided is encountered.
unreachable (W0101) Unreachable code Used when there is some code behind a "return" or "raise"
statement, which will never be accessed.
eval-used (W0123) Use of eval Used when you use the "eval" function, to discourage its usage. Consider
using ast.literal_eval for safely evaluating strings containing Python expressions from untrusted
sources.
exec-used (W0122) Use of exec Used when you use the "exec" statement (function for Python 3), to
discourage its usage. That doesn’t mean you cannot use it !
using-constant-test (W0125) Using a conditional statement with a constant value Emitted when a con-
ditional statement (If or ternary if) uses a constant value for its test. This might not be what the user
intended to do.
missing-parentheses-for-call-in-test (W0126) Using a conditional statement with potentially wrong
function or method call due to missing parentheses Emitted when a conditional statement (If or
ternary if) seems to wrongly call a function due to missing parentheses
literal-comparison (R0123) Comparison to literal Used when comparing an object to a literal, which
is usually what you do not want to do, since you can compare to a different literal than what was
expected altogether.
comparison-with-itself (R0124) Redundant comparison - %s Used when something is compared against
itself.
invalid-name (C0103) %s name "%s" doesn’t conform to %s Used when the name doesn’t conform to
naming rules associated to its type (constant, variable, class...).
blacklisted-name (C0102) Black listed name "%s" Used when the name is listed in the black list (unau-
thorized names).
misplaced-comparison-constant (C0122) Comparison should be %s Used when the constant is placed
on the left side of a comparison. It is usually clearer in intent to place it in the right hand side of the
comparison.
singleton-comparison (C0121) Comparison to %s should be %s Used when an expression is compared
to singleton values like True, False or None.
empty-docstring (C0112) Empty %s docstring Used when a module, function, class or method has an
empty docstring (it would be too easy ;).
missing-class-docstring (C0115) Missing class docstring Used when a class has no docstring.Even an
empty class must have a docstring.
missing-function-docstring (C0116) Missing function or method docstring Used when a function or
method has no docstring.Some special methods like __init__ do not require a docstring.
missing-module-docstring (C0114) Missing module docstring Used when a module has no doc-
string.Empty modules do not require a docstring.
unidiomatic-typecheck (C0123) Using type() instead of isinstance() for a typecheck. The idiomatic way
to perform an explicit typecheck in Python is to use isinstance(x, Y) rather than type(x) == Y, type(x)
is Y. Though there are unusual situations where these give different results.
Classes checker
defining-attr-methods List of method names used to declare (i.e. assign) instance attributes.
Default: __init__,__new__,setUp,__post_init__
valid-classmethod-first-arg List of valid names for the first argument in a class method.
Default: cls
valid-metaclass-classmethod-first-arg List of valid names for the first argument in a metaclass class
method.
Default: cls
exclude-protected List of member names, which should be excluded from the protected access warning.
Default: _asdict,_fields,_replace,_source,_make
access-member-before-definition (E0203) Access to member %r before its definition line %s Used when
an instance member is accessed before it’s actually assigned.
method-hidden (E0202) An attribute defined in %s line %s hides this method Used when a class defines
a method which is hidden by an instance attribute from an ancestor class or set by some client code.
assigning-non-slot (E0237) Assigning to attribute %r not defined in class slots Used when assigning to
an attribute not defined in the class slots.
duplicate-bases (E0241) Duplicate bases for class %r Used when a class has duplicate bases.
inconsistent-mro (E0240) Inconsistent method resolution order for class %r Used when a class has an
inconsistent method resolution order.
inherit-non-class (E0239) Inheriting %r, which is not a class. Used when a class inherits from some-
thing which is not a class.
invalid-slots (E0238) Invalid __slots__ object Used when an invalid __slots__ is found in class. Only a
string, an iterable or a sequence is permitted.
invalid-slots-object (E0236) Invalid object %r in __slots__, must contain only non empty strings Used
when an invalid (non-string) object occurs in __slots__.
no-method-argument (E0211) Method has no argument Used when a method which should have the
bound instance as first argument has no argument defined.
no-self-argument (E0213) Method should have "self" as first argument Used when a method has an
attribute different the "self" as first argument. This is considered as an error since this is a so common
convention that you shouldn’t break it!
unexpected-special-method-signature (E0302) The special method %r expects %s param(s), %d %s
given Emitted when a special method was defined with an invalid number of parameters. If it has
too few or too many, it might not work at all.
class-variable-slots-conflict (E0242) Value %r in slots conflicts with class variable Used when a value
in __slots__ conflicts with a class variable, property or method.
non-iterator-returned (E0301) __iter__ returns non-iterator Used when an __iter__ method returns
something which is not an iterable (i.e. has no __next__ method)
invalid-length-returned (E0303) __len__ does not return non-negative integer Used when a __len__
method returns something which is not a non-negative integer
protected-access (W0212) Access to a protected member %s of a client class Used when a protected
member (i.e. class member with a name beginning with an underscore) is access outside the class or
a descendant of the class where it’s defined.
attribute-defined-outside-init (W0201) Attribute %r defined outside __init__ Used when an instance
attribute is defined outside the __init__ method.
no-init (W0232) Class has no __init__ method Used when a class has no __init__ method, neither its
parent classes.
abstract-method (W0223) Method %r is abstract in class %r but is not overridden Used when an ab-
stract method (i.e. raise NotImplementedError) is not overridden in concrete class.
invalid-overridden-method (W0236) Method %r was expected to be %r, found it instead as %r Used
when we detect that a method was overridden as a property or the other way around, which could
result in potential bugs at runtime.
arguments-differ (W0221) Parameters differ from %s %r method Used when a method has a different
number of arguments than in the implemented interface or in an overridden method.
signature-differs (W0222) Signature differs from %s %r method Used when a method signature is dif-
ferent than in the implemented interface or in an overridden method.
bad-staticmethod-argument (W0211) Static method with %r as first argument Used when a static
method has "self" or a value specified in valid- classmethod-first-arg option or valid-metaclass-
classmethod-first-arg option as first argument.
useless-super-delegation (W0235) Useless super delegation in method %r Used whenever we can detect
that an overridden method is useless, relying on super() delegation to do the same thing as another
method from the MRO.
non-parent-init-called (W0233) __init__ method from a non direct base class %r is called Used when
an __init__ method is called on a class which is not in the direct ancestors for the analysed class.
super-init-not-called (W0231) __init__ method from base class %r is not called Used when an ancestor
class method has an __init__ method which is not called by a derived class.
property-with-parameters (R0206) Cannot have defined parameters for properties Used when we de-
tect that a property also has parameters, which are useless, given that properties cannot be called
with additional arguments.
useless-object-inheritance (R0205) Class %r inherits from object, can be safely removed from bases in
python3 Used when a class inherit from object, which under python3 is implicit, hence can be safely
removed from bases.
no-classmethod-decorator (R0202) Consider using a decorator instead of calling classmethod Used
when a class method is defined without using the decorator syntax.
no-staticmethod-decorator (R0203) Consider using a decorator instead of calling staticmethod Used
when a static method is defined without using the decorator syntax.
no-self-use (R0201) Method could be a function Used when a method doesn’t use its bound instance,
and so could be written as a function.
single-string-used-for-slots (C0205) Class __slots__ should be a non-string iterable Used when a class
__slots__ is a simple string, rather than an iterable.
bad-classmethod-argument (C0202) Class method %s should have %s as first argument Used when a
class method has a first argument named differently than the value specified in valid-classmethod-
first-arg option (default to "cls"), recommended to easily differentiate them from regular instance
methods.
bad-mcs-classmethod-argument (C0204) Metaclass class method %s should have %s as first argument
Used when a metaclass class method has a first argument named differently than the value specified
in valid-metaclass-classmethod-first-arg option (default to "mcs"), recommended to easily differen-
tiate them from regular instance methods.
bad-mcs-method-argument (C0203) Metaclass method %s should have %s as first argument Used
when a metaclass method has a first argument named differently than the value specified in valid-
classmethod-first-arg option (default to "cls"), recommended to easily differentiate them from regu-
lar instance methods.
method-check-failed (F0202) Unable to check methods signature (%s / %s) Used when Pylint has been
unable to check methods signature compatibility for an unexpected reason. Please report this kind
if you don’t make sense of it.
Design checker
too-few-public-methods (R0903) Too few public methods (%s/%s) Used when class has too few public
methods, so be sure it’s really worth it.
too-many-ancestors (R0901) Too many ancestors (%s/%s) Used when class has too many parent classes,
try to reduce this to get a simpler (and so easier to use) class.
too-many-arguments (R0913) Too many arguments (%s/%s) Used when a function or method takes too
many arguments.
too-many-boolean-expressions (R0916) Too many boolean expressions in if statement (%s/%s) Used
when an if statement contains too many boolean expressions.
too-many-branches (R0912) Too many branches (%s/%s) Used when a function or method has too
many branches, making it hard to follow.
too-many-instance-attributes (R0902) Too many instance attributes (%s/%s) Used when class has too
many instance attributes, try to reduce this to get a simpler (and so easier to use) class.
too-many-locals (R0914) Too many local variables (%s/%s) Used when a function or method has too
many local variables.
too-many-public-methods (R0904) Too many public methods (%s/%s) Used when class has too many
public methods, try to reduce this to get a simpler (and so easier to use) class.
too-many-return-statements (R0911) Too many return statements (%s/%s) Used when a function or
method has too many return statement, making it hard to follow.
too-many-statements (R0915) Too many statements (%s/%s) Used when a function or method has too
many statements. You should then split it in smaller functions / methods.
Exceptions checker
overgeneral-exceptions Exceptions that will emit a warning when being caught. Defaults to "BaseEx-
ception, Exception".
Default: BaseException,Exception
bad-except-order (E0701) Bad except clauses order (%s) Used when except clauses are not in the cor-
rect order (from the more specific to the more generic). If you don’t fix the order, some exceptions
may not be caught by the most specific handler.
catching-non-exception (E0712) Catching an exception which doesn’t inherit from Exception: %s Used
when a class which doesn’t inherit from Exception is used as an exception in an except clause.
bad-exception-context (E0703) Exception context set to something which is not an exception, nor None
Used when using the syntax "raise ... from ...", where the exception context is not an exception, nor
None.
notimplemented-raised (E0711) NotImplemented raised - should raise NotImplementedError Used
when NotImplemented is raised instead of NotImplementedError
raising-bad-type (E0702) Raising %s while only classes or instances are allowed Used when something
which is neither a class, an instance or a string is raised (i.e. a TypeError will be raised).
raising-non-exception (E0710) Raising a new style class which doesn’t inherit from BaseException
Used when a new style class which doesn’t inherit from BaseException is raised.
misplaced-bare-raise (E0704) The raise statement is not inside an except clause Used when a bare raise
is not used inside an except clause. This generates an error, since there are no active exceptions to
be reraised. An exception to this rule is represented by a bare raise inside a finally clause, which
might work, as long as an exception is raised inside the try block, but it is nevertheless a code smell
that must not be relied upon.
duplicate-except (W0705) Catching previously caught exception type %s Used when an except catches
a type that was already caught by a previous handler.
broad-except (W0703) Catching too general exception %s Used when an except catches a too general
exception, possibly burying unrelated errors.
raising-format-tuple (W0715) Exception arguments suggest string formatting might be intended Used
when passing multiple arguments to an exception constructor, the first of them a string literal con-
taining what appears to be placeholders intended for formatting
binary-op-exception (W0711) Exception to catch is the result of a binary "%s" operation Used when
the exception to catch is of the form "except A or B:". If intending to catch multiple, rewrite as
"except (A, B):"
wrong-exception-operation (W0716) Invalid exception operation. %s Used when an operation is done
against an exception, but the operation is not valid for the exception in question. Usually emitted
when having binary operations between exceptions in except handlers.
bare-except (W0702) No exception type(s) specified Used when an except clause doesn’t specify excep-
tions type to catch.
try-except-raise (W0706) The except handler raises immediately Used when an except handler uses
raise as its first or only operator. This is useless because it raises back the exception immediately.
Remove the raise operator or the entire try-except-raise block!
Format checker
single-line-class-stmt Allow the body of a class to be on the same line as the declaration if body contains
single statement.
no-space-check List of optional constructs for which whitespace checking is disabled. dict- separator
is used to allow tabulation in dicts, etc.: {1 : 1,n222: 2}. trailing-comma allows a space between
comma and closing bracket: (a, ). empty-line allows space-only lines.
Default: trailing-comma,dict-separator
max-module-lines Maximum number of lines in a module.
Default: 1000
indent-string String used as indentation unit. This is usually " " (4 spaces) or "t" (1 tab).
Default: ' '
indent-after-paren Number of spaces of indent required inside a hanging or continued line.
Default: 4
expected-line-ending-format Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
bad-indentation (W0311) Bad indentation. Found %s %s, expected %s Used when an unexpected num-
ber of indentation’s tabulations or spaces has been found.
mixed-indentation (W0312) Found indentation with %ss instead of %ss Used when there are some
mixed tabs and spaces in a module.
unnecessary-semicolon (W0301) Unnecessary semicolon Used when a statement is ended by a semi-
colon (";"), which isn’t necessary (that’s python, not C ;).
bad-whitespace (C0326) %s space %s %s %s Used when a wrong number of spaces is used around an
operator, bracket or block opener.
missing-final-newline (C0304) Final newline missing Used when the last line in a file is missing a new-
line.
line-too-long (C0301) Line too long (%s/%s) Used when a line is longer than a given number of charac-
ters.
mixed-line-endings (C0327) Mixed line endings LF and CRLF Used when there are mixed (LF and
CRLF) newline signs in a file.
multiple-statements (C0321) More than one statement on a single line Used when more than on state-
ment are found on the same line.
too-many-lines (C0302) Too many lines in module (%s/%s) Used when a module has too many lines,
reducing its readability.
trailing-newlines (C0305) Trailing newlines Used when there are trailing blank lines in a file.
trailing-whitespace (C0303) Trailing whitespace Used when there is whitespace between the end of a
line and the newline.
unexpected-line-ending-format (C0328) Unexpected line ending format. There is ’%s’ while it should
be ’%s’. Used when there is different newline than expected.
superfluous-parens (C0325) Unnecessary parens after %r keyword Used when a single item in paren-
theses follows an if, for, or other keyword.
bad-continuation (C0330) Wrong %s indentation%s%s. TODO
Imports checker
relative-beyond-top-level (E0402) Attempted relative import beyond top-level package Used when a rel-
ative import tries to access too many levels in the current package.
import-error (E0401) Unable to import %s Used when pylint has been unable to import a module.
import-self (W0406) Module import itself Used when a module is importing itself.
preferred-module (W0407) Prefer importing %r instead of %r Used when a module imported has a
preferred replacement module.
reimported (W0404) Reimport %r (imported line %s) Used when a module is reimported multiple times.
deprecated-module (W0402) Uses of a deprecated module %r Used a module marked as deprecated is
imported.
wildcard-import (W0401) Wildcard import %s Used when from module import * is detected.
misplaced-future (W0410) __future__ import is not the first non docstring statement Python 2.5 and
greater require __future__ import to be the first non docstring statement in the module.
cyclic-import (R0401) Cyclic import (%s) Used when a cyclic import between two or more modules is
detected.
wrong-import-order (C0411) %s should be placed before %s Used when PEP8 import order is not
respected (standard imports first, then third-party libraries, then local imports)
wrong-import-position (C0413) Import "%s" should be placed at the top of the module Used when code
and imports are mixed
useless-import-alias (C0414) Import alias does not rename original package Used when an import alias
is same as original package.e.g using import numpy as numpy instead of import numpy as np
import-outside-toplevel (C0415) Import outside toplevel (%s) Used when an import statement is used
anywhere other than the module toplevel. Move this import to the top of the file.
ungrouped-imports (C0412) Imports from package %s are not grouped Used when imports are not
grouped by packages
multiple-imports (C0410) Multiple imports on one line (%s) Used when import statement importing
multiple modules is detected.
Logging checker
logging-modules Logging modules to check that the string format arguments are in logging function
parameter format.
Default: logging
logging-format-style Format style used to check logging format string. old means using % formatting,
new is for {} formatting,and fstr is for f-strings.
Default: old
logging-format-truncated (E1201) Logging format string ends in middle of conversion specifier Used
when a logging statement format string terminates before the end of a conversion specifier.
logging-too-few-args (E1206) Not enough arguments for logging format string Used when a logging
format string is given too few arguments.
logging-too-many-args (E1205) Too many arguments for logging format string Used when a logging
format string is given too many arguments.
logging-unsupported-format (E1200) Unsupported logging format character %r (%#02x) at index %d
Used when an unsupported format character is used in a logging statement format string.
logging-not-lazy (W1201) Specify string format arguments as logging function parameters Used when a
logging statement has a call form of "logging.<logging method>(format_string % (format_args...))".
Such calls should leave string interpolation to the logging method itself and be written "log-
ging.<logging method>(format_string, format_args...)" so that the program may avoid incurring
the cost of the interpolation in those cases in which no message will be logged. For more, see
http://www.python.org/dev/peps/pep-0282/.
logging-format-interpolation (W1202) Use %s formatting in logging functions%s Used when a logging
statement has a call form of "logging.<logging method>(<string formatting>)". with invalid string
formatting. Use another way for format the string instead.
Metrics checker
Miscellaneous checker
Newstyle checker
bad-super-call (E1003) Bad first argument %r given to super() Used when another argument than the
current class is given as first argument of the super builtin.
Python3 checker
next-method-called (W1622) Called a next() method on an object Used when an object’s next() method
is called (Python 3 uses the next() built- in function)
dict-iter-method (W1620) Calling a dict.iter*() method Used for calls to dict.iterkeys(), itervalues() or
iteritems() (Python 3 lacks these methods)
dict-view-method (W1621) Calling a dict.view*() method Used for calls to dict.viewkeys(), viewval-
ues() or viewitems() (Python 3 lacks these methods)
exception-message-attribute (W1645) Exception.message removed in Python 3 Used when the message
attribute is accessed on an Exception. Use str(exception) instead.
eq-without-hash (W1641) Implementing __eq__ without also implementing __hash__ Used when a
class implements __eq__ but not __hash__. In Python 2, objects get object.__hash__ as the de-
fault implementation, in Python 3 objects get None as their default __hash__ implementation if they
also implement __eq__.
indexing-exception (W1624) Indexing exceptions will not work on Python 3 Indexing exceptions will
not work on Python 3. Use exception.args[index] instead.
bad-python3-import (W1648) Module moved in Python 3 Used when importing a module that no longer
exists in Python 3.
raising-string (W1625) Raising a string exception Used when a string exception is raised. This will not
work on Python 3.
standarderror-builtin (W1611) StandardError built-in referenced Used when the StandardError built-
in function is referenced (missing from Python 3)
comprehension-escape (W1662) Using a variable that was bound inside a comprehension Emitted
when using a variable, that was bound in a comprehension handler, outside of the comprehension
itself. On Python 3 these variables will be deleted outside of the comprehension.
exception-escape (W1661) Using an exception object that was bound by an except handler Emitted
when using an exception, that was bound in an except handler, outside of the except handler. On
Python 3 these exceptions will be deleted once they get out of the except handler.
deprecated-str-translate-call (W1650) Using str.translate with deprecated deletechars parameters
Used when using the deprecated deletechars parameters from str.translate. Use re.sub to remove
the desired characters
using-cmp-argument (W1640) Using the cmp argument for list.sort / sorted Using the cmp argument
for list.sort or the sorted builtin should be avoided, since it was removed in Python 3. Using either
key or functools.cmp_to_key should be preferred.
cmp-method (W1630) __cmp__ method defined Used when a __cmp__ method is defined (method is
not used by Python 3)
coerce-method (W1614) __coerce__ method defined Used when a __coerce__ method is defined
(method is not used by Python 3)
delslice-method (W1615) __delslice__ method defined Used when a __delslice__ method is defined
(method is not used by Python 3)
div-method (W1642) __div__ method defined Used when a __div__ method is defined. Using __true-
div__ and setting__div__ = __truediv__ should be preferred.(method is not used by Python 3)
getslice-method (W1616) __getslice__ method defined Used when a __getslice__ method is defined
(method is not used by Python 3)
hex-method (W1628) __hex__ method defined Used when a __hex__ method is defined (method is not
used by Python 3)
idiv-method (W1643) __idiv__ method defined Used when an __idiv__ method is defined. Using
__itruediv__ and setting__idiv__ = __itruediv__ should be preferred.(method is not used by Python
3)
nonzero-method (W1629) __nonzero__ method defined Used when a __nonzero__ method is defined
(method is not used by Python 3)
oct-method (W1627) __oct__ method defined Used when an __oct__ method is defined (method is not
used by Python 3)
rdiv-method (W1644) __rdiv__ method defined Used when a __rdiv__ method is defined. Using
__rtruediv__ and setting__rdiv__ = __rtruediv__ should be preferred.(method is not used by Python
3)
setslice-method (W1617) __setslice__ method defined Used when a __setslice__ method is defined
(method is not used by Python 3)
apply-builtin (W1601) apply built-in referenced Used when the apply built-in function is referenced
(missing from Python 3)
basestring-builtin (W1602) basestring built-in referenced Used when the basestring built-in function is
referenced (missing from Python 3)
buffer-builtin (W1603) buffer built-in referenced Used when the buffer built-in function is referenced
(missing from Python 3)
cmp-builtin (W1604) cmp built-in referenced Used when the cmp built-in function is referenced (miss-
ing from Python 3)
coerce-builtin (W1605) coerce built-in referenced Used when the coerce built-in function is referenced
(missing from Python 3)
dict-items-not-iterating (W1654) dict.items referenced when not iterating Used when dict.items is ref-
erenced in a non-iterating context (returns an iterator in Python 3)
dict-keys-not-iterating (W1655) dict.keys referenced when not iterating Used when dict.keys is refer-
enced in a non-iterating context (returns an iterator in Python 3)
dict-values-not-iterating (W1656) dict.values referenced when not iterating Used when dict.values is
referenced in a non-iterating context (returns an iterator in Python 3)
old-division (W1619) division w/o __future__ statement Used for non-floor division w/o a float literal
or from __future__ import division (Python 3 returns a float for int division uncondi-
tionally)
execfile-builtin (W1606) execfile built-in referenced Used when the execfile built-in function is refer-
enced (missing from Python 3)
file-builtin (W1607) file built-in referenced Used when the file built-in function is referenced (missing
from Python 3)
filter-builtin-not-iterating (W1639) filter built-in referenced when not iterating Used when the filter
built-in is referenced in a non-iterating context (returns an iterator in Python 3)
no-absolute-import (W1618) import missing ‘from __future__ import absolute_import‘ Used when an
import is not accompanied by from __future__ import absolute_import (default be-
haviour in Python 3)
input-builtin (W1632) input built-in referenced Used when the input built-in is referenced (backwards-
incompatible semantics in Python 3)
intern-builtin (W1634) intern built-in referenced Used when the intern built-in is referenced (Moved to
sys.intern in Python 3)
long-builtin (W1608) long built-in referenced Used when the long built-in function is referenced (miss-
ing from Python 3)
map-builtin-not-iterating (W1636) map built-in referenced when not iterating Used when the map
built-in is referenced in a non-iterating context (returns an iterator in Python 3)
next-method-defined (W1653) next method defined Used when a next method is defined that would be
an iterator in Python 2 but is treated as a normal function in Python 3.
invalid-str-codec (W1646) non-text encoding used in str.decode Used when using str.encode or
str.decode with a non-text encoding. Use codecs module to handle arbitrary codecs.
range-builtin-not-iterating (W1638) range built-in referenced when not iterating Used when the range
built-in is referenced in a non-iterating context (returns a range in Python 3)
raw_input-builtin (W1609) raw_input built-in referenced Used when the raw_input built-in function is
referenced (missing from Python 3)
reduce-builtin (W1610) reduce built-in referenced Used when the reduce built-in function is referenced
(missing from Python 3)
reload-builtin (W1626) reload built-in referenced Used when the reload built-in function is referenced
(missing from Python 3). You can use instead imp.reload or importlib.reload.
round-builtin (W1633) round built-in referenced Used when the round built-in is referenced
(backwards-incompatible semantics in Python 3)
sys-max-int (W1647) sys.maxint removed in Python 3 Used when accessing sys.maxint. Use
sys.maxsize instead.
unichr-builtin (W1635) unichr built-in referenced Used when the unichr built-in is referenced (Use chr
in Python 3)
unicode-builtin (W1612) unicode built-in referenced Used when the unicode built-in function is refer-
enced (missing from Python 3)
xrange-builtin (W1613) xrange built-in referenced Used when the xrange built-in function is referenced
(missing from Python 3)
zip-builtin-not-iterating (W1637) zip built-in referenced when not iterating Used when the zip built-in
is referenced in a non-iterating context (returns an iterator in Python 3)
Refactoring checker
simplifiable-if-expression (R1719) The if expression can be replaced with %s Used when an if expres-
sion can be replaced with ’bool(test)’.
simplifiable-if-statement (R1703) The if statement can be replaced with %s Used when an if statement
can be replaced with ’bool(test)’.
too-many-nested-blocks (R1702) Too many nested blocks (%s/%s) Used when a function or a method
has too many nested blocks. This makes the code less understandable and maintainable.
no-else-break (R1723) Unnecessary "%s" after "break" Used in order to highlight an unnecessary block
of code following an if containing a break statement. As such, it will warn when it encounters an
else following a chain of ifs, all of them containing a break statement.
no-else-continue (R1724) Unnecessary "%s" after "continue" Used in order to highlight an unneces-
sary block of code following an if containing a continue statement. As such, it will warn when it
encounters an else following a chain of ifs, all of them containing a continue statement.
no-else-raise (R1720) Unnecessary "%s" after "raise" Used in order to highlight an unnecessary block
of code following an if containing a raise statement. As such, it will warn when it encounters an else
following a chain of ifs, all of them containing a raise statement.
no-else-return (R1705) Unnecessary "%s" after "return" Used in order to highlight an unnecessary
block of code following an if containing a return statement. As such, it will warn when it encounters
an else following a chain of ifs, all of them containing a return statement.
unnecessary-comprehension (R1721) Unnecessary use of a comprehension Instead of using an identitiy
comprehension, consider using the list, dict or set constructor. It is faster and simpler.
useless-return (R1711) Useless return at end of function or method Emitted when a single "return" or
"return None" statement is found at the end of function or method definition. This statement can
safely be removed because Python will implicitly return None
unneeded-not (C0113) Consider changing "%s" to "%s" Used when a boolean expression contains an
unneeded negation.
consider-iterating-dictionary (C0201) Consider iterating the dictionary directly instead of calling
.keys() Emitted when the keys of a dictionary are iterated through the .keys() method. It is enough
to just iterate through the dictionary itself, as in "for key in dictionary".
consider-using-enumerate (C0200) Consider using enumerate instead of iterating with range and len
Emitted when code that iterates with range and len is encountered. Such code can be simplified by
using the enumerate builtin.
len-as-condition (C1801) Do not use ‘len(SEQUENCE)‘ without comparison to determine if a sequence
is empty Used when Pylint detects that len(sequence) is being used without explicit comparison
inside a condition to determine if a sequence is empty. Instead of coercing the length to a boolean,
either rely on the fact that empty sequences are false or compare the length against a scalar.
Similarities checker
duplicate-code (R0801) Similar lines in %s files Indicates that a set of similar lines has been detected
among multiple file. This usually means that the code should be refactored to avoid this duplication.
RP0801 Duplication
Spelling checker
spelling-dict Spelling dictionary name. Available dictionaries: none. To make it work, install the python-
enchant package.
spelling-ignore-words List of comma separated words that should not be checked.
spelling-private-dict-file A path to a file that contains the private dictionary; one word per line.
spelling-store-unknown-words Tells whether to store unknown words to the private dictionary (see the
–spelling-private-dict-file option) instead of raising a message.
max-spelling-suggestions Limits count of emitted suggestions for spelling mistakes.
Default: 4
Stdlib checker
invalid-envvar-value (E1507) %s does not support %s type argument Env manipulation functions sup-
port only string type arguments. See https://docs.python.org/3/library/os.html#os.getenv.
bad-open-mode (W1501) "%s" is not a valid mode for open. Python supports: r, w, a[, x] modes with b,
+, and U (only with r) options. See http://docs.python.org/2/library/functions.html#open
invalid-envvar-default (W1508) %s default type is %s. Expected str or None. Env manipulation func-
tions return None or str values. Supplying anything different as a default may cause bugs. See
https://docs.python.org/3/library/os.html#os.getenv.
redundant-unittest-assert (W1503) Redundant use of %s with constant value %r The first argument of
assertTrue and assertFalse is a condition. If a constant is passed as parameter, that condition will be
always true. In this case a warning should be emitted.
shallow-copy-environ (W1507) Using copy.copy(os.environ). Use os.environ.copy() instead. os.environ
is not a dict object but proxy object, so shallow copy has still effects on original object. See https:
//bugs.python.org/issue15373 for reference.
boolean-datetime (W1502) Using datetime.time in a boolean context. Using datetime.time in a boolean
context can hide subtle bugs when the time they represent matches midnight UTC. This behaviour
was fixed in Python 3.5. See http://bugs.python.org/issue13936 for reference. This message can’t
be emitted when using Python >= 3.5.
deprecated-method (W1505) Using deprecated method %s() The method is marked as deprecated and
will be removed in a future version of Python. Consider looking for an alternative in the documen-
tation.
subprocess-popen-preexec-fn (W1509) Using preexec_fn keyword which may be unsafe in the presence
of threads The preexec_fn parameter is not safe to use in the presence of threads in your application.
The child process could deadlock before exec is called. If you must use it, keep it trivial! Mini-
mize the number of libraries you call into.https://docs.python.org/3/library/subprocess.html#popen-
constructor
subprocess-run-check (W1510) Using subprocess.run without explicitly set ‘check‘
is not recommended. The check parameter should always be used with ex-
plicitly set check keyword to make clear what the error-handling behavior
is.https://docs.python.org/3/library/subprocess.html#subprocess.runs
bad-thread-instantiation (W1506) threading.Thread needs the target function The warning is emitted
when a threading.Thread class is instantiated without the target function being passed. By default,
the first parameter is the group param, not the target param.
String checker
bad-string-format-type (E1307) Argument %r does not match format type %r Used when a type re-
quired by format string is not suitable for actual argument type
format-needs-mapping (E1303) Expected mapping for format string, not %s Used when a format string
that uses named conversion specifiers is used with an argument that is not a mapping.
truncated-format-string (E1301) Format string ends in middle of conversion specifier Used when a
format string terminates before the end of a conversion specifier.
missing-format-string-key (E1304) Missing key %r in format string dictionary Used when a format
string that uses named conversion specifiers is used with a dictionary that doesn’t contain all the
keys required by the format string.
mixed-format-string (E1302) Mixing named and unnamed conversion specifiers in format string Used
when a format string contains both named (e.g. ’%(foo)d’) and unnamed (e.g. ’%d’) conversion
specifiers. This is also used when a named conversion specifier contains * for the minimum field
width and/or precision.
too-few-format-args (E1306) Not enough arguments for format string Used when a format string that
uses unnamed conversion specifiers is given too few arguments
bad-str-strip-call (E1310) Suspicious argument in %s.%s call The argument to a str.{l,r,}strip call con-
tains a duplicate character,
too-many-format-args (E1305) Too many arguments for format string Used when a format string that
uses unnamed conversion specifiers is given too many arguments.
bad-format-character (E1300) Unsupported format character %r (%#02x) at index %d Used when an
unsupported format character is used in a format string.
anomalous-unicode-escape-in-string (W1402) Anomalous Unicode escape in byte string: ’%s’. String
constant might be missing an r or u prefix. Used when an escape like u is encountered in a byte
string where it has no effect.
anomalous-backslash-in-string (W1401) Anomalous backslash in string: ’%s’. String constant might
be missing an r prefix. Used when a backslash is in a literal string but not as an escape.
duplicate-string-formatting-argument (W1308) Duplicate string formatting argument %r, consider
passing as named argument Used when we detect that a string formatting is repeating an argument
instead of using named string arguments
format-combined-specification (W1305) Format string contains both automatic field numbering and
manual field specification Used when a PEP 3101 format string contains both automatic field num-
bering (e.g. ’{}’) and manual field specification (e.g. ’{0}’).
bad-format-string-key (W1300) Format string dictionary key should be a string, not %s Used when a
format string that uses named conversion specifiers is used with a dictionary whose keys are not all
strings.
implicit-str-concat-in-sequence (W1403) Implicit string concatenation found in %s String literals are
implicitly concatenated in a literal iterable definition : maybe a comma is missing ?
bad-format-string (W1302) Invalid format string Used when a PEP 3101 format string is invalid.
missing-format-attribute (W1306) Missing format attribute %r in format specifier %r Used when a
PEP 3101 format string uses an attribute specifier ({0.length}), but the argument passed for format-
ting doesn’t have that attribute.
missing-format-argument-key (W1303) Missing keyword argument %r for format string Used when a
PEP 3101 format string that uses named fields doesn’t receive one or more required keywords.
unused-format-string-argument (W1304) Unused format argument %r Used when a PEP 3101 format
string that uses named fields is used with an argument that is not required by the format string.
unused-format-string-key (W1301) Unused key %r in format string dictionary Used when a format
string that uses named conversion specifiers is used with a dictionary that contains keys not required
by the format string.
invalid-format-index (W1307) Using invalid lookup key %r in format specifier %r Used when a PEP
3101 format string uses a lookup specifier ({a[1]}), but the argument passed for formatting doesn’t
contain or doesn’t have that key as an attribute.
Typecheck checker
ignore-on-opaque-inference This flag controls whether pylint should warn about no-member and similar
checks whenever an opaque object is returned when inferring. The inference can return multiple
potential results while evaluating a Python object, but some branches might not be evaluated, which
results in partial inference. In that case, it might be useful to still emit no-member and other checks
for the rest of the inferred objects.
Default: yes
ignore-mixin-members Tells whether missing members accessed in mixin class should be ignored. A
mixin class is detected if its name ends with "mixin" (case insensitive).
Default: yes
ignore-none Tells whether to warn about missing members when the owner of the attribute is inferred to
be None.
Default: yes
ignored-modules List of module names for which member attributes should not be checked (useful for
modules/projects where namespaces are manipulated during runtime and thus existing member at-
tributes cannot be deduced by static analysis). It supports qualified module names, as well as Unix
pattern matching.
ignored-classes List of class names for which member attributes should not be checked (useful for classes
with dynamically set attributes). This supports the use of qualified names.
Default: optparse.Values,thread._local,_thread._local
generated-members List of members which are set dynamically and missed by pylint inference system,
and so shouldn’t trigger E1101 when accessed. Python regular expressions are accepted.
contextmanager-decorators List of decorators that produce context managers, such as con-
textlib.contextmanager. Add to this list to register other decorators that produce valid context man-
agers.
Default: contextlib.contextmanager
missing-member-hint-distance The minimum edit distance a name should have in order to be consid-
ered a similar match for a missing member name.
Default: 1
missing-member-max-choices The total number of similar names that should be taken in consideration
when showing a hint for a missing member.
Default: 1
missing-member-hint Show a hint with possible names when a member name was not found. The aspect
of finding the hint is based on edit distance.
Default: yes
signature-mutators List of decorators that change the signature of a decorated function.
not-an-iterable (E1133) Non-iterable value %s is used in an iterating context Used when a non-iterable
value is used in place where iterable is expected
not-a-mapping (E1134) Non-mapping value %s is used in a mapping context Used when a non-mapping
value is used in place where mapping is expected
invalid-sequence-index (E1126) Sequence index is not an int, slice, or instance with __index__ Used
when a sequence type is indexed with an invalid type. Valid types are ints, slices, and objects with
an __index__ method.
invalid-slice-index (E1127) Slice index is not an int, None, or instance with __index__ Used when a
slice index is not an integer, None, or an object with an __index__ method.
too-many-function-args (E1121) Too many positional arguments for %s call Used when a function call
passes too many positional arguments.
unexpected-keyword-arg (E1123) Unexpected keyword argument %r in %s call Used when a function
call passes a keyword argument that doesn’t correspond to one of the function’s parameter names.
dict-iter-missing-items (E1141) Unpacking a dictionary in iteration without calling .items() Emitted
when trying to iterate through a dict without calling .items()
unsupported-membership-test (E1135) Value ’%s’ doesn’t support membership test Emitted when
an instance in membership test expression doesn’t implement membership protocol (__con-
tains__/__iter__/__getitem__).
unsubscriptable-object (E1136) Value ’%s’ is unsubscriptable Emitted when a subscripted value
doesn’t support subscription (i.e. doesn’t define __getitem__ method or __class_getitem__ for a
class).
keyword-arg-before-vararg (W1113) Keyword argument before variable positional arguments list in
the definition of %s function When defining a keyword argument before variable positional argu-
ments, one can end up in having multiple values passed for the aforementioned parameter in case
the method is called with keyword arguments.
arguments-out-of-order (W1114) Positional arguments appear to be out of order Emitted when the
caller’s argument names fully match the parameter names in the function signature but do not have
the same order.
c-extension-no-member (I1101) %s %r has no %r member%s, but source is unavailable. Consider
adding this module to extension-pkg-whitelist if you want to perform analysis based on run-time
introspection of living objects. Used when a variable is accessed for non-existent member of C
extension. Due to unavailability of source static analysis is impossible, but it may be performed by
introspecting living objects in run-time.
Variables checker
init-import Tells whether we should check for unused import in __init__ files.
dummy-variables-rgx A regular expression matching the name of dummy variables (i.e. expected to not
be used).
Default: _+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
additional-builtins List of additional names supposed to be defined in builtins. Remember that you
should avoid defining new builtins when possible.
callbacks List of strings which can identify a callback function by name. A callback name must start or
end with one of those strings.
Default: cb_,_cb
redefining-builtins-modules List of qualified module names which can have objects that can redefine
builtins.
Default: six.moves,past.builtins,future.builtins,builtins,io
ignored-argument-names Argument names that match this expression will be ignored. Default to name
with leading underscore.
Default: _.*|^ignored_|^unused_
allow-global-unused-variables Tells whether unused global variables should be treated as a violation.
Default: yes
redefined-outer-name (W0621) Redefining name %r from outer scope (line %s) Used when a variable’s
name hides a name defined in the outer scope.
unused-import (W0611) Unused %s Used when an imported module or variable is not used.
unused-argument (W0613) Unused argument %r Used when a function or method argument is not used.
unused-wildcard-import (W0614) Unused import %s from wildcard import Used when an imported
module or variable is not used from a ’from X import *’ style import.
unused-variable (W0612) Unused variable %r Used when a variable is defined but not used.
global-variable-not-assigned (W0602) Using global for %r but no assignment is done Used when a
variable is defined through the "global" statement but no assignment to this variable is done.
undefined-loop-variable (W0631) Using possibly undefined loop variable %r Used when a loop vari-
able (i.e. defined by a for loop or a list comprehension or a generator expression) is used outside the
loop.
global-statement (W0603) Using the global statement Used when you use the "global" statement to
update a global variable. Pylint just try to discourage this usage. That doesn’t mean you cannot use
it !
global-at-module-level (W0604) Using the global statement at the module level Used when you use the
"global" statement at the module level since it has no effect
If you are getting the dreaded no-member error, there is a possibility that either pylint found a bug in your code or
that it actually tries to lint a C extension module.
Linting C extension modules is not supported out of the box, especially since pylint has no way to get an AST object
out of the extension module.
But pylint actually has a mechanism which you might use in case you want to analyze C extensions. pylint has a flag,
called extension-pkg-whitelist, through which you can tell it to import that module and to build an AST from that
imported module:
$ pylint --extension-pkg-whitelist=your_c_extension
Be aware though that using this flag means that extensions are loaded into the active Python interpreter and may run
arbitrary code, which you may not want. This is the reason why we disable by default loading C extensions. In
case you do not want the hassle of passing C extensions module with this flag all the time, you can enable unsafe-
load-any-extension in your configuration file, which will build AST objects from all the C extensions that pylint
encounters:
$ pylint --unsafe-load-any-extension=y
Alternatively, since pylint emits a separate error for attributes that cannot be found in C extensions, c-extension-no-
member, you can disable this error for your project.
Development
6.1 Contributing
You think you have found a bug in Pylint? Well, this may be the case since Pylint is under heavy development!
Please take the time to check if it is already in the issue tracker at https://github.com/PyCQA/pylint
If you cannot find it in the tracker, create a new issue there or discuss your problem on the [email protected]
mailing list.
The code-quality mailing list is also a nice place to provide feedback about Pylint, since it is shared with other tools
that aim at improving the quality of python code.
Note that if you don’t find something you have expected in Pylint’s issue tracker, it may be because it is an issue with
one of its dependencies, namely astroid:
• https://github.com/PyCQA/astroid
6.1.3 Repository
73
Pylint Documentation, Release 2.4.4
Got a change for Pylint? Below are a few steps you should take to make sure your patch gets accepted.
• Test your code
– Pylint is very well tested, with a high good code coverage. It has two types of tests, usual unittests and
functional tests.
The usual unittests can be found under /pylint/test directory and they can be used for testing almost any-
thing Pylint related. But for the ease of testing Pylint’s messages, we also have the concept of functional
tests.
– You should also run all the tests to ensure that your change isn’t breaking one. You can run the tests using
the tox package, as in:
python -m tox
python -m tox -epy36 # for Python 3.6 suite only
python -m tox -epylint # for running Pylint over Pylint's codebase
python -m tox -eformatting # for running formatting checks over Pylint's
˓→codebase
– It’s usually a good idea to run tox with --recreate. This is needed because the tox environment might
use an older version of astroid, which can cause various failures when you are running against the latest
pylint:
– To run only a specific test suite, use a pattern for the test filename (without the .py extension), as in:
– Since we just use pytest to run the tests, you can also use it as well, although we highly recommend using
tox instead:
– pylint uses black and isort Python autoformatter for formatting its code. We have a pre-commit hook
which should take care of the autoformatting for you for when you are working on a patch. To enable it,
do the following:
74 Chapter 6. Development
Pylint Documentation, Release 2.4.4
• Send a pull request from GitHub (see About pull requests for more insight about this topic)
These are residing under ’/pylint/test/functional’ and they are formed of multiple components. First, each Python file
is considered to be a test case and it should be accompanied by a .txt file, having the same name, with the messages
that are supposed to be emitted by the given test file.
In the Python file, each line for which Pylint is supposed to emit a message has to be annotated with a comment in the
form # [message_symbol], as in:
a, b, c = 1 # [unbalanced-tuple-unpacking]
If multiple messages are expected on the same line, then this syntax can be used:
symbol:line_number:function_or_class:Expected message
If the Python file is expected to not emit any errors, then the .txt file has to be empty. If you need special control over
Pylint’s flag, you can also create a .rc file, which can have sections of Pylint’s configuration.
During development, it’s sometimes helpful to run all functional tests in your current environment in order to have
faster feedback. Run with:
python pylint/test/test_functional.py
• Read the Technical Reference. It gives a short walkthrough of the pylint codebase and will help you identify
where you will need to make changes for what you are trying to implement.
• astroid.extract_node() is your friend. Most checkers are AST based, so you will likely need to interact
with astroid. A short example of how to use astroid.extract_node() is given here.
• When fixing a bug for a specific check, search the code for the warning message to find where the warning is
raised, and therefore where the logic for that code exists.
$ tox -e docs
6.1. Contributing 75
Pylint Documentation, Release 2.4.4
76 Chapter 6. Development
CHAPTER 7
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.
7.2 2. Installation
Pylint uses the git distributed version control system. The URL of the repository is: https://github.com/PyCQA/pylint
. To get the latest version of Pylint from the repository, simply invoke
Pylint depends on astroid and a couple of other packages. See the following section for details on what versions of
Python are supported.
77
Pylint Documentation, Release 2.4.4
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), an implicit
namespace package 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 an implicit namespace package and is in the python path.
• "directory" is a python package and your cwd is "/whatever" and so on...
7.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:
• value of the PYLINTHOME environment variable if set
• ".pylint.d" subdirectory of the user’s home directory if it is found (not always findable on Windows plat-
forms)
• ".pylint.d" directory in the current directory
7.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:
7.3.4 3.4 I’d rather not run Pylint from the command line. Can I integrate it with my
editor?
Yes, this feature has been added in Pylint 0.11. This may be done by adding "#pylint: disable=some-message,another-
one" at the desired block level or at the end of the desired line of code
7.4.2 4.2 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:
7.4.3 4.3 How can I tell Pylint to never check a given module?
With Pylint < 0.25, add "#pylint: disable-all" at the beginning of the module. Pylint 0.26.1 and up have renamed that
directive to "#pylint: skip-file" (but the first version will be kept for backward compatibility).
In order to ease finding which modules are ignored an Information-level message file-ignored is emitted. With recent
versions of Pylint, if you use the old syntax, an additional deprecated-disable-all message is emitted.
No, starting from 0.25.3, you can use symbolic names for messages:
7.4.5 4.5 I have a callback function where I have no control over received argu-
ments. 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).
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:
pylint does have some messages disabled by default, either because they are prone to false positives or that they are
opinionated enough for not being included as default messages. But most of the disabled messages are from the Python
3 porting checker, which is disabled by default. It needs special activation with the --py3k flag.
A class is considered as an abstract class if at least one of its methods is doing nothing but raising NotImplemented-
Error.
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).
7.6 6. Troubleshooting
7.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
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 maximum of 0 and the above expression.
7.6.3 6.3 I have a question about Pylint that isn’t answered here.
The following projects are known to use Pylint to help develop better Python code:
• edX (https://github.com/edx)
• qutebrowser (https://github.com/The-Compiler/qutebrowser)
• Odoo (https://github.com/OCA)
• Landscape.io (https://github.com/landscapeio/)
• Codacy (https://github.com/Codacy/)
• SaltStack (https://github.com/saltstack)
• CodeFactor (https://github.com/codefactor-io)
• many more...
81
Pylint Documentation, Release 2.4.4
Support
Professional support for pylint is available as part of the Tidelift Subscription. Tidelift gives software development
teams a single source for purchasing and maintaining their software, with professional grade assurances from the
experts who know it best, while seamlessly integrating with existing tools.
83
Pylint Documentation, Release 2.4.4
84 Chapter 9. Support
CHAPTER 10
High level descriptions of the most important changes between major Pylint versions.
Release 2.4
Date 2019-09-24
• import-outside-toplevel
This check warns when modules are imported from places other than a module toplevel, e.g. inside a function
or a class.
• Added a new check, consider-using-sys-exit
This check is emitted when we detect that a quit() or exit() is invoked instead of sys.exit(), which is the preferred
way of exiting in program.
Close #2925
• Added a new check, arguments-out-of-order
This check warns if you have arguments with names that match those in a function’s signature but you are
passing them in to the function in a different order.
Close #2975
• Added new checks, no-else-break and no-else-continue
These checks highlight unnecessary else and elif blocks after break and continue statements.
85
Pylint Documentation, Release 2.4.4
Close #2327
• Added unnecessary-comprehension that detects unnecessary comprehensions.
This check is emitted when pylint finds list-, set- or dict-comprehensions, that are unnecessary and can be
rewritten with the list-, set- or dict-constructors.
Close #2905
• Added a new check, invalid-overridden-method
This check is emitted when we detect that a method is overridden as a property or a property is overridden as a
method. This can indicate a bug in the application code that will trigger a runtime error.
Close #2670
• Added a new check, redeclared-assigned-name
This check is emitted when pylint detects that a name was assigned one or multiple times in the same assign-
ment, which indicate a potential bug.
Close #2898
• Added a new check, self-assigning-variable
This check is emitted when we detect that a variable is assigned to itself, which might indicate a potential bug
in the code application.
For example, the following would raise this warning:
Close #2930
• Added a new check property-with-parameters which detects when a property has more than a single
argument.
Close #3006
• Added subprocess-run-check to handle subprocess.run without explicitly set check keyword.
Close #2848
• We added a new check message dict-iter-missing-items. This is emitted when trying to iterate
through a dict in a for loop without calling its .items() method.
Closes #2761
• We added a new check message missing-parentheses-for-call-in-test. This is emitted in case
a call to a function is made inside a test but it misses parentheses.
• A new check class-variable-slots-conflict was added.
This check is emitted when pylint finds a class variable that conflicts with a slot name, which would raise a
ValueError at runtime.
For example, the following would raise an error:
class A:
__slots__ = ('first', 'second')
first = 1
• Don’t emit protected-access when a single underscore prefixed attribute is used inside a special method
Close #1802
• len-as-condition now only fires when a len(x) call is made without an explicit comparison.
The message and description accompanying this checker has been changed reflect this new behavior, by explic-
itly asking to either rely on the fact that empty sequence are false or to compare the length with a scalar.
OK:
if len(x) == 0:
pass
KO:
if not len(x):
pass
• A file is now read from stdin if the --from-stdin flag is used on the command line. In addition to the
--from-stdin flag a (single) file name needs to be specified on the command line, which is needed for the
report.
• The checker for ungrouped imports is now more permissive.
The import can now be sorted alphabetically by import style. This makes pylint compatible with isort.
The following imports do not trigger an ungrouped-imports anymore
import unittest
import zipfile
from unittest import TestCase
from unittest.mock import MagicMock
def my_func(self):
"""This is a docstring.
Returns
-------
:obj:`list` of :obj:`str`
List of strings
"""
return ["hi", "bye"] #@
Release 2.3
Date 2019-02-27
• This release improves the performance of the 2.X series after it was affected by a performance regression a
couple of releases ago.
Quite a lot of bug fixes and improvements went into this release, here’s a handful of them. For the full changes, check
the Changelog.
• We no longer emit *-not-iterating checks for builtins consumed by itertools
• We fixed some false positives for no-self-argument and unsubscriptable-object when using
__class_getitem__ (new in Python 3.7)
• pylint now supports Ellipsis as a synonym for pass statements.
• fixme gets triggered only on comments.
• pylint exempts starred unpacking from *-not-iterating Python 3 checks.
• compare-to-zero is now less zealous by checking against equality and identity.
‘‘yield from‘‘ is exempted from ‘‘-not-iterating‘‘ Python 3 checks.
• A false positive with not-async-context-manager caused by not understanding contextlib.
asynccontextmanager was fixed.
• We refactored bad-reversed-sequence to account for more objects that can define __reversed__.
• no-member is now emitted for enums when they lack a member.
• Plugins can now use the load_configuration() hook. This hook is executed after configuration is loaded
to prevent overwriting plugin specific configuration via user-based configuration.
• There’s a new command line option list-groups for listing all the check groups pylint knows about.
This is useful to know what groups you can disable or enable individually.
Release 2.2
Date 2018-11-25
It accepts two options: --logging-format-style=old for using % style formatting, which is the as-
sumed default, and --logging-format-style=new for using {} style formatting.
• implicit-str-concat-in-sequence detects string concatenation inside lists, sets & tuples.
Example of code that would generate such warning:
• try-except-raise checker now handles multilevel inheritance hirerachy for exceptions correctly.
Close #2484
• Ignore import x.y.z as z cases for checker useless-import-alias.
• unnecessary-pass is now also emitted when a function or class contains only docstring and pass statement, in
which case, docstring is enough for empty definition.
• Fix false positive undefined-variable and used-before-assignment with nonlocal keyword us-
age.
• Fix exceptions being raised when one of the params is not a ClassDef for checkers.utils.
is_subclass_of().
• pylint now picks the latest value from the inferred values of the exception that gets raised, when looking for
raising-non-exception. This helps when reusing a variable name for multiple types, since pylint
was picking just the first inferred value, leading to spurious false positives.
Close #2431
• pylint used to emit a not-an-iterable error when looking at coroutines built with asyncio.
coroutine. This is no longer the case as we handle coroutines explicitly.
Close #996
• pylint used to emit a unused-variable error if unused import was found in the function. Now instead
of unused-variable, unused-import is emitted.
Close #2421
Release 2.1
Date 2018-08-01
• This release mostly includes fixes for bugs found after the launch of 2.0.
• try-except-raise check was demoted from an error to a warning, as part of issue #2323.
• Correctly handle the new name of the Python implementation of the abc module.
In Python 3.7, the abc module has both a C implementation as well as a Python one, but the Python implemen-
tation has a different file name that what pylint was expecting, resulting in some checks getting confused.
• Modules with __getattr__ are exempted by default from no-member
There’s no easy way to figure out if a module has a particular member when the said module uses
__getattr__, which is a new addition to Python 3.7. Instead we assume the safe thing to do, in the same
way we do for classes, and skip those modules from checking.
• invalid name is no longer triggered for function and attribute names longer than 30 characters. The upper
limit was removed completely.
• Fix false-positive undefined-variable for self referential class name in lamdbas
• no-else-return also specifies the type of the branch that is causing the error.
• Fixed inconsistent behaviour for bad-continuation on first line of file.
• Fixed a bug where pylint was not able to disable certain messages on the last line through the global disable
option.
• pylint no longer emits useless-return when it finds a single statement that is the return itself
We still want to be explicit when a function is supposed to return an optional value; even though pass could
still work, it’s not explicit enough and the function might look like it’s missing an implementation.
• Fixed a bug where pylint was crashing when being unable to infer the value of an argument to next()
• pylint no longer emit not-an-iterable when dealing with async iterators.
• pylint gained the ability to specify a default docstring type for when the check cannot guess the type
For this we added a --default-docstring-type command line option.
Release 2.0
Date 2018-07-15
• Dropped support for Python 2. This release will work only on Python 3.4+.
If you need to use pylint with Python 2, you can use Pylint 1.9+. We’ll continue to do bug releases until
2020, when Python 2 goes officially EOL. pylint will gain the ability to analyze Python 2 files, but some
checks might not work as they will assume that their running environment is Python 2.
• Given the dropping of Python 2, the Python 3 porting mode (enabled via --py3k) can now also run with Python
3.
The porting mode used to be a no-op on Python 3, but most of the messages can now be emitted when the
running interpreter is Python 3. The only messages that won’t be emitted are those that rely on a particular
syntax specific to Python 2, for instance print as a statement.
class A(object):
pass
class A: # better
pass
def foo():
return None
def goo():
return None
• New useless-return message when function or method ends with a "return" or "return None" statement
and this is the only return statement in the body.
• New use-symbolic-message-instead message when a message is activated or deactivated by id in-
stead of symbol. The use of symbol is more explicit and easier to remind.
• A new check was added, consider-swap-variables.
This refactoring message is emitted when using a temporary variable in order to swap the values of two variables
instead of the shorter, more idiomatic approach with tuple-unpacking.
Instead of a temporary variable, the one-line syntax with commas should be used.
See this style guide document or this swap values presentation for details.
def func():
some_value = some_call()
return locals()
• New unhashable-dict-key check added to detect dict lookups using unhashable keys such as lists or
dicts.
• New self-cls-assignment warning check added.
This is warning if the first argument of an instance/ class method gets assigned
class Foo(object):
def foo(self, bar):
self = bar
• New verbose mode option --verbose to display of extra non-checker-related output. Disabled by default.
• Two new checks were added for recommending dict and set comprehensions where possible.
These two checks are going to flag the following examples:
• A couple of performance improvements brought to astroid should make pylint should be a bit faster as
well.
def func():
global sys
import sys
More details on the postponed evaluation of annotations can be read in PEP 563.
• A new command line option was added, --exit-zero, for the use of continuous integration scripts which
abort if a command returns a non-zero status code. If the option is specified, and Pylint runs successfully, it will
exit with 0 regardless of the number of lint issues detected.
Configuration errors, parse errors, and calling Pylint with invalid command-line options all still return a non-zero
error code, even if --exit-zero is specified.
• Don’t emit unused-import anymore for typing imports used in type comments. For instance, in the follow-
ing example pylint used to complain that Any and List are not used, while they should be considered used by
a type checker.
• Fix false positive line-too-long for commented lines at the end of module
• Fix emitting useless-super-delegation when changing the default value of keyword arguments.
• Support typing.TYPE_CHECKING for unused-import errors
When modules are imported under typing.TYPE_CHECKING guard, pylint will no longer emit unused-
import.
• Fix false positive unused-variable in lambda default arguments
• assignment-from-no-return considers methods as well as functions.
If you have a method that doesn’t return a value, but later on you assign a value to a function call to that method
(so basically it will be None), then pylint is going to emit an assignment-from-no-return error.
• A new flag was added, --ignore-none which controls the no-member behaviour with respect to None
values.
Previously pylint was not emitting no-member if it inferred that the owner of an attribute access is a None
value. In some cases, this might actually cause bugs, so if you want to check for None values as well, pass
--ignore-none=n to pylint.
• Fix false-positive bad-continuation for with statements
• Fix false-positive bad-whitespace message for typing annoatations with ellipses in them
• Fix false-positive undefined-variable for nested lambdas
Release 1.9
Date 2018-05-15
• None so far
• A new Python 3 checker was added to warn about the removed operator.div function.
• A new Python 3 checker was added to warn about accessing functions that have been moved from the urllib
module in corresponding subpackages, such as urllib.request.
Instead the previous code should use urllib.parse or six.moves to import a module in a Python 2 and 3
compatible fashion:
To have this working on Python 3 as well, please use the six library:
• A new check was added to warn about using unicode raw string literals. This is a syntax error in Python 3:
a = ur'...'
• Added a new deprecated-sys-function check, emitted when accessing removed sys members.
• Added xreadlines-attribute check, emitted when the xreadlines() attribute is accessed on a file object.
• Added two new Python 3 porting checks, exception-escape and comprehension-escape
These two are emitted whenever pylint detects that a variable defined in the said blocks is used outside of the
given block. On Python 3 these values are deleted.
try:
1/0
except ZeroDivisionError as exc:
...
print(exc) # This will raise a NameError on Python 3
• defaultdict and subclasses of dict are now handled for dict-iter-* checks. That means that the following code
will now emit warnings for when iteritems and friends are accessed:
some_dict = defaultdict(list)
...
some_dict.iterkeys()
Release 1.8
Date 2017-12-15
• None so far
import copy
import os
wrong_env_copy = copy.copy(os.environ) # will emit pylint warning
wrong_env_copy['ENV_VAR'] = 'new_value' # changes os.environ
assert os.environ['ENV_VAR'] == 'new_value'
value = other_value
import threading
threading.Thread(lambda: print(1)) # Oups, this is the group parameter
• A new Python 3 checker was added to warn about accessing functions that have been removed from the itertools
module izip, imap, iflter, izip_longest, and ifilterfalse.
• A new Python 3 checker was added to warn about accessing deprecated fields from the types module like
ListType or IntType
print(isinstance([], list))
• A new Python 3 checker was added to warn about declaring a next method that would have implemented the
Iterator protocol in Python 2 but is now a normal method in Python 3.
class Foo(object):
def next(self):
return 42
Instead implement a __next__ method and use six.Iterator as a base class or alias next to __next__:
class Foo(object):
def __next__(self):
return 42
next = __next__
• Three new Python 3 checkers were added to warn about using dictionary methods in non-iterating contexts.
For example, the following are returning iterators in Python 3:
.. code-block:: python
This warning can be ignored on projects which deliberately use lazy formatting of messages in all user-facing
exception handlers.
• Following the recommendations of PEP479 ,a new Python 3.0 checker was added to warn about raising a
StopIteration inside a generator. Raising a StopIteration inside a generator may be due a direct
call to raise StopIteration:
def gen_stopiter():
yield 1
yield 2
yield 3
raise StopIteration
def gen_stopiter():
yield 1
yield 2
yield 3
return
Raising a StopIteration may also be due to the call to next function with a generator as argument:
def gen_next_raises_stopiter():
g = gen_ok()
while True:
yield next(g)
def gen_next_raises_stopiter():
g = gen_ok()
while True:
try:
yield next(g)
except StopIteration:
return
The check about raising a StopIteration inside a generator is also valid if the exception raised inherit from
StopIteration. Close #1385
• A new Python checker was added to warn about using a + operator inside call of logging methods when one of
the operands is a literal string:
import logging
var = "123"
logging.log(logging.INFO, "Var: " + var)
According to PEP8, if any return statement returns an expression, any return statements where no value is
returned should explicitly state this as return None, and an explicit return statement should be present at the end
of the function (if reachable). Thus, the previous function should be written:
def mix_implicit_explicit_returns(arg):
if arg < 10:
return True
elif arg < 20:
return None
Close #1267
:type: int
(continues on next page)
class Foo(object):
@property
def foo(self):
"""int: My Numpy and Google docstring style description."""
return 10
• In case of --output-format=json, the dictionary returned holds a new key-value pair. The key is
message-id and the value the message id.
• Spelling checker has a new configuration parameter max-spelling-suggestions, which affects maxi-
mum count of suggestions included in emitted message.
• The invalid-name check contains the name of the template that caused the failure.
For the given code, pylint used to emit invalid-name in the form Invalid constant name var,
without offering any context why var is not such a good name.
With this change, it is now more clear what should be improved for a name to be accepted according to its
corresponding template.
• New configuration flag, suggestion-mode was introduced. When enabled, pylint would attempt to emit
user-friendly suggestions instead of spurious errors for some known false-positive scenarios. Flag is enabled by
default.
• superfluous-parens is no longer wrongly emitted for logical statements involving in operator (see ex-
ample below for what used to be false-positive).
foo = None
if 'bar' in (foo or {}):
pass
• Redefinition of dummy function is now possible. function-redefined message won’t be emitted anymore
when dummy functions are redefined.
• missing-param-doc and missing-type-doc are no longer emitted when Args and Keyword Args
are mixed in Google docstring.
• Fix of false positive useless-super-delegation message when parameters default values are different
from those used in the base class.
• Fix of false positive useless-else-on-loop message when break statements are deeply nested inside
loop.
• The Python 3 porting checker no longer emits multiple no-absolute-import per file.
• The Python 3 porting checker respects disabled checkers found in the config file.
• Modules, classes, or methods consist of compound statements that exceed the docstring-min-length are
now correctly emitting missing-docstring
• Fix no wrong-import-order message emitted on ordering of first and third party libraries. With this fix,
pylint distinguishes first and third party modules when checking import order.
• Fix the ignored pylint disable=fixme directives for comments following the last statement in a file.
• Fix line-too-long message deactivated by wrong disable directive. The directive disable=fixme
doesn’t deactivate anymore the emission of line-too-long message for long commented lines.
• If the rcfile specified on the command line doesn’t exist, then an IOError exception is raised.
• Fix the wrong scope of disable= directive after a commented line. For example when a
disable=line-too-long directive is at the end of a long commented line, it no longer disables the emis-
sion of line-too-long message for lines that follow.
Release 1.7
Date 2017-04-13
• None yet.
• single-string-used-for-slots check was added, which is used whenever a class is using a single
string as a slot value. While this is technically not a problem per se, it might trip users when manipulating the
slots value as an iterable, which would in turn iterate over characters of the slot value. In order to be more
straight-forward, always try to use a container such as a list or a tuple for defining slot values.
• We added a new check, literal-comparison, which is used whenever pylint can detect a comparison to
a literal. This is usually not what we want and, potentially, error prone. For instance, in the given example, the
first string comparison returns true, since smaller strings are interned by the interpreter, while for larger ones, it
will return False:
mystring = "ok"
if mystring is "ok": # Returns true
# do stuff
Instead of using the is operator, you should use the == operator for this use case.
• We added a new refactoring message, consider-merging-isinstance, which is emitted whenever we
can detect that consecutive isinstance calls can be merged together. For instance, in this example, we can merge
the first two isinstance calls:
# $ cat a.py
if isinstance(x, int) or isinstance(x, float):
pass
if isinstance(x, (int, float)) or isinstance(x, str):
pass
# $ pylint a.py
# R: 1, 0: Consider merging these isinstance calls to isinstance(x, (float,
˓→int)) (consider-merging-isinstance)
• A new error check was added, invalid-metaclass, which is used whenever pylint can detect that a given
class is using a metaclass which is invalid for the purpose of the class. This usually might indicate a problem in
the code, rather than something done on purpose.
class MyClass(metaclass=SomeClass):
pass
• A new warning was added, useless-super-delegation, which is used whenever we can detect that an
overridden method is useless, relying on super() delegation to do the same thing as another method from the
MRO.
For instance, in this example, the first two methods are useless, since they do the exact same thing as the methods
from the base classes, while the next two methods are not, since they do some extra operations with the passed
arguments.
class Impl(Base):
• A new warning was added, len-as-condition, which is used whenever we detect that a condition uses
len(SEQUENCE) incorrectly. Instead one could use if SEQUENCE or if not SEQUENCE.
For instance, all of the examples below:
if len(S):
pass
if not len(S):
pass
if len(S) > 0:
pass
if len(S) != 0:
pass
if len(S) == 0:
pass
if S:
pass
if not S:
pass
if S != "":
pass
if S == '':
pass
if S:
pass
if not S:
pass
An exception to this is when empty string is an allowed value whose meaning is treated differently than None.
For example the meaning could be user selected no additional options vs. user has not made their selection yet!
You can activate this checker by adding the line:
load-plugins=pylint.extensions.emptystring
• A new extension was added, comparetozero.py which detects whenever we compare integers to zero. This
extension is disabled by default. For instance, the examples below:
if X != 0:
pass
if X == 0:
pass
if X:
pass
if not X:
pass
An exception to this is when zero is an allowed value whose meaning is treated differently than None. For
example the meaning could be None means no limit, while 0 means the limit it zero!
You can activate this checker by adding the line:
load-plugins=pylint.extensions.comparetozero
• We’ve added new error conditions for bad-super-call which now detect the usage of
super(type(self), self) and super(self.__class__, self) patterns. These can lead
to recursion loop in derived classes. The problem is visible only if you override a class that uses these incorrect
invocations of super().
For instance, Derived.__init__() will correctly call Base.__init__. At this point type(self)
will be equal to Derived and the call again goes to Base.__init__ and we enter a recursion loop.
class Base(object):
def __init__(self, param1, param2):
super(type(self), self).__init__(param1, param2)
class Derived(Base):
def __init__(self, param1, param2):
super(Derived, self).__init__(param1, param2)
• The warnings missing-returns-doc and missing-yields-doc have each been replaced with
two new warnings - missing-[return|yield]-doc and missing-[return|yield]-type-doc.
Having these as separate warnings allows the user to choose whether their documentation style requires text
descriptions of function return/yield, specification of return/yield types, or both.
Returns:
bool:
"""
return False
• A new refactoring check was added, redefined-argument-from-local, which is emitted when pylint
can detect than a function argument is redefined locally in some potential error prone cases. For instance, in
the following piece of code, we have a bug, since the check will never return True, given the fact that we are
comparing the same object to its attributes.
def test(resource):
for resource in resources:
# The ``for`` is reusing ``resource``, which means that the following
# ``resource`` is not what we wanted to check against.
if resource.resource_type == resource:
call_resource(resource)
Other places where this check looks are with statement name bindings and except handler’s name binding.
• A new refactoring check was added, no-else-return, which is emitted when pylint encounters an else
following a chain of ifs, all of them containing a return statement.
• A new Python 3 check was added, eq-without-hash, which enforces classes that implement __eq__ also
implement __hash__. The behavior around classes which implement __eq__ but not __hash__ changed in
Python 3; in Python 2 such classes would get object.__hash__ as their default implementation. In Python
3, aforementioned classes get None as their implementation thus making them unhashable.
class JustEq(object):
def __init__(self, x):
self.x = x
class Neither(object):
def __init__(self, x):
self.x = x
class HashAndEq(object):
def __init__(self, x):
self.x = x
def __hash__(self):
return hash(self.x)
In order to fix this error and avoid behavior differences between Python 2 and Python 3, classes should either
explicitly set __hash__ to None or implement a hashing function.
class JustEq(object):
def __init__(self, x):
(continues on next page)
__hash__ = None
• 3 new Python 3 checkers were added, div-method, idiv-method and rdiv-method. The magic meth-
ods __div__ and __idiv__ have been phased out in Python 3 in favor of __truediv__. Classes imple-
menting __div__ that still need to be used from Python 2 code not using from __future__ import
division should implement __truediv__ and alias __div__ to that implementation.
class DivisibleThing(object):
def __init__(self, x):
self.x = x
__div__ = __truediv__
• A new Python 3 checker was added to warn about accessing the message attribute on Exceptions. The message
attribute was deprecated in Python 2.7 and was removed in Python 3. See https://www.python.org/dev/peps/
pep-0352/#retracted-ideas for more information.
try:
raise Exception("Oh No!!")
except Exception as e:
print(e.message)
Instead of relying on the message attribute, you should explicitly cast the exception to a string:
try:
raise Exception("Oh No!!")
except Exception as e:
print(str(e))
• A new Python 3 checker was added to warn about using encode or decode on strings with non-text codecs.
This check also checks calls to open with the keyword argument encoding. See https://docs.python.org/3/
whatsnew/3.4.html#improvements-to-codec-handling for more information.
'hello world'.encode('hex')
Instead of using the encode method for non-text codecs use the codecs module.
import codecs
codecs.encode('hello world', 'hex')
• A new warning was added, overlapping-except, which is emitted when an except handler treats two
exceptions which are overlapping. This means that one exception is an ancestor of the other one or it is just an
alias.
For example, in Python 3.3+, IOError is an alias for OSError. In addition, socket.error is an alias for OSError.
The intention is to find cases like the following:
import socket
try:
pass
except (ConnectionError, IOError, OSError, socket.error):
pass
• A new Python 3 checker was added to warn about accessing sys.maxint. This attribute was removed in
Python 3 in favor of sys.maxsize.
import sys
print(sys.maxint)
import sys
print(sys.maxsize)
• A new Python 3 checker was added to warn about importing modules that have either moved or been removed
from the standard library.
One of the major undertakings with Python 3 was a reorganization of the standard library to remove old or
supplanted modules and reorganize some of the existing modules. As a result, roughly 100 modules that exist in
Python 2 no longer exist in Python 3. See https://www.python.org/dev/peps/pep-3108/ and https://www.python.
org/dev/peps/pep-0004/ for more information. For suggestions on how to handle this, see https://pythonhosted.
org/six/#module-six.moves or http://python3porting.com/stdlib.html.
Instead of directly importing the deprecated module, either use six.moves or a conditional import.
if sys.version_info[0] >= 3:
from io import StringIO
else:
from cStringIO import StringIO
This checker will assume any imports that happen within a conditional or a try/except block are valid.
• A new Python 3 checker was added to warn about accessing deprecated functions on the string module. Python 3
removed functions that were duplicated from the builtin str class. See https://docs.python.org/2/library/string.
html#deprecated-string-functions for more information.
import string
print(string.upper('hello world!'))
Instead of using string.upper, call the upper method directly on the string object.
"hello world!".upper()
• A new Python 3 checker was added to warn about calling str.translate with the removed deletechars
parameter. str.translate is frequently used as a way to remove characters from a string.
Unfortunately, there is not an idiomatic way of writing this call in a 2and3 compatible way. If this code is not in
the critical path for your application and the use of translate was a premature optimization, consider using
re.sub instead:
import re
chars_to_remove = re.compile('[low]')
chars_to_remove.sub('', 'hello world')
If this code is in your critical path and must be as fast as possible, consider declaring a helper method that varies
based upon Python version.
if six.PY3:
def _remove_characters(text, deletechars):
return text.translate({ord(x): None for x in deletechars})
else:
def _remove_characters(text, deletechars):
return text.translate(None, deletechars)
• A new refactoring check was added, consider-using-ternary, which is emitted when pylint encounters
constructs which were used to emulate ternary statement before it was introduced in Python 2.5.
• A new refactoring check was added, trailing-comma-tuple, which is emitted when pylint finds an one-
element tuple, created by a stray comma. This can suggest a potential problem in the code and it is recommended
to use parantheses in order to emphasise the creation of a tuple, rather than relying on the comma itself.
The warning is emitted for such a construct:
a = 1,
a = (1, )
• Two new check were added for detecting an unsupported operation over an instance,
unsupported-assignment-operation and unsupported-delete-operation. The first
one is emitted whenever an object does not support item assignment, while the second is emitted when an
object does not support item deletion:
class A:
pass
instance = A()
instance[4] = 4 # unsupported-assignment-operation
del instance[4] # unsupported-delete-operation
• A new check was added, relative-beyond-top-level, which is emitted when a relative import tries to
access too many levels in the current package.
• A new check was added, trailing-newlines, which is emitted when a file has trailing new lines.
• invalid-length-returned check was added, which is emitted when a __len__ implementation does
not return a non-negative integer.
• There is a new extension, pylint.extensions.mccabe, which can be used for computing the McCabe
complexity of classes and functions.
You can enable this extension through --load-plugins=pylint.extensions.mccabe
• A new check was added, used-prior-global-declaration. This is emitted when a name is used prior
a global declaration, resulting in a SyntaxError in Python 3.6.
• A new message was added, assign-to-new-keyword. This is emitted when used name is known to
become a keyword in future Python release. Assignments to keywords would result in SyntaxError after
switching to newer interpreter version.
• We don’t emit by default no-member if we have opaque inference objects in the inference results
This is controlled through the new flag --ignore-on-opaque-inference, which is by default True. The
inference can return multiple potential results while evaluating a Python object, but some branches might not be
evaluated, which results in partial inference. In that case, it might be useful to still emit no-member and other
checks for the rest of the inferred objects.
• Namespace packages are now supported by pylint. This includes both explicit namespace packages and implicit
namespace packages, supported in Python 3 through PEP 420.
• A new option was added, --analyse-fallback-block.
This can be used to support both Python 2 and 3 compatible import block code, which means that the import
block might have code that exists only in one or another interpreter, leading to false positives when analysed.
By default, this is false, you can enable the analysis for both branches using this flag.
• ignored-argument-names option is now used for ignoring arguments for unused-variable check.
This option was used for ignoring arguments when computing the correct number of arguments a function
should have, but for handling the arguments with regard to unused-variable check, dummy-variables-rgx was
used instead. Now, ignored-argument-names is used for its original purpose and also for ignoring the matched
arguments for the unused-variable check. This offers a better control of what should be ignored and how. Also,
the same option was moved from the design checker to the variables checker, which means that the option now
appears under the [VARIABLES] section inside the configuration file.
• A new option was added, redefining-builtins-modules, for controlling the modules which can rede-
fine builtins, such as six.moves and future.builtins.
• A new option was added, ignore-patterns, which is used for building a blacklist of directories and files
matching the regex patterns, similar to the ignore option.
• The reports are now disabled by default, as well as the information category warnings.
• arguments-differ check was rewritten to take in consideration keyword only parameters and variadics.
Now it also complains about losing or adding capabilities to a method, by introducing positional or keyword
variadics. For instance, pylint now complains about these cases:
class Parent(object):
class Child(Parent):
• redefined-outer-name is now also emitted when a nested loop’s target variable is the same as an outer
loop.
• relax character limit for method and function names that starts with _. This will let people to use longer
descriptive names for methods and functions with a shorter scope (considered as private). The same idea applies
to variable names, only with an inverse rule: you want long descriptive names for variables with bigger scope,
like globals.
• Add InvalidMessageError exception class and replace assert in pylint.utils with raise
InvalidMessageError.
• UnknownMessageError (formerly UnknownMessage) and EmptyReportError (formerly
EmptyReport) are now provided by the new pylint.exceptions submodule instead of pylint.
utils as before.
• We now support inline comments for comma separated values in the configurations
For instance, you can now use the # sign for having comments inside comma separated values, as seen below:
disable=no-member,
# Don't care about it for now
bad-indentation # No need for this
class Contribution:
def __init__(self, name, email, date):
self.name = name
self.mail = mail
self.date = date
for c in contributions:
print(c.email) # Oups
pylint will now warn that there is a chance of having a typo, suggesting new names that could be used instead.
$ pylint a.py
E: 8,10: Instance of 'Contribution' has no 'email' member; maybe 'mail'?
The behaviour is controlled through the --missing-member-hint option. Other options that come with
this change are --missing-member-max-choices for choosing the total number of choices that should
be picked in this situation and --missing-member-hint-distance, which specifies a metric for com-
puting the distance between the names (this is based on Levenshtein distance, which means the lower the number,
the more pickier the algorithm will be).
• PyLinter.should_analyze_file has a new parameter, is_argument, which specifies if the given
path is a pylint argument or not.
should_analyze_file is called whenever pylint tries to determine if a file should be analyzed, de-
faulting to files with the .py extension, but this function gets called only in the case where the said file
is not passed as a command line argument to pylint. This usually means that pylint will analyze a file,
even if that file has a different extension, as long as the file was explicitly passed at command line. Since
should_analyze_file cannot be overridden to handle all the cases, the check for the provenience of files
was moved into should_analyze_file. This means we now can write something similar with this exam-
ple, for ignoring every file respecting the desired property, disregarding the provenience of the file, being it a
file passed as CLI argument or part of a package.
class CustomPyLinter(PyLinter):
class CustomRun(Run):
LinterClass = CustomPyLinter
CustomRun(sys.argv[1:])
• Imports aliased with underscore are skipped when checking for unused imports.
• bad-builtin and redefined-variable-type are now extensions, being disabled by default. They
can be enabled through: --load-plugins=pylint.extensions.redefined_variable_type,
pylint.extensions.bad_builtin
– Imports checker supports new switch allow-wildcard-with-all which disables warning on wild-
card import when imported module defines __all__ variable.
• differing-param-doc is now used for the differing part of the old missing-param-doc, and
differing-type-doc for the differing part of the old missing-type-doc.
• Fix a false positive of redundant-returns-doc, occurred when the documented function was using yield
instead of return.
• Fix a false positive of missing-param-doc and missing-type-doc, occurred when a class docstring
uses the For the parameters, see magic string but the class __init__ docstring does not, or vice
versa.
• Added proper exception type inference for missing-raises-doc. Now:
def my_func():
""""My function."""
ex = ValueError('foo')
raise ex
will properly be flagged for missing documentation of :raises ValueError: instead of :raises ex:,
among other scenarios.
• Fix false positives of missing-[raises|params|type]-doc due to not recognizing valid keyword syn-
onyms supported by Sphinx.
• More thorough validation in MessagesStore.register_messages() to detect conflicts between a new
message and any existing message id, symbol, or old_names.
• We now support having plugins that shares the same name and with each one providing options.
A plugin can be logically split into multiple classes, each class providing certain capabilities, all of them being
tied under the same name. But when two or more such classes are also adding options, then pylint crashed,
since it already added the first encountered section. Now, these should work as expected.
class DummyPlugin1(BaseChecker):
name = 'dummy_plugin'
msgs = {'I9061': ('Dummy short desc 01', 'dummy-message-01', 'Dummy long desc
˓→')}
options = (
('dummy_option_1', {
'type': 'string',
'metavar': '<string>',
'help': 'Dummy option 1',
}),
)
class DummyPlugin2(BaseChecker):
(continues on next page)
options = (
('dummy_option_2', {
'type': 'string',
'metavar': '<string>',
'help': 'Dummy option 2',
}),
)
def register(linter):
linter.register_checker(DummyPlugin1(linter))
linter.register_checker(DummyPlugin2(linter))
• We do not yield unused-argument for singledispatch implementations and do not warn about
function-redefined for multiple implementations with same name.
@singledispatch
def f(x):
return 2*x
@f.register(str)
def _(x):
return -1
@f.register(int)
@f.register(float)
def _(x):
return -x
• unused-variable checker has new functionality of warning about unused variables in global module
namespace. Since globals in module namespace may be a part of exposed API, this check is disabled by default.
For enabling it, set allow-global-unused-variables option to false.
• Fix a false-positive logging-format-interpolation message, when format specifications are used in
formatted string. In general, these operations are not always convertible to old-style formatting used by logging
module.
• Added a new switch single-line-class-stmt to allow single-line declaration of empty class bodies
(as seen in the example below). Pylint won’t emit a multiple-statements message when this option is
enabled.
– too-many-format-args and too-few-format-args are emitted correctly (or not emitted at all, when exact
count of elements in RHS cannot be inferred) when starred expressions are used in RHS tuple. For ex-
ample, code block as shown below detects correctly that the used tuple has in fact three elements, not
two.
• cyclic-import checker supports local disable clauses. When one of cycle imports was done in scope where
• pylint-gui was removed, because it was deemed unfit for being included in pylint. It had a couple of bugs
and misfeatures, its usability was subpar and since its development was neglected, we decided it is best to move
on without it.
• The HTML reporter was removed, including the --output-format=html option. It was lately a second
class citizen in Pylint, being mostly neglected. Since we now have the JSON reporter, it can be used as a basis
for building more prettier HTML reports than what Pylint can currently generate. This is part of the effort of
removing cruft from Pylint, by removing less used features.
• The --files-output option was removed. While the same functionality cannot be easily replicated, the
JSON reporter, for instance, can be used as a basis for generating the messages per each file.
• --required-attributes option was removed.
• --ignore-iface-methods option was removed.
• The --optimize-ast flag was removed.
The option was initially added for handling pathological cases, such as joining too many strings using the
addition operator, which was leading pylint to have a recursion error when trying to figure out what the string
was. Unfortunately, we decided to ignore the issue, since the pathological case would have happen when the
code was parsed by Python as well, without actually reaching the runtime step and as such, we decided to
remove the error altogether.
• epylint.py_run’s script parameter was removed.
Now epylint.py_run is always using the underlying epylint.lint method from the current interpreter.
This avoids some issues when multiple instances of pylint are installed, which means that epylint.py_run
might have ran a different epylint script than what was intended.
Release 1.6.0
Date 2016-07-07
Nothing major.
• trailing-newlines check was added, which is emitted when a file has trailing newlines.
• invalid-length-returned check was added, which is emitted when the __len__ special method re-
turns something else than a non-negative number. For instance, this example is triggering it:
class Container(object):
def __len__(self):
return self._items # Oups, forgot to call len() over it.
• Add a new check to the check_docs extension for looking for duplicate constructor parameters in a class con-
structor docstring or in a class docstring.
The check multiple-constructor-doc is emitted when the parameter is documented in both places.
• We added a new extension plugin, pylint.extensions.mccabe, which can be used for warning about
the complexity in the code.
You can enable it as in:
• Add the ability to ignore files based on regex matching, with the new --ignore-patterns option.
Rather than clobber the existing ignore option, we decided to have a separate option for it. For instance, for
ignoring all the test files, we can now use:
• We added a new option, redefining-builtins-modules, which is used for defining the modules which
can redefine builtins. pylint will emit an error when a builtin is redefined, such as defining a variable called
next. But in some cases, the builtins can be redefined in the case they are imported from other places, different
than the builtins module, such is the case for six.moves, which contains more forward-looking functions:
$ cat a.py
# Oups, now pylint emits a redefined-builtin message.
from six.moves import open
$ pylint a.py --redefining-builtins-modules=six.moves
• Fixed a bug where the top name of a qualified import was detected as an unused variable.
• We don’t warn about invalid-sequence-index if the indexed object has unknown base classes, that
Pylint cannot deduce.
disable=no-member,
# Don't like this check
bad-indentation
try:
import urllib.request as request
except ImportError:
import urllib2 as request
In the case where pylint can not find one import from the except branch, then it will emit an
import-error, but this gets cumbersome when trying to write compatible code for both Python ver-
sions. As such, we don’t check these blocks by default, but the analysis can be enforced by using the new
--analyse-fallback-block flag.
• reimported is emitted when the same name is imported from different module, as in:
• The HTML support was deprecated and will be eventually removed in Pylint 1.7.0.
This feature was lately a second class citizen in Pylint, being often neglected and having a couple of bugs. Since
we now have the JSON reporter, this can be used as a basis for more prettier HTML outputs than what Pylint
can currently offer.
• The --files-output option was deprecated and will be eventually removed in Pylint 1.7.0.
• The --optimize-ast option was deprecated and will be eventually removed in Pylint 1.7.0.
The option was initially added for handling pathological cases, such as joining too many strings using the
addition operator, which was leading pylint to have a recursion error when trying to figure out what the string
was. Unfortunately, we decided to ignore the issue, since the pathological case would have happen when the
code was parsed by Python as well, without actually reaching the runtime step and as such, we will remove the
option in the future.
• The check_docs extension is now deprecated. The extension is still available under the docparams name,
so this should work:
The old name is still kept for backward compatibility, but it will be eventually removed.
• None yet
The "Changelog" contains all nontrivial changes to Pylint for the current version.
Close #3119
• Require astroid >= 2.3 to avoid any compatibility issues.
• Added --list-msgs-enabled command to list all enabled and disabled messages given the current RC
file and command line arguments.
• try-except-raise checker now handles multilevel inheritance hirerachy for exceptions correctly.
Close #2484
• Add a new check, simplifiable-if-expression for expressions like True if cond else
False.
Close #2487
• too-few-public-methods is not reported for typing.NamedTuple
Close #2459
• `too-few-public-methods is not reported for dataclasses created with options.
Close #2488
• Remove wrong modules from ’bad-python3-import’.
Close #2453
• The json reporter prints an empty list when no messages are emitted
Close #2446
• Add a new check, duplicate-string-formatting-argument
This new check is emitted whenever a duplicate string formatting argument is found.
Close #497
• assignment-from-no-return is not emitted for coroutines.
Close #1715
• Report format string type mismatches.
• consider-using-ternary and simplified-boolean-expression no longer emit for sequence
based checks
Close #2473
• Handle AstroidSyntaxError when trying to import a module.
Close #2313
• Allow __module__ to be redefined at a class level. Close #2451
• pylint used to emit a unused-variable error if unused import was found in the function. Now instead
of unused-variable, unused-import is emitted.
Close #2421
• Handle asyncio.coroutine when looking for not-an-iterable check.
Close #996
• The locally-enabled check is gone.
Close #2442
• Infer decorated methods when looking for method-hidden
Close #2369
• Pick the latest value from the inferred values when looking for raising-non-exception
Close #2431
• Extend the TYPE_CHECKING guard to TYPE_CHECKING name as well, not just the attribute
Close #2411
• Ignore import x.y.z as z cases for checker useless-import-alias.
Close #2309
• Fix false positive undefined-variable and used-before-assignment with nonlocal keyword us-
age.
Close #2049
• Stop protected-access exception for missing class attributes
• Don’t emit assignment-from-no-return for decorated function nodes
Close #2385
• unnecessary-pass is now also emitted when a function or class contains only docstring and pass statement.
In Python, stubbed functions often have a body that contains just a single pass statement, indicating
that the function doesn’t do anything. However, a stubbed function can also have just a docstring,
and function with a docstring and no body also does nothing.
Close #2208
• duplicate-argument-name is emitted for more than one duplicate argument per function
Close #1712
• Allow double indentation levels for more distinguishable indentations
Close #741
• Consider tuples in exception handler for try-except-raise. Close #2389
• Fix astroid.ClassDef check in checkers.utils.is_subclass_of
• Fix wildcard imports being ignored by the import checker
• Fix external/internal distinction being broken in the import graph
• Fix wildcard import check not skipping __init__.py
Close #2430
• Add new option to logging checker, logging_format_style
• Fix –ignore-imports to understand multi-line imports
Close #1422 Close #2019
• Add a new check ’implicit-str-concat-in-sequence’ to spot string concatenation inside lists, sets & tuples.
• literal-comparison is now emitted for 0 and 1 literals.
Close #2311
• Can specify a default docstring type for when the check cannot guess the type
Close #1169
• Add a new warning, ’logging-fstring-interpolation’, emitted when f-string is used within logging function
calls.
Close #1998
• Don’t show ’useless-super-delegation’ if the subclass method has different type annotations.
Close #1923
• Add unhashable-dict-key check.
Closes #586
• Don’t warn that a global variable is unused if it is defined by an import
Close #1453
• Skip wildcard import check for __init__.py.
Close #2026
• The Python 3 porting mode can now run with Python 3 as well.
• too-few-public-methods is not emitted for dataclasses.
Close #1793
• New verbose mode option, enabled with –verbose command line flag, to display of extra non-checker-
related output. It is disabled by default.
Close #1863
• undefined-loop-variable takes in consideration non-empty iterred objects before emitting
Close #2039
• Add support for numpydoc optional return value names.
Close #2030
• singleton-comparison accounts for negative checks
Close #2037
• Add a check consider-using-in for comparisons of a variable against multiple values with "==" and "or"s
instead of checking if the variable is contained "in" a tuple of those values.
Close #1977
• defaultdict and subclasses of dict are now handled for dict-iter-* checks
Close #2005
• logging-format-interpolation also emits when f-strings are used instead of % syntax.
Close #1788
• Don’t trigger misplaced-bare-raise when the raise is in a finally clause
Close #1924
• Add a new check, possibly-unused-variable.
This is similar to unused-variable, the only difference is that it is emitted when we detect a locals() call in
the scope of the unused variable. The locals() call could potentially use the said variable, by consuming
all values that are present up to the point of the call. This new check allows to disable this error when the
user intentionally uses locals() to consume everything.
Close #1909.
• Protocol checks (not-a-mapping, not-an-iterable and co.) aren’t emitted on classes with dynamic
getattr
• Added a new warning, ’bad-thread-instantiation’
This message is emitted when the threading.Thread class does not receive the target argument, but
receives just one argument, which is by default the group parameter.
Close #1327
• In non-quiet mode, absolute path of used config file is logged to standard error. Close #1519
• Raise meaningful exception for invalid reporter class being selected
When unknown reporter class will be selected as Pylint reporter, meaningful error message would
be raised instead of bare ImportError or AttribueError related to module or reporter class
being not found. Close #1388
• Added a new Python 3 check for accessing removed functions from itertools like izip or
ifilterfalse
• Added a new Python 3 check for accessing removed fields from the types module like
UnicodeType or XRangeType
• Added a new Python 3 check for declaring a method next that would have been treated as an
iterator in Python 2 but a normal function in Python 3.
• Added a new key-value pair in json output. The key is message-id and the value is the message
id. Close #1512
• Added a new Python 3.0 check for raising a StopIteration inside a generator. The check about raising
a StopIteration inside a generator is also valid if the exception raised inherit from StopIteration.
Close #1385
• Added a new warning, raising-format-tuple, to detect multi-argument exception construc-
tion instead of message string formatting.
• Added a new check for method of logging module that concatenate string via + operator Close #1479
• Added parameter for limiting number of suggestions in spellchecking checkers
• Fix a corner-case in consider-using-ternary checker.
When object A used in X and A or B was falsy in boolean context, Pylint incorrectly emitted
non-equivalent ternary-based suggestion. After a change message is correctly not emitted for this
case. Close #1559
• Added suggestion-mode configuration flag. When flag is enabled, informational message is
emitted instead of cryptic error message for attributes accessed on c-extensions. Close #1466
• Fix a false positive useless-super-delegation message when parameters default values are
different from those used in the base class. Close #1085
• Disabling ’wrong-import-order’, ’wrong-import-position’, or ’ungrouped-imports’ for a single line
now prevents that line from triggering violations on subsequent lines.
Close #1336
• Added a new Python check for inconsistent return statements inside method or function. Close
#1267
• Fix superfluous-parens false positive related to handling logical statements involving in
operator.
Close #574
• function-redefined message is no longer emitted for functions and methods which names
matches dummy variable name regular expression. Close #1369
• Fix missing-param-doc and missing-type-doc false positives when mixing Args and
Keyword Args in Google docstring. Close #1409
• Fix missing-docstring false negatives when modules, classes, or methods consist of com-
pound statements that exceed the docstring-min-length
• Fix useless-else-on-loop false positives when break statements are deeply nested inside
loop. Close #1661
• Fix no wrong-import-order message emitted on ordering of first and third party libraries.
With this fix, pylint distinguishes third and first party modules when checking import order. Close
#1702
• Fix pylint disable=fixme directives ignored for comments following the last statement in a
file. Close #1681
• Fix line-too-long message deactivated by wrong disable directive. The directive
disable=fixme doesn’t deactivate anymore the emission of line-too-long message for
long commented lines. Close #1741
• If the rcfile specified on the command line doesn’t exist, then an IOError exception is raised. Close
#1747
• Fix the wrong scope of the disable= directive after a commented line. For example when a
disable=line-too-long directive is at the end of a long commented line, it no longer disables
the emission of line-too-long message for lines that follow. Close #1742
Close #1351
• Split the ’missing or differing’ in parameter documentation in different error. ’differing-param-doc’ covers
the differing part of the old ’missing-param-doc’, and ’differing-type-doc’ covers the differing part of the old
’missing-type-doc’
Close #1342
• Added a new error, ’used-prior-global-declaration’, which is emitted when a name is used prior a global decla-
ration in a function. This causes a SyntaxError in Python 3.6
Close #1257
• The protocol checks are emitting their messages when a special method is set to None.
Close #1263
• Properly detect if imported name is assigned to same name in different scope.
Close #636, #848, #851, and #900
• Require one space for annotations with type hints, as per PEP 8.
• ’trailing-comma-tuple’ check was added
This message is emitted when pylint finds an one-element tuple, created by a stray comma. This can suggest a
potential problem in the code and it is recommended to use parantheses in order to emphasise the creation of a
tuple, rather than relying on the comma itself.
• Don’t emit not-callable for instances with unknown bases.
Close #1213
• Treat keyword only arguments the same as positional arguments with regard to unused-argument check
• Don’t try to access variables defined in a separate scope when checking for protected-access
• Added new check to detect incorrect usage of len(SEQUENCE) inside test conditions.
• Added new extension to detect comparisons against empty string constants
• Added new extension to detect comparisons of integers against zero
• Added new error conditions for ’bad-super-call’
Now detects super(type(self), self) and super(self.__class__, self) which can lead to
recursion loop in derived classes.
• PyLinter.should_analyze_file has a new optional parameter, called is_argument
Close #1079
• Add attribute hints for missing members
Closes #1035
• Add a new warning, ’redefined-argument-from-local’
Closes #649
• Support inline comments for comma separated values in the config file
Closes #1024
• epylint.py_run’s script parameter was removed.
• epylint.py_run now uses shell=False for running the underlying process.
Closes #441
• Added a new error, ’relative-beyond-top-level’, which is emitted when a relative import was attempted beyond
the top level package.
Closes issue #588.
• Added a new warning, ’unsupported-assignment-operation’, which is emitted when item assignment is tried on
an object which doesn’t have this ability. Closes issue #591.
• Added a new warning, ’unsupported-delete-operation’, which is emitted when item deletion is tried on an object
which doesn’t have this ability. Closes issue #592.
• Fix a false positive of ’redundant-returns-doc’, occurred when the documented function was using yield instead
of return.
Closes issue #984.
• Fix false positives of ’missing-[raises|params|type]-doc’ due to not recognizing keyword synonyms supported
by Sphinx.
• Added a new refactoring message, ’consider-merging-isinstance’, which is emitted whenever we can detect that
consecutive isinstance calls can be merged together.
Closes issue #968
• Fix a false positive of ’missing-param-doc’ and ’missing-type-doc’, occurred when a class docstring uses the
’For the parameters, see’ magic string but the class __init__ docstring does not, or vice versa.
• redefined-outer-name is now also emitted when a nested loop’s target variable is the same as a target variable in
an outer loop.
Closes issue #911.
• Added proper exception type inference for ’missing-raises-doc’.
• Added InvalidMessageError exception class to replace asserts in pylint.utils.
• More thorough validation in MessagesStore.register_messages() to avoid one message accidentally overwriting
another.
• InvalidMessageError, UnknownMessage, and EmptyReport exceptions are moved to the new pylint.exceptions
submodule.
• UnknownMessage and EmptyReport are renamed to UnknownMessageError and EmptyReportError.
• Warnings ’missing-returns-type-doc’ and ’missing-yields-type-doc’ have each been split into two warnings -
’missing-[return|yield]-doc’ and ’missing-[return|yield]-type-doc’.
• Added epytext support to docparams extension.
Closes #1029.
• Support having plugins with the same name and with options defined
Closes #1018
• Sort configuration options in a section
Closes #1087
• Added a new Python 3 warning around implementing ’__div__’, ’__idiv__’, or ’__rdiv__’ as those methods are
phased out in Python 3.
• Added a new warning, ’overlapping-except’, which is emitted when two exceptions in the same except-clause
are aliases for each other or one exceptions is an ancestor of another.
• Avoid crashing on ill-formatted strings when checking for string formatting errors.
• Added a new Python 3 warning for calling ’str.encode’ or ’str.decode’ with a non-text encoding.
• Added new coding convention message, ’single-string-used-for-slots’.
Closes #1166
• Added a new Python 3 check for accessing ’sys.maxint’ which was removed in Python 3 in favor of ’sys.maxsize’
• Added a new Python 3 check for bad imports.
• Added a new Python 3 check for accessing deprecated string functions.
• Do not warn about unused arguments or function being redefined in singledispatch registered implementations.
Closes #1032 and #1034
• Added refactoring message ’no-else-return’.
• Improve unused-variable checker to warn about unused variables in module scope.
Closes #919
• Ignore modules import as _ when checking for unused imports.
Closes #1190
• Improve handing of Python 3 classes with metaclasses declared in nested scopes.
Closes #1177
• Added refactoring message ’consider-using-ternary’.
Closes #1204
• Bug-fix for false-positive logging-format-interpolation‘ when format specifications are used in formatted string.
Fixes #572
• Added a new switch single-line-class-stmt to allow single-line declaration of empty class bodies.
Closes #738
• Protected access in form type(self)._attribute are now allowed.
Fixes #1031
• Let the user modify msg-template when Pylint is called from a Python script
Fixes #1269
• Imports checker supports new switch allow-wildcard-with-all which disables warning on wildcard
import when imported module defines __all__ variable.
Fixes #831
• too-many-format-args and too-few-format-args are emitted correctly when starred expression are used in RHS
tuple.
Fixes #957
• cyclic-import checker supports local disable clauses. When one of cycle imports was done in scope where
disable clause was active, cycle is not reported as violation.
Fixes #59
• Add a new option, ’redefining-builtins-modules’, for controlling the modules which can redefine builtins, such
as six.moves and future.builtins.
Close #464.
• ’reimported’ is emitted when the same name is imported from different module.
Close #162.
• Add a new recommendation checker, ’consider-iterating-dictionary’, which is emitted which is emitted when a
dictionary is iterated through .keys().
Close #699
• Use the configparser backport for Python 2
This fixes a problem we were having with comments inside values, which is fixed in Python 3’s configparser.
Close #828
• A new error was added, ’invalid-length-returned’, when the __len__ special method returned something else
than a non-negative number.
Close issue #557
• Switch to using isort internally for wrong-import-order.
Closes #879.
• check_docs extension can find constructor parameters in __init__.
Closes #887.
• Don’t warn about invalid-sequence-index if the indexed object has unknown base classes.
Closes #867
• Don’t crash when checking, for super-init-not-called, a method defined in an if block.
• Do not emit import-error or no-name-in-module for fallback import blocks by default.
Until now, we warned with these errors when a fallback import block (a TryExcept block that contained
imports for Python 2 and 3) was found, but this gets cumbersome when trying to write compatible code.
As such, we don’t check these blocks by default, but the analysis can be enforced by using the new
--analyse-fallback-block flag.
Close #769.
the intention was to disable them. The best example for this was in the context of running multiple processes,
each one of it having different enables / disables that affected the output.
Close #815
• Don’t consider bare and broad except handlers as ignoring NameError, AttributeError and similar exceptions, in
the context of checkers for these issues.
Closes issue #826
• Don’t crash if graphviz is not installed, instead emit a warning letting the user to know.
Closes issue #168.
• Accept only functions and methods for the deprecated-method checker.
This prevents a crash which can occur when an object doesn’t have .qname() method after the inference.
• Don’t emit super-on-old-class on classes with unknown bases. Closes issue #721.
• Allow statements in if or try blocks containing imports.
Closes issue #714.
• Obsolete options are not present by default in the generated configuration file. Closes issue #632.
• non-iterator-returned can detect classes with iterator-metaclasses. Closes issue #679.
• Add a new error, ’unsupported-membership-test’, emitted when value to the right of the ’in’ operator doesn’t
support membership test protocol (i.e. doesn’t define __contains__/__iter__/__getitem__)
• Add new errors, ’not-an-iterable’, emitted when non-iterable value is used in an iterating context (starargs, for-
statement, comprehensions, etc), and ’not-a-mapping’, emitted when non-mapping value is used in a mapping
context. Closes issue #563.
• Make ’no-self-use’ checker not emit a warning if there is a ’super()’ call inside the method. Closes issue #667.
• Add checker to identify multiple imports on one line. Closes issue #598.
• Fix unused-argument false positive when the "+=" operator is used. Closes issue #518.
• Don’t emit import-error for ignored modules. PyLint will not emit import errors for any import which is, or is a
subpackage of, a module in the ignored-modules list. Closes issue #223.
• Fix unused-import false positive when the import is used in a class assignment. Closes issue #475
• Add a new error, ’not-context-manager’, emitted when something that doesn’t implement __enter__ and
__exit__ is used in a with statement.
• Add a new warning, ’confusing-with-statement’, emitted by the base checker, when an ambiguous looking with
statement is used. For example with open() as first, second which looks like a tuple assignment but is actually 2
context managers.
• Add a new warning, ’duplicate-except’, emitted when there is an exception handler which handles an exception
type that was handled before. Closes issue #485.
• A couple of warnings got promoted to errors, since they could uncover potential bugs in the code. These warn-
ings are: assignment-from-none, unbalanced-tuple-unpacking, unpacking-non-sequence, non-iterator-returned.
Closes issue #388.
• Allow ending a pragma control with a semicolon. In this way, users can continue a pragma control with a reason
for why it is used, as in # pylint: disable=old-style-class;reason=.... Closes issue #449.
• –jobs can be used with –load-plugins now. Closes issue #456.
• Improve the performance of –jobs when dealing only with a package name. Closes issue #479.
• Don’t emit an unused-wildcard-import when the imported name comes from another module and it is in fact a
__future__ name.
• The colorized reporter now works on Windows. Closes issue #96.
• Remove pointless-except warning. It was previously disabled by default and it wasn’t very useful. Closes issue
#506.
• Fix a crash on Python 3 related to the string checker, which crashed when it encountered a bytes string with a
.format method called.
• Don’t warn about no-self-use for builtin properties.
• Fix a false positive for bad-reversed-sequence, when a subclass of a dict provides a __reversed__ method.
• Change the default no-docstring-rgx so missing-docstring isn’t emitted for private functions.
• Don’t emit redefined-outer-name for __future__ directives. Closes issue #520.
• Provide some hints for the bad-builtin message. Closes issue #522.
• When checking for invalid arguments to a callable, in typecheck.py, look up for the __init__ in case the found
__new__ comes from builtins.
Since the __new__ comes from builtins, it will not have attached any information regarding what parameters
it expects, so the check will be useless. Retrieving __init__ in that case will at least detect a couple of false
negatives. Closes issue #429.
• Don’t emit no-member for classes with unknown bases.
Since we don’t know what those bases might add, we simply ignore the error in this case.
• Lookup in the implicit metaclass when checking for no-member, if the class in question has an implicit meta-
class, which is True for new style classes. Closes issue #438.
• Add two new warnings, duplicate-bases and inconsistent-mro.
duplicate-bases is emitted when a class has the same bases listed more than once in its bases definition, while
inconsistent-mro is emitted when no sane mro hierarchy can be determined. Closes issue #526.
• Remove interface-not-implemented warning. Closes issue #532.
• Remove the rest of interface checks: interface-is-not-class, missing-interface-method, unresolved-interface. The
reason is that its better to start recommending ABCs instead of the old Zope era of interfaces. One side effect of
this change is that ignore-iface-methods becomes a noop, it’s deprecated and it will be removed at some time.
• Emit a proper deprecation warning for reporters.BaseReporter.add_message.
The alternative way is to use handle_message. add_message will be removed in Pylint 1.6.
• Added new module ’extensions’ for optional checkers with the test directory ’test/extensions’ and documenta-
tion file ’doc/extensions.rst’.
• Added new checker ’extensions.check_docs’ that verifies parameter documention in Sphinx, Google, and
Numpy style.
• Detect undefined variable cases, where the "definition" of an undefined variable was in del statement. Instead
of emitting used-before-assignment, which is totally misleading, it now emits undefined-variable. Closes issue
#528.
• Don’t emit attribute-defined-outside-init and access-member-before-definition for mixin classes. Actual errors
can occur in mixin classes, but this is controlled by the ignore-mixin-members option. Closes issue #412.
• Improve the detection of undefined variables and variables used before assignment for variables used as default
arguments to function, where the variable was first defined in the class scope. Closes issue #342 and issue #404.
• Add a new warning, ’unexpected-special-method-signature’, which is emitted when a special method (dunder
method) doesn’t have the expected signature, which can lead to actual errors in the application code. Closes
issue #253.
• Remove ’bad-context-manager’ due to the inclusion of ’unexpected-special-method-signature’.
• Don’t emit no-name-in-module if the import is guarded by an ImportError, Exception or a bare except clause.
• Don’t emit no-member if the attribute access node is protected by an except handler, which handles AttributeEr-
ror, Exception or it is a bare except.
• Don’t emit import-error if the import is guarded by an ImportError, Exception or a bare except clause.
• Don’t emit undefined-variable if the node is guarded by a NameError, Exception or bare except clause.
• Add a new warning, ’using-constant-test’, which is emitted when a conditional statement (If, IfExp) uses a test
which is always constant, such as numbers, classes, functions etc. This is most likely an error from the user’s
part. Closes issue #524.
• Don’t emit ’raising-non-exception’ when the exception has unknown bases. We don’t know what those bases
actually are and it’s better to assume that the user knows what he is doing rather than emitting a message which
can be considered a false positive.
• Look for a .pylintrc configuration file in the current folder, if pylintrc is not found. Dotted pylintrc files will not
be searched in the parents of the current folder, as it is done for pylintrc.
• Add a new error, ’invalid-unary-type-operand’, emitted when an unary operand is used on something which
doesn’t support that operation (for instance, using the unary bitwise inversion operator on an instance which
doesn’t implement __invert__).
• Take in consideration differences between arguments of various type of functions (classmethods, staticmethods,
properties) when checking for arguments-differ. Closes issue #548.
• astroid.inspector was moved to pylint.pyreverse, since it belongs there and it doesn’t need to be in astroid.
• astroid.utils.LocalsVisitor was moved to pylint.pyreverse.LocalsVisitor.
• pylint.checkers.utils.excepts_import_error was removed. Use pylint.chekcers.utils.error_of_type instead.
• Don’t emit undefined-all-variables for nodes which can’t be inferred (YES nodes).
• yield-outside-func is also emitted for yield from.
• Add a new error, ’too-many-star-expressions’, emitted when there are more than one starred expression (*x) in
an assignment. The warning is emitted only on Python 3.
• Add a new error, ’invalid-star-assignment-target’, emitted when a starred expression (*x) is used as the lhs side
of an assignment, as in *x = [1, 2]. This is not a SyntaxError on Python 3 though.
• Detect a couple of objects which can’t be base classes (bool, slice, range and memoryview, which weren’t
detected until now).
• Add a new error for the Python 3 porting checker, import-star-module-level, which is used when a star import
is detected in another scope than the module level, which is an error on Python 3. Using this will emit a
SyntaxWarning on Python 2.
• Add a new error, ’star-needs-assignment-target’, emitted on Python 3 when a Starred expression (*x) is not used
in an assignment target. This is not caught when parsing the AST on Python 3, so it needs to be a separate check.
• Add a new error, ’unsupported-binary-operation’, emitted when two a binary arithmetic operation is executed
between two objects which don’t support it (a number plus a string for instance). This is currently disabled,
since the it exhibits way too many false positives, but it will be reenabled as soon as possible.
• New imported features from astroid into pyreverse: pyreverse.inspector.Project, pyre-
verse.inspector.project_from_files and pyreverse.inspector.interfaces.
These were moved since they didn’t belong in astroid.
• Enable misplaced-future for Python 3. Closes issue #580.
• Add a new error, ’nonlocal-and-global’, which is emitted when a name is found to be both nonlocal and global
in the same scope. Closes issue #581.
• ignored-classes option can work with qualified names (ignored-classes=optparse.Values) Closes issue #297.
• ignored-modules can work with qualified names as well as with Unix pattern matching for recursive ignoring.
Closes issues #244.
• Improve detection of relative imports in non-packages, as well as importing missing modules with a relative
import from a package.
• Don’t emit no-init if not all the bases from a class are known. Closes issue #604.
• –no-space-check option accepts empty-line as a possible option. Closes issue #541.
• –generate-rcfile generates by default human readable symbols for the –disable option. Closes issue #608.
• Improved the not-in-loop checker to properly detect more cases.
• Add a new error, ’continue-in-finally’, which is emitted when the continue keyword is found inside a finally
clause, which is a SyntaxError.
• The –zope flag is deprecated and it is slated for removal in Pylint 1.6.
The reason behind this removal is the fact that it’s a specialized flag and there are solutions for the original prob-
lem: use –generated-members with the members that causes problems when using Zope or add AST transforms
tailored to the zope project.
At the same time, –include-ids and –symbols will also be removed in Pylint 1.6. Closes issue #570.
• missing-module-attribute was removed and the corresponding CLI option, required-attributes, which is slated
for removal in Pylint 1.6.
• missing-reversed-argument was removed.
The reason behind this is that this kind of errors should be detected by the type checker for all the builtins and
not as a special case for the reversed builtin. This will happen shortly in the future.
• –comment flag is obsolete and it will be removed in Pylint 1.6.
• –profile flag is obsolete and it will be removed in Pylint 1.6.
• Add a new error, ’misplaced-bare-raise’.
The error is used when a bare raise is not used inside an except clause. This can generate a RuntimeError in
Python, if there are no active exceptions to be reraised. While it works in Python 2 due to the fact that the
exception leaks outside of the except block, it’s nevertheless a behaviour that a user shouldn’t depend upon,
since it’s not obvious to the reader of the code what exception will be raised and it will not be compatible with
Python 3 anyhow. Closes issue #633.
• Bring logilab-common’s ureports into pylint.reporters.
With this change, we moved away from depending on logilab-common, having in Pylint all the components that
were used from logilab-common. The API should be considered an implementation detail and can change at
some point in the future. Closes issue #621.
• reimported is emitted for reimported objects on the same line.
Closes issue #639.
• Abbreviations of command line options are not supported anymore.
Using abbreviations for CLI options was never considered to be a feature of pylint, this fact being only a side
effect of using optparse. As this was the case, using –load-plugin or other abbreviation for –load-plugins never
actually worked, while it also didn’t raise an error. Closes issue #424.
• Add a new error, ’nonlocal-without-binding’
The error is emitted on Python 3 when a nonlocal name is not bound to any variable in the parents scopes.
Closes issue #582.
• ’deprecated-module’ can be shown for modules which aren’t available. Closes issue #362.
• Don’t consider a class abstract if its members can’t be properly inferred.
This fixes a false positive related to abstract-class-instantiated. Closes issue #648.
• Add a new checker for the async features added by PEP 492.
• Add a new error, ’yield-inside-async-function’, emitted on Python 3.5 and upwards when the yield statement is
found inside a new coroutine function (PEP 492).
• Add a new error, ’not-async-context-manager’, emitted when an async context manager block is used with an
object which doesn’t support this protocol (PEP 492).
• Add a new convention warning, ’singleton-comparison’, emitted when comparison to True, False or None is
found.
• Don’t emit ’assigning-non-slot’ for descriptors. Closes issue #652.
• Add a new error, ’repeated-keyword’, when a keyword argument is passed multiple times into a function call.
This is similar with redundant-keyword-arg, but it’s mildly different that it needs to be a separate error.
• –enable=all can now be used. Closes issue #142.
• Add a new convention message, ’misplaced-comparison-constant’, emitted when a constant is placed in the left
hand side of a comparison, as in ’5 == func()’. This is also called Yoda condition, since the flow of code reminds
of the Star Wars green character, conditions usually encountered in languages with variabile assignments in
conditional statements.
• Add a new convention message, ’consider-using-enumerate’, which is emitted when code that uses range and
len for iterating is encountered. Closes issue #684.
• Added two new refactoring messages, ’no-classmethod-decorator’ and ’no-staticmethod-decorator’, which are
emitted when a static method or a class method is declared without using decorators syntax.
Closes issue #675.
• Add a new warning, ’intern-builtin’, emitted by the Python 3 porting checker, when the intern builtin is found.
Closes issue #473.
• Add support for editable installations.
• The HTML output accepts the –msg-template option. Patch by Dan Goldsmith.
• Add ’map-builtin-not-iterating’ (replacing ’implicit-map-evaluation’), ’zip-builtin-not-iterating’, ’range-builtin-
not-iterating’, and ’filter-builtin-not-iterating’ which are emitted by –py3k when the appropriate built-in is not
used in an iterating context (semantics taken from 2to3).
• Add a new warning, ’unidiomatic-typecheck’, emitted when an explicit typecheck uses type() instead of isin-
stance(). For example, type(x) == Y instead of isinstance(x, Y). Patch by Chris Rebert. Closes issue #299.
• Add support for combining the Python 3 checker mode with the –jobs flag (–py3k and –jobs). Closes issue
#467.
• Add a new warning for the Python 3 porting checker, ’using-cmp-argument’, emitted when the cmp argument
for the list.sort or sorted builtin is encountered.
• Make the –py3k flag commutative with the -E flag. Also, this patch fixes the leaks of error messages from the
Python 3 checker when the errors mode was activated. Closes issue #437.
• Added new options for controlling the loading of C extensions. By default, only C extensions from the stdlib
will be loaded into the active Python interpreter for inspection, because they can run arbitrary code on import.
The option –extension-pkg-whitelist can be used to specify modules or packages that are safe to load.
• Change default max-line-length to 100 rather than 80
• Drop BaseRawChecker class which were only there for backward compat for a while now
• Don’t try to analyze string formatting with objects coming from function arguments. Closes issue #373.
• Port source code to be Python 2/3 compatible. This drops the need for 2to3, but does drop support for Python
2.5.
• Each message now comes with a confidence level attached, and can be filtered base on this level. This allows to
filter out all messages that were emitted even though an inference failure happened during checking.
• Improved presenting unused-import message. Closes issue #293.
• Add new checker for finding spelling errors. New messages: wrong-spelling-in-comment, wrong-spelling-in-
docstring. New options: spelling-dict, spelling-ignore-words.
• Add new ’-j’ option for running checks in sub-processes.
• Added new checks for line endings if they are mixed (LF vs CRLF) or if they are not as expected. New messages:
mixed-line-endings, unexpected-line-ending-format. New option: expected-line-ending-format.
• ’dangerous-default-value’ no longer evaluates the value of the arguments, which could result in long error mes-
sages or sensitive data being leaked. Closes issue #282
• Fix a false positive with string formatting checker, when encountering a string which uses only position-based
arguments. Closes issue #285.
• Fix a false positive with string formatting checker, when using keyword argument packing. Closes issue #288.
• Proper handle class level scope for lambdas.
• Handle ’too-few-format-args’ or ’too-many-format-args’ for format strings with both named and positional
fields. Closes issue #286.
• Analyze only strings by the string format checker. Closes issue #287.
• Properly handle nested format string fields. Closes issue #294.
• Don’t emit ’attribute-defined-outside-init’ if the attribute was set by a function call in a defining method. Closes
issue #192.
• Properly handle unicode format strings for Python 2. Closes issue #296.
• Don’t emit ’import-error’ if an import was protected by a try-except, which excepted ImportError.
• Fix an ’unused-import’ false positive, when the error was emitted for all the members imported with ’from
import’ form. Closes issue #304.
• Don’t emit ’invalid-name’ when assigning a name in an ImportError handler. Closes issue #302.
• Don’t count branches from nested functions.
• Fix a false positive with ’too-few-format-args’, when the format strings contains duplicate manual position
arguments. Closes issue #310.
• fixme regex handles comments without spaces after the hash. Closes issue #311.
• Don’t emit ’unused-import’ when a special object is imported (__all__, __doc__ etc.). Closes issue #309.
• Look in the metaclass, if defined, for members not found in the current class. Closes issue #306.
• Don’t emit ’protected-access’ if the attribute is accessed using a property defined at the class level.
• Warn in Python 2 when calling an object’s next() method; Python 3 uses __next__() instead.
• Warn when assigning to __metaclass__ at a class scope; in Python 3 a metaclass is specified as an argument to
the ’class’ statement.
• Warn when performing parameter tuple unpacking; it is not supported in Python 3.
• ’abstract-class-instantiated’ is also emitted for Python 2. It was previously disabled.
• Add ’long-suffix’ error, emitted when encountering the long suffix on numbers.
• Add support for disabling a checker, by specifying an ’enabled’ attribute on the checker class.
• Add a new CLI option, –py3k, for enabling Python 3 porting mode. This mode will disable all other checkers
and will emit warnings and errors for constructs which are invalid or removed in Python 3.
• Add ’old-octal-literal’ to Python 3 porting checker, emitted when encountering octals with the old syntax.
• Add ’implicit-map-evaluation’ to Python 3 porting checker, emitted when encountering the use of map builtin,
without explicit evaluation.
• Do not let ImportError propagate from the import checker, leading to crash in some namespace package related
cases. Closes issue #203.
• Don’t emit ’pointless-string-statement’ for attribute docstrings. Closes issue #193.
• Use the proper mode for pickle when opening and writing the stats file. Closes issue #148.
• Don’t emit hidden-method message when the attribute has been monkey-patched, you’re on your own when you
do that.
• Only emit attribute-defined-outside-init for definition within the same module as the offended class, avoiding to
mangle the output in some cases.
• Don’t emit ’unnecessary-lambda’ if the body of the lambda call contains call chaining. Closes issue #243.
• Don’t emit ’missing-docstring’ when the actual docstring uses .format. Closes issue #281.
• Added support for enforcing multiple, but consistent name styles for different name types inside a single module;
based on a patch written by [email protected].
• Also warn about empty docstrings on overridden methods; contributed by [email protected].
• Also inspect arguments to constructor calls, and emit relevant warnings; contributed by [email protected].
• Added a new configuration option logging-modules to make the list of module names that can be checked for
’logging-not-lazy’ et. al. configurable; contributed by [email protected].
• ensure init-hooks is evaluated before other options, notably load-plugins (#166)
• Python 2.5 support restored: fixed small issues preventing pylint to run on python 2.5. Bitbucket issues #50 and
#62.
• bitbucket #128: pylint doesn’t crash when looking for used-before-assignment in context manager assignments.
• Add new warning, ’bad-reversed-sequence’, for checking that the reversed() builtin receive a sequence (im-
plements __getitem__ and __len__, without being a dict or a dict subclass) or an instance which implements
__reversed__.
• Mark file as a bad function when using python2 (closes #8).
• Add new warning ’bad-exception-context’, checking that raise ... from ... uses a proper exception context (None
or an exception).
• Enhance the check for ’used-before-assignment’ to look for ’nonlocal’ uses.
• Emit ’undefined-all-variable’ if a package’s __all__ variable contains a missing submodule (closes #126).
• Add a new warning ’abstract-class-instantiated’ for checking that abstract classes created with abc module and
with abstract methods are instantied.
• Do not warn about ’return-arg-in-generator’ in Python 3.3+.
• Do not warn about ’abstract-method’ when the abstract method is implemented through assignment (#155).
• Improve cyclic import detection in the case of packages, patch by Buck Golemon
• Add new warnings for checking proper class __slots__: invalid-slots-object and invalid-slots.
• Search for rc file in ~/.config/pylintrc if ~/.pylintrc doesn’t exists (#121)
• Don’t register the newstyle checker w/ python >= 3
• Fix unused-import false positive w/ augment assignment (#78)
• Fix access-member-before-definition false negative wrt aug assign (#164)
• Do not attempt to analyze non python file, eg .so file (#122)
• Add a new option for the multi-statement warning to allow single-line if statements.
• Add ’bad-context-manager’ error, checking that ’__exit__’ special method accepts the right number of argu-
ments.
• Run pylint as a python module ’python -m pylint’ (anatoly techtonik).
• Check for non-exception classes inside an except clause.
• epylint support options to give to pylint after the file to analyze and have basic input validation (bitbucket #53
and #54), patches provided by felipeochoa and Brian Lane.
• Added a new warning, ’non-iterator-returned’, for non-iterators returned by ’__iter__’.
• Add new checks for unpacking non-sequences in assignments (unpacking-non-sequence) as well as unbalanced
tuple unpacking (unbalanced-tuple-unpacking).
• useless-else-on-loop not emitted if there is a break in the else clause of inner loop (#117).
• don’t mark input as a bad function when using python3 (#110).
• badly-implemented-container caused several problems in its current implementation. Deactivate it until we have
something better. See #112 for instance.
• Use attribute regexp for properties in python3, as in python2
• Create the PYLINTHOME directory when needed, it might fail and lead to spurious warnings on import of
pylint.config.
• Fix setup.py so that pylint properly install on Windows when using python3
• Various documentation fixes and enhancements
• Fix issue #55 (false-positive trailing-whitespace on Windows)
• New warning bad-open-mode (W1501) for calls to open (or file) that specify invalid open modes (Original
implementation by Sasha Issayev).
• New warning old-style-class (C1001) for classes that do not have any base class.
• Add new name type ’class_attribute’ for attributes defined in class scope. By default, allow both const and
variable names.
• New warning trailing-whitespace (C0303) that warns about trailing whitespace.
• Added a new warning unpacking-in-except (W0712) about unpacking exceptions in handlers, which is unsup-
ported in Python 3.
• Add a configuration option for missing-docstring to optionally exempt short functions/methods/classes from the
check.
• Add the type of the offending node to missing-docstring and empty-docstring.
• New utility classes for per-checker unittests in testutils.py
• Do not warn about redefinitions of variables that match the dummy regex.
• Do not treat all variables starting with _ as dummy variables, only _ itself.
• Make the line-too-long warning configurable by adding a regex for lines for with the length limit should not be
enforced
• Do not warn about a long line if a pylint disable option brings it above the length limit
• Do not flag names in nested with statements as undefined.
• Added a new warning ’old-raise-syntax’ for the deprecated syntax raise Exception, args
• Support for PEP 3102 and new missing-kwoa (E1125) message for missing mandatory keyword argument (logi-
lab.org’s #107788)
• Fix spelling of max-branchs option, now max-branches
• Added a new base class and interface for checkers that work on the tokens rather than the syntax, and only
tokenize the input file once.
• Follow astng renaming to astroid
• bitbucket #37: check for unbalanced unpacking in assignments
• bitbucket #25: fix incomplete-protocol false positive for read-only containers like tuple
• bitbucket #16: fix False positive E1003 on Python 3 for argument-less super()
• bitbucket #6: put back documentation in source distribution
• bitbucket #15: epylint shouldn’t hang anymore when there is a large output on pylint’stderr
• bitbucket #7: fix epylint w/ python3
• bitbucket #3: remove string module from the default list of deprecated modules
• Make dot output for import graph predictable and not depend on ordering of strings in hashes. (patch by Torsten
Marek)
• Add hooks for import path setup and move pylint’s sys.path modifications into them. (patch by Torsten Marek)
• setuptools/easy_install support
• include a modified version of Maarten ter Huurne patch to avoid W0613 warning on arguments from overridden
method
• implement #5575 drop dumb W0704 message) by adding W0704 to ignored messages by default
• new W0108 message, checking for suspicious lambda (provided by Nathaniel Manista)
• fix W0631, false positive reported by Paul Hachmann
• fix #6951: false positive with W0104
• fix #6949
• patches by Mads Kiilerich:
• implement #4691, make pylint exits with a non zero return status if any messages other then Information are
issued
• fix #3711, #5626 (name resolution bug w/ decorator and class members)
• fix #6954
• –init-hook option to call arbitrary code necessary to set environment (eg sys.path) (#3156)
• One more Daniel’s patch fixing a command line option parsing problem, this’ll definitely be the DDrake release
:)
• fix #3184: crashes on "return" outside function
• fix #3205: W0704 false positive
• fix #3123: W0212 false positive on static method
• fix #2485: W0222 false positive
• fix #3259: when a message is explicitly enabled, check the checker emitting it is enabled
• new W0105 and W0106 messages extracted from W0104 (statement seems to have no effect) respectively when
the statement is actually string (that’s sometimes used instead of comments for documentation) or an empty
statement generated by a useless semicolon
• reclassified W0302 to C0302
• fix so that global messages are not anymore connected to the last analyzed module (close #10106)
• fix some bugs related to local disabling of messages
• fix cr/lf pb when generating the rc file on windows platforms
– the C0101 check with its min-name-length option has been removed (this can be specified in the regxp
after all...)
– W0103 and W0121 are now handled by the variables checker (W0103 is now W0603 and W0604 has been
splitted into different messages)
– W0131 and W0132 messages have been reclassified to C0111 and C0112 respectively
– new W0104 message on statement without effect
• regexp support for dummy-variables (dummy-variables-rgx option replace dummy-variables) (implements
#10027)
• better global statement handling, see W0602, W0603, W0604 messages (implements #10344 and #10236)
• –debug-mode option, disabling all checkers without error message and filtering others to only display error
• fixed some R0201 (method could be a function) false positive
• some fixes to handle fixes in common 0.9.1 (should however still working with common 0.9.0, even if upgrade
is recommended)
• do not print redefinition warning for function/class/method defined in mutually exclusive branches
Symbols -name-group=<name1:name2:...,...>
-argument-naming-style=<style> command line option, 21
command line option, 20 -variable-naming-style=<style>
-argument-rgx=<regex> command line option, 20
command line option, 20 -variable-rgx=<regex>
-attr-naming-style=<style> command line option, 20
command line option, 20
-attr-rgx=<regex> C
command line option, 20 command line option
-class-attribute-naming-style=<style> -argument-naming-style=<style>, 20
command line option, 20 -argument-rgx=<regex>, 20
-class-attribute-rgx=<regex> -attr-naming-style=<style>, 20
command line option, 20 -attr-rgx=<regex>, 20
-class-naming-style=<style> -class-attribute-naming-style=<style>,
command line option, 20 20
-class-rgx=<regex> -class-attribute-rgx=<regex>, 20
command line option, 20 -class-naming-style=<style>, 20
-const-naming-style=<style> -class-rgx=<regex>, 20
command line option, 20 -const-naming-style=<style>, 20
-const-rgx=<regex> -const-rgx=<regex>, 20
command line option, 20 -function-naming-style=<style>, 20
-function-naming-style=<style> -function-rgx=<regex>, 20
command line option, 20 -include-naming-hint=y|n, 21
-function-rgx=<regex> -inlinevar-naming-style=<style>, 20
command line option, 20 -inlinevar-rgx=<regex>, 20
-include-naming-hint=y|n -method-naming-style=<style>, 20
command line option, 21 -method-rgx=<regex>, 20
-inlinevar-naming-style=<style> -module-naming-style=<style>, 19
command line option, 20 -module-rgx=<regex>, 20
-inlinevar-rgx=<regex> -name-group=<name1:name2:...,...>,
command line option, 20 21
-method-naming-style=<style> -variable-naming-style=<style>, 20
command line option, 20 -variable-rgx=<regex>, 20
-method-rgx=<regex>
command line option, 20
-module-naming-style=<style>
command line option, 19
-module-rgx=<regex>
command line option, 20
179