Releases: pylint-dev/pylint
v2.13.4
-
Fix false positive regression in 2.13.0 for
used-before-assignment
for
homonyms between variable assignments in try/except blocks and variables in
a comprehension's filter.Closes #6035
-
Include
testing_pylintrc
in source and wheel distributions.Closes #6028
-
Fix crash in
super-init-not-called
checker when usingctypes.Union
.Closes #6027
-
Fix crash for
unneccessary-ellipsis
checker when an ellipsis is used inside of a container or a lambda expression.
v2.13.3
v2.13.2
-
Fix crash when subclassing a
namedtuple
.Closes #5982
-
Fix false positive for
superfluous-parens
for patterns like
"return (a or b) in iterable".Closes #5803
-
Fix a false negative regression in 2.13.0 where
protected-access
was not
raised on functions.Fixes #5989
-
Better error messages in case of crash if pylint can't write the issue template.
Refer to #5987
v2.13.1
-
Fix a regression in 2.13.0 where
used-before-assignment
was emitted for
the usage of a nonlocal in a try block.Fixes #5965
-
Avoid emitting
raising-bad-type
when there is inference ambiguity on
the variable being raised.Closes #2793
-
Loosen TypeVar default name pattern a bit to allow names with multiple uppercase
characters. E.g.HVACModeT
orIPAddressT
.Closes #5981
-
Fixed false positive for
unused-argument
when anonlocal
name is used
in a nested function that is returned without being called by its parent.Closes #5187
-
Fix program crash for
modified_iterating-list/set/dict
when the list/dict/set
being iterated through is a function call.Closes #5969
-
Don't emit
broken-noreturn
andbroken-collections-callable
errors
insideif TYPE_CHECKING
blocks.
2.13.0
-
Add missing dunder methods to
unexpected-special-method-signature
check. -
No longer emit
no-member
in for loops that referenceself
if the binary operation that
started the for loop uses aself
that is encapsulated in tuples or lists.Ref pylint-dev/astroid#1360
Closes #4826 -
Output better error message if unsupported file formats are used with
pyreverse
.Closes #5950
-
Fix pyreverse diagrams type hinting for classmethods and staticmethods.
-
Fix pyreverse diagrams type hinting for methods returning None.
-
Fix matching
--notes
options that end in a non-word character.Closes #5840
-
Updated the position of messages for class and function defintions to no longer cover
the complete definition. Only thedef
orclass
+ the name of the class/function
are covered.Closes #5466
-
using-f-string-in-unsupported-version
andusing-final-decorator-in-unsupported-version
msgids
were renamed fromW1601
andW1602
toW2601
andW2602
. Disabling using these msgids will break.
This is done in order to restore consistency with the already existing msgids forapply-builtin
and
basestring-builtin
from the now deleted python 3K+ checker. There is now a check that we're not using
existing msgids or symbols from deleted checkers.Closes #5729
-
The line numbering for messages related to function arguments is now more accurate. This can
require some message disables to be relocated to updated positions. -
Add
--recursive
option to allow recursive discovery of all modules and packages in subtree. Running pylint with
--recursive=y
option will check all discovered.py
files and packages found inside subtree of directory provided
as parameter to pylint.Closes #352
-
Add
modified-iterating-list
,modified-iterating-dict
andmodified-iterating-set
,
emitted when items are added to or removed from respectively a list, dictionary or
set being iterated through.Closes #5348
-
Fix false-negative for
assignment-from-none
checker using list.sort() method.closes #5722
-
New extension
import-private-name
: indicate imports of external private packages
and objects (prefixed with_
). It can be loaded usingload-plugins=pylint.extensions.private_import
.Closes #5463
-
Fixed crash from
arguments-differ
andarguments-renamed
when methods were
defined outside the top level of a class.Closes #5648
-
Removed the deprecated
check_docs
extension. You can use thedocparams
checker
to get the checks previously included incheck_docs
.Closes #5322
-
Added a
testutil
extra require to the packaging, asgitpython
should not be a dependency
all the time but is still required to use the primer helper code inpylint.testutil
. You can
install it withpip install pylint[testutil]
.Closes #5486
-
Reinstated checks from the python3 checker that are still useful for python 3
(eq-without-hash
). This is now in thepylint.extensions.eq_without_hash
optional
extension.Closes #5025
-
Fixed an issue where
ungrouped-imports
could not be disabled without raising
useless-suppression
.Ref #2366
-
Added several checkers to deal with unicode security issues
(seeTrojan Sources <https://trojansource.codes/>
_ and
PEP 672 <https://www.python.org/dev/peps/pep-0672/>
_ for details) that also
concern the readability of the code. In detail the following checks were added:-
bad-file-encoding
checks that the file is encoded in UTF-8 as suggested by
PEP8 <https://www.python.org/dev/peps/pep-0008/#id20>
.
UTF-16 and UTF-32 arenot supported by Python <https://bugs.python.org/issue1503789>
at the moment. If this ever changes
invalid-unicode-codec
checks that they aren't used, to allow for backwards
compatibility. -
bidirectional-unicode
checks for bidirectional unicode characters that
could make code execution different than what the user expects. -
invalid-character-backspace
,invalid-character-carriage-return
,
invalid-character-sub
,invalid-character-esc
,
invalid-character-zero-width-space
andinvalid-character-nul
to check for possibly harmful unescaped characters.
Closes #5281
-
-
Use the
tomli
package instead oftoml
to parse.toml
files.
Closes #5885
- Fix false positive - Allow unpacking of
self
in a subclass oftyping.NamedTuple
.
Closes #5312
- Fixed false negative
unpacking-non-sequence
when value is an empty list.
Closes #5707
-
Better warning messages for useless else or elif when a function returns early.
Closes #5614
-
Fixed false positive
consider-using-dict-comprehension
when creating a dict
using a list of tuples where key AND value vary depending on the same condition.Closes #5588
-
Fixed false positive for
global-variable-undefined
whenglobal
is used with a class nameCloses #3088
-
Fixed false positive for
unused-variable
when anonlocal
name is assigned as part of a multi-name assignment.Closes #3781
-
Fixed a crash in
unspecified-encoding
checker when providingNone
to themode
argument of anopen()
call.Closes #5731
-
Fixed a crash involving a
NewType
named with an f-string.Closes #5770
Ref pylint-dev/astroid#1400 -
Improved
bad-open-mode
message when providingNone
to themode
argument of anopen()
call.Closes #5733
-
Added
lru-cache-decorating-method
checker with checks for the use offunctools.lru_cache
on class methods. This is unrecommended as it creates memory leaks by never letting the instance
getting garbage collected.Closes #5670
-
Fixed crash with recursion error for inference of class attributes that referenced
the class itself.Closes #5408
Ref pylint-dev/astroid#1392 -
Fixed false positive for
unused-argument
when a method overridden in a subclass
does nothing with the value of a keyword-only argument.Closes #5771
Ref pylint-dev/astroid#1382 -
The issue template for crashes is now created for crashes which were previously not covered
by this mechanism.Closes #5668
-
Rewrote checker for
non-ascii-name
.
It now ensures all Python names are ASCII and also properly
checks the names of imports (non-ascii-module-import
) as
well as file names (non-ascii-file-name
) and emits their respective new warnings.Non ASCII characters could be homoglyphs (look alike characters) and hard to
enter on a non specialized keyboard.
SeeConfusable Characters in PEP 672 <https://www.python.org/dev/peps/pep-0672/#confusable-characters-in-identifiers>
_ -
When run in parallel mode
pylint
now pickles the data passed to subprocesses with
thedill
package. Thedill
package has therefore been added as a dependency. -
An astroid issue where symlinks were not being taken into account
was fixedCloses #1470
Closes #3499
Closes #4302
Closes #4798
Closes #5081 -
Fix a crash in
unused-private-member
checker when analyzing code using
type(self)
in bound methods.Closes #5569
-
Optimize parsing of long lines when
missing-final-newline
is enabled.Closes #5724
-
Fix false positives for
used-before-assignment
from using named
expressions in a ternary operator test and using that expression as
a call argument. -
Fix false positive for
undefined-variable
whennamedtuple
class
attributes are used as return annotations.Closes #5568
-
Fix false negative for
undefined-variable
and related variable messages
when the same undefined variable is used as a type annotation and is
accessed multiple times, or is used as a default argument to a function.Closes #5399
-
Pyreverse - add output in mermaidjs format
-
Emit
used-before-assignment
instead ofundefined-variable
when attempting
to access unused type annotations.Closes #5713
-
Added confidence level
CONTROL_FLOW
for warnings relying on assumptions
about control flow. -
used-before-assignment
now considers that assignments in a try block
may not have occurred when the except or finally blocks are executed. -
Fixed false negative for
used-before-assignment
when a conditional
or context manager intervened before the try statement that suggested
it might fail.Closes #4045
-
Fixed false negative for
used-before-assignment
in finally blocks
if an except handler did not define the assignment that might have failed
in the try block. -
Fixed extremely long processing of long lines with comma's.
Closes #5483
-
Fixed crash on properties and inherited class methods when comparing them for
equality against an empty dict.Closes #5646
-
Fixed a false positive for
assigning-non-slot
when the slotted class
defined__setattr__
.Closes #3793
-
Fixed a false positive for
invalid-class-object
when the object
being assigned to the__class__
attribute is uninferable. -
Fixed false positive for
used-before-assignment
with self-referential type
annotation in conditional statements within class methods.Closes #5499
-
Add checker
redefined-slots-in-subclass
: Emitted when a slot is redefined in a subclass.Closes #5617
-
Fixed false positive for
global-variable-not-assigned
when thedel
statement is usedCloses #5333
-
By default, pylint does no longer take files starting with
.#
into account. Those are
consideredemacs file locks
. See
https://www.gnu.org/software/emacs/manual/html_node/elisp/File-Lock...
v2.12.2
-
Fixed a false positive for
unused-import
where everything was not analyzed properly inside typing guards. -
Fixed a false-positive regression for
used-before-assignment
for
typed variables in the body of class methods that reference the same classCloses #5342
-
Specified that the
ignore-paths
option considers "" to represent a
windows directory delimiter instead of a regular expression escape
character. -
Fixed a crash with the
ignore-paths
option when invoking the option
via the command line.Closes #5437
-
Fixed handling of Sphinx-style parameter docstrings with asterisks. These
should be escaped with by prepending a "".Closes #5406
-
Add
endLine
andendColumn
keys to output ofJSONReporter
.Closes #5380
-
Fixed handling of Google-style parameter specifications where descriptions
are on the line following the parameter name. These were generating
false positives formissing-param-doc
.Closes #5452
-
Fix false negative for
consider-iterating-dictionary
during membership checks encapsulated in iterables
ornot in
checksCloses #5323
-
unused-import
now check all ancestors for typing guardsCloses #5316
2.12.1
2.12.0
-
Upgrade astroid to 2.9.0
Closes #4982
-
Add ability to add
end_line
andend_column
to the--msg-template
option.
With the standardTextReporter
this will add the line and column number of the
end of a node to the output of Pylint. If these numbers are unknown, they are represented
by an empty string. -
Introduced primer tests and a configuration tests framework. The helper classes available in
pylint/testutil/
are still unstable and might be modified in the near future. -
Fix
install graphiz
message which isn't needed for puml output format. -
MessageTest
of the unittesttestutil
now requires theconfidence
attribute
to match the expected value. If none is provided it is set toUNDEFINED
. -
add_message
of the unittesttestutil
now actually handles thecol_offset
parameter
and allows it to be checked against actual output in a test. -
Fix a crash in the
check_elif
extensions where an undetected if in a comprehension
with an if statement within a f-string resulted in an out of range error. The checker no
longer relies on counting if statements anymore and uses known if statements locations instead.
It should not crash on badly parsed if statements anymore. -
Fix
simplify-boolean-expression
when condition can be inferred as False.Closes #5200
-
Fix exception when pyreverse parses
property function
of a class. -
The functional
testutils
now acceptend_lineno
andend_column
. Expected
output files without these will trigger aDeprecationWarning
. Expected output files
can be easily updated with thepython tests/test_functional.py --update-functional-output
command. -
The functional
testutils
now correctly check the distinction betweeenHIGH
and
UNDEFINED
confidence. Expected output files without defiendconfidence
levels will now
trigger aDeprecationWarning
. Expected output files can be easily updated with the
python tests/test_functional.py --update-functional-output
command. -
The functional test runner now supports the option
min_pyver_end_position
to control on which python
versions theend_lineno
andend_column
attributes should be checked. The default value is 3.8. -
Fix
accept-no-yields-doc
andaccept-no-return-doc
not allowing missingyield
or
return
documentation when a docstring is partially correctCloses #5223
-
Add an optional extension
consider-using-any-or-all
: Emitted when afor
loop only
produces a boolean and could be replaced byany
orall
using a generator. Also suggests
a suitable any or all statement.Closes #5008
-
Properly identify parameters with no documentation and add new message called
missing-any-param-doc
Closes #3799
-
Add checkers
overridden-final-method
&subclassed-final-class
Closes #3197
-
Fixed
protected-access
for accessing of attributes and methods of inner classesCloses #3066
-
Added support for
ModuleNotFoundError
(import-error
andno-name-in-module
).
ModuleNotFoundError
inherits fromImportError
and was added in Python3.6
-
undefined-variable
now correctly flags variables which only receive a type annotations
and never get assigned a valueCloses #5140
-
undefined-variable
now correctly considers the line numbering and order of classes
used in metaclass declarationsCloses #4031
-
used-before-assignment
now correctly considers references to classes as type annotation
or default values in first-level methodsCloses #3771
-
undefined-variable
andunused-variable
now correctly trigger for assignment expressions
in functions defaultsFixes part of #3688
-
undefined-variable
now correctly triggers for assignment expressions in if ... else statements
This includes a basic form of control flow inference for if ... else statements using
constant boolean valuesCloses #3688
-
Added the
--enable-all-extensions
command line option. It will load all available extensions
which can be listed by running--list-extensions
-
Fix bug with importing namespace packages with relative imports
-
Improve and flatten
unused-wildcard-import
messageCloses #3859
-
In length checker,
len-as-condition
has been renamed as
use-implicit-booleaness-not-len
in order to be consistent with
use-implicit-booleaness-not-comparison
. -
Created new
UnsupportedVersionChecker
checker class that includes checks for features
not supported by all versions indicated by apy-version
.- Added
using-f-string-in-unsupported-version
checker. Issued whenpy-version
is set to a version that does not support f-strings (< 3.6)
- Added
-
Fix
useless-super-delegation
false positive when default keyword argument is a variable. -
Properly emit
duplicate-key
when Enum members are duplicate dictionary keysCloses #5150
-
Use
py-version
setting for alternative union syntax check (PEP 604),
instead of the Python interpreter version. -
Subclasses of
dict
are regarded as reversible by thebad-reversed-sequence
checker
(Python 3.8 onwards).Closes #4981
-
Support configuring mixin class pattern via
mixin-class-rgx
-
Added new checker
use-implicit-booleaness-not-comparison
: Emitted when
collection literal comparison is being used to check for emptiness.Closes #4774
-
mising-param-doc
now correctly parses asterisks for variable length and
keyword parametersCloses #3733
-
mising-param-doc
now correctly handles Numpy parameter documentation without
explicit typingCloses #5222
-
pylint
no longer crashes when checking assignment expressions within if-statementsCloses #5178
-
Update ``literal-comparison``` checker to ignore tuple literals
Closes #3031
-
Normalize the input to the
ignore-paths
option to allow both Posix and
Windows pathsCloses #5194
-
Fix double emitting of
not-callable
on inferrableproperties
Closes #4426
-
self-cls-assignment
now also considers tuple assignment -
Fix
missing-function-docstring
not being able to check__init__
and other
magic methods even if theno-docstring-rgx
setting was set to do so -
Added
using-final-decorator-in-unsupported-version
checker. Issued whenpy-version
is set to a version that does not supporttyping.final
(< 3.8) -
Added configuration option
exclude-too-few-public-methods
to allow excluding
classes from themin-public-methods
checker.Closes #3370
-
The
--jobs
parameter now fallbacks to 1 if the host operating system does not
have functioning shared semaphore implementation.Closes #5216
-
Fix crash for
unused-private-member
when checking private members on__class__
Closes #5261
-
Crashes when a list is encountered in a toml configuration do not happen anymore.
Closes #4580
-
Moved
misplaced-comparison-constant
to its own extensioncomparison_placement
.
This checker was opinionated and now no longer a default. It can be reactived by adding
pylint.extensions.comparison_placement
toload-plugins
in your config.Closes #1064
-
A new
bad-configuration-section
checker was added that will emit for misplaced option
in pylint's top level namespace for toml configuration. Top-level dictionaries or option defined
in the wrong section will still silently not be taken into account, which is tracked in a
follow-up issue.Follow-up in #5259
-
Fix crash for
protected-access
on (outer) class traversal -
Added new checker
useless-with-lock
to find incorrect usage of with statement and threading module locks.
Emitted whenwith threading.Lock():
is used instead ofwith lock_instance:
.Closes #5208
-
Make yn validator case insensitive, to allow for
True
andFalse
in config files. -
Fix crash on
open()
calls when themode
argument is not a simple string.Partially closes #5321
-
Inheriting from a class that implements
__class_getitem__
no longer raisesinherit-non-class
. -
Pyreverse - Add the project root directory to sys.path
Closes #2479
-
Don't emit
consider-using-f-string
ifpy-version
is set to Python <3.6
.
f-strings
were added in Python3.6
Closes #5019
-
Fix regression for
unspecified-encoding
withpathlib.Path.read_text()
Closes #5029
-
Don't emit
consider-using-f-string
if the variables to be interpolated include a backslash -
Fixed false positive for
cell-var-from-loop
when variable is used as the default
value for a keyword-only parameter.Closes #5012
-
Fix false-positive
undefined-variable
withLambda
,IfExp
, and
assignment expression. -
Fix false-positive
useless-suppression
forwrong-import-order
Closes #2366
-
Fixed
toml
dependency issueCloses #5066
-
Fix false-positive
useless-suppression
forline-too-long
Closes #4212
-
Fixed
invalid-name
not checking parameters of overwritten baseobject
methodsCloses #3614
-
Fixed crash in
consider-using-f-string
ifformat
is not calledCloses #5058
-
Fix crash with
AssignAttr
inif TYPE_CHECKING
blocks.Closes #5111
-
Improve node information for
invalid-name
on function argument. -
Prevent return type checkers being called on functions with ellipses as body
Closes #4736
-
Add
is_sys_guard
andis_typing_guard
helper functions from astroid
topylint.checkers.utils
. -
Fix regression on ClassDef inference
Closes #5030
Clos...
v2.11.1
v2.11.0
-
The python3 porting mode checker and it's
py3k
option were removed. You can still find it in older pylint
versions. -
raising-bad-type
is now properly emitted when raising a string -
Added new extension
SetMembershipChecker
withuse-set-for-membership
check:
Emitted when using an in-place definedlist
ortuple
to do a membership test.sets
are better optimized for that.Closes #4776
-
Added
py-version
config key (if[MASTER]
section). Used for version dependant checks.
Will default to whatever Python version pylint is executed with. -
CodeStyleChecker
-
Added
consider-using-assignment-expr
: Emitted when an assignment is directly followed by an if statement
and both can be combined by using an assignment expression:=
. Requires Python 3.8Closes #4862
-
-
Added
consider-using-f-string
: Emitted when .format() or '%' is being used to format a string.Closes #3592
-
Fix false positive for
consider-using-with
if a context manager is assigned to a
variable in different paths of control flow (e. g. if-else clause).Closes #4751
-
https is now prefered in the documentation and http://pylint.pycqa.org correctly redirect to https://pylint.pycqa.org
Closes #3802
-
Fix false positive for
function-redefined
for simple type annotationsCloses #4936
-
Fix false positive for
protected-access
if a protected member is used in type hints of function definitions -
Fix false positive
dict-iter-missing-items
for dictionaries only using tuples as keysCloses #3282
-
The
unspecified-encoding
checker now also checks calls topathlib.Path().read_text()
andpathlib.Path().write_text()
Closes #4945
-
Fix false positive
superfluous-parens
for tuples created with inner tuplesCloses #4907
-
Fix false positive
unused-private-member
for accessing attributes in a class usingcls
Closes #4849
-
Fix false positive
unused-private-member
for private staticmethods accessed in classmethods.Closes #4849
-
Extended
consider-using-in
check to work for attribute access. -
Setting
min-similarity-lines
to 0 now makes the similarty checker stop checking for duplicate codeCloses #4901
-
Fix a bug where pylint complained if the cache's parent directory does not exist
Closes #4900
-
The
global-variable-not-assigned
checker now catches global variables that are never reassigned in a
local scope and catches (reassigned) functions -
Fix false positives for invalid-all-format that are lists or tuples at runtime
Closes #4711
-
Fix
no-self-use
anddocparams extension
for async functions and methods. -
Add documentation for
pyreverse
andsymilar
Closes #4616
-
Non symbolic messages with the wrong capitalisation now correctly trigger
use-symbolic-message-instead
Closes #5000
-
The
consider-iterating-dictionary
checker now also considers membership checksCloses #4069
-
The
invalid-name
message is now more detailed when using multiple naming style regexes.