chore(deps): update dependency pylint to v2.17.7
This MR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| pylint (changelog) |
==2.3.1 -> ==2.17.7
|
Release Notes
pylint-dev/pylint (pylint)
v2.17.7
2.17.7 is the last release before we only support pylint 3.0.0 or superior and python 3.8 or superior.
False Positives Fixed
-
Fix a regression in pylint 2.17.6 / astroid 2.15.7 causing various messages for code involving
TypeVar.Closes #9069
Other Bug Fixes
-
Fix crash in refactoring checker when unary operand used with variable in for loop.
Closes #9074
v2.17.6
Other Bug Fixes
-
When parsing comma-separated lists of regular expressions in the config, ignore commas that are inside braces since those indicate quantifiers, not delineation between expressions.
Closes #7229
-
sys.argvis now always correctly considered as impossible to infer (instead of using the actual values given to pylint).Closes #9047
-
Don't show class fields more than once in Pyreverse diagrams.
Closes #8189
-
Don't show arrows more than once in Pyreverse diagrams.
Closes #8522
-
Don't show duplicate type annotations in Pyreverse diagrams.
Closes #8888
-
Don't add
Optionalto|annotations withNonein Pyreverse diagrams.Closes #9014
v2.17.5
What's new in Pylint 2.17.5?
Release date: 2023-07-26
False Positives Fixed
-
Fix a false positive for
unused-variablewhen there is an import in aif TYPE_CHECKING:block andallow-global-unused-variablesis set tonoin the configuration.Closes #8696
-
Fix false positives generated when supplying arguments as
**kwargsto IO calls like open().Closes #8719
-
Fix a false positive where pylint was ignoring method calls annotated as
NoReturnduring theinconsistent-return-statementscheck.Closes #8747
-
Exempt parents with only type annotations from the
invalid-enum-extensionmessage.Closes #8830
Other Bug Fixes
-
Fixed crash when a call to
super()was placed after an operator (e.g.not).Closes #8554
-
Fix crash for
modified-while-iteratingchecker when deleting members of a dict returned from a call.Closes #8598
-
Fix crash in
invalid-metaclasscheck when a metaclass had duplicate bases.Closes #8698
-
Avoid
consider-using-f-stringon modulos with brackets in template.Closes #8720.
-
Fix a crash when
__all__exists but cannot be inferred.Closes #8740
-
Fix crash when a variable is assigned to a class attribute of identical name.
Closes #8754
-
Fixed a crash when calling
copy.copy()without arguments.Closes #8774
Other Changes
-
Fix a crash when a
nonlocalis defined at module-level.Closes #8735
v2.17.4
False Positives Fixed
-
Fix a false positive for
bad-dunder-namewhen there is a user-defined__index__method.Closes #8613
Other Bug Fixes
-
pyreverse: added escaping of vertical bar character in annotation labels produced by DOT printer to ensure it is not treated as field separator of record-based nodes.Closes #8603
-
Fixed a crash when generating a configuration file:
tomlkit.exceptions.TOMLKitError: Can't add a table to a dotted keycaused by tomlkitv0.11.8.Closes #8632
v2.17.3
What's new in Pylint 2.17.3?
Release date: 2023-04-24
False Positives Fixed
-
Fix
unused-argumentfalse positive when__new__does not use all the arguments of__init__.Closes #3670
-
Fix
unused-importfalse positive for usage ofsix.with_metaclass.Closes #7506
-
logging-not-lazyis not longer emitted for explicitly concatenated string arguments.Closes #8410
-
Fix false positive for isinstance-second-argument-not-valid-type when union types contains None.
Closes #8424
-
Fixed
unused-importso that it observes thedummy-variables-rgxoption.Closes #8500
-
Uniontyped variables without assignment are no longer treated asTypeAlias.Closes #8540
-
Fix false positive for
positional-only-arguments-expectedwhen a function contains both a positional-only parameter that has a default value, and**kwargs.Closes #8555
-
Fix false positive for
keyword-arg-before-varargwhen a positional-only parameter with a default value precedes*args.Closes #8570
Other Bug Fixes
-
Improve output of
consider-using-generatormessage formin()` calls withdefault`` keyword.Closes #8563
v2.17.2
False Positives Fixed
-
invalid-namenow allows for integers intypealiasnames:- now valid:
Good2Name,GoodName2. - still invalid:
_1BadName.
Closes #8485
- now valid:
-
No longer consider
Unionas type annotation as type alias for naming checks.Closes #8487
-
unnecessary-lambdano longer warns on lambdas which use its parameters in their body (other than the final arguments), e.g.lambda foo: (bar if foo else baz)(foo).Closes #8496
Other Bug Fixes
-
Fix a crash in pyreverse when "/" characters are used in the output filename e.g pyreverse -o png -p name/ path/to/project.
Closes #8504
v2.17.1
False Positives Fixed
-
Adds
asyncSetUpto the defaultdefining-attr-methodslist to silenceattribute-defined-outside-initwarning when usingunittest.IsolatedAsyncioTestCase.Refs #8403
Other Bug Fixes
-
--clear-cache-post-runnow also clears LRU caches for pylint utilities holding references to AST nodes.Closes #8361
-
Fix a crash when
TYPE_CHECKINGis used without importing it.Closes #8434
-
Fix a regression of
preferred-moduleswhere a partial match was used instead of the required full match.Closes #8453
Internal Changes
-
The following utilities are deprecated in favor of the more robust
in_type_checking_blockand will be removed in pylint 3.0:is_node_in_guarded_import_blockis_node_in_typing_guarded_import_blockis_typing_guard
is_sys_guardis still available, which was part ofis_node_in_guarded_import_block.Refs #8433
v2.17.0
2.17 is a small release that is the first to support python 3.11 officially with the addition of TryStar nodes.
There's still two new default checks: bad-chained-comparison and
implicit-flag-alias, one of them already fixed a previously undetected
bug in sentry.
Thanks to the community effort our documentation is almost complete, and almost all messages should have a proper documentation now. A big thank you to everyone who participated !
The next release is going to be 3.0.0, bring breaking changes and
enact long announced deprecations. There's going to be frequent beta
releases, before the official releases, everyone is welcome to try the betas
so we find problems before the actual release.
What's new in Pylint 2.17.0?
Release date: 2023-03-08
New Features
-
pyreversenow supports custom color palettes with the--color-paletteoption.Closes #6738
-
Add
invalid-namecheck forTypeAliasnames.Closes #7081
-
Accept values of the form
<class name>.<attribute name>for theexclude-protectedlist.Closes #7343
-
Add
--versionoption topyreverse.Refs #7851
-
Adds new functionality with preferred-modules configuration to detect submodules.
Refs #7957
-
Support implicit namespace packages (PEP 420).
Closes #8154
-
Add globbing pattern support for
--source-roots.Closes #8290
-
Support globbing pattern when defining which file/directory/module to lint.
Closes #8310
-
pylint now supports
TryStarnodes from Python 3.11 and should be fully compatible with Python 3.11.Closes #8387
New Checks
-
Add a
bad-chained-comparisoncheck that emits a warning when there is a chained comparison where one expression is semantically incompatible with the other.Closes #6559
-
Adds an
implicit-flag-aliascheck that emits a warning when a class derived fromenum.IntFlagassigns distinct integer values that share common bit positions.Refs #8102
False Positives Fixed
-
Fix various false positives for functions that return directly from structural pattern matching cases.
Closes #5288
-
Fix false positive for
used-before-assignmentwhentyping.TYPE_CHECKINGis used with if/elif/else blocks.Closes #7574
-
Fix false positive for isinstance-second-argument-not-valid-type with union types.
Closes #8205
-
Fix false positive for
used-before-assignmentfor named expressions appearing after the first element in a list, tuple, or set.Closes #8252
-
Fix false positive for
wrong-spelling-in-commentwith class names in a python 2 type comment.Closes #8370
False Negatives Fixed
-
Fix a false negative for 'missing-parentheses-for-call-in-test' when inference failed for the internal of the call as we did not need that information to raise correctly.
Refs #8185
-
Fix false negative for inconsistent-returns with while-loops.
Closes #8280
Other Bug Fixes
-
Fix
used-before-assignmentfalse positive when the walrus operator is used with a ternary operator in dictionary key/value initialization.Closes #8125
-
Fix
no-name-in-modulefalse positive raised when a package defines a variable with the same name as one of its submodules.Closes #8148
-
Fix a crash happening for python interpreter < 3.9 following a failed typing update.
Closes #8161
-
Fix
nested-min-maxsuggestion message to indicate it's possible to splat iterable objects.Closes #8168
-
Fix a crash happening when a class attribute was negated in the start argument of an enumerate.
Closes #8207
-
Prevent emitting
invalid-namefor the line on which aglobalstatement is declared.Closes #8307
Other Changes
-
Update explanation for
global-variable-not-assignedand add confidence.Closes #5073
-
The governance model and the path to become a maintainer have been documented as part of our effort to guarantee that the software supply chain in which pylint is included is secure.
Refs #8329
v2.16.4
False Positives Fixed
-
Fix false positive for isinstance-second-argument-not-valid-type with union types.
Closes #8205
v2.16.3
False Positives Fixed
-
Fix false positive for
wrong-spelling-in-commentwith class names in a python 2 type comment.Closes #8370
Other Bug Fixes
-
Prevent emitting
invalid-namefor the line on which aglobalstatement is declared.Closes #8307
v2.16.2
New Features
-
Add
--versionoption topyreverse.Refs #7851
False Positives Fixed
-
Fix false positive for
used-before-assignmentwhentyping.TYPE_CHECKINGis used with if/elif/else blocks.Closes #7574
-
Fix false positive for
used-before-assignmentfor named expressions appearing after the first element in a list, tuple, or set.Closes #8252
Other Bug Fixes
-
Fix
used-before-assignmentfalse positive when the walrus operator is used with a ternary operator in dictionary key/value initialization.Closes #8125
-
Fix
no-name-in-modulefalse positive raised when a package defines a variable with the same name as one of its submodules.Closes #8148
-
Fix
nested-min-maxsuggestion message to indicate it's possible to splat iterable objects.Closes #8168
-
Fix a crash happening when a class attribute was negated in the start argument of an enumerate.
Closes #8207
v2.16.1
Other Bug Fixes
-
Fix a crash happening for python interpreter < 3.9 following a failed typing update.
Closes #8161
v2.16.0
Summary -- Release highlights
In 2.16.0 we added aggregation and composition understanding in pyreverse, and a way to clear
the cache in between run in server mode (originally for the VS Code integration). Apart from the bug
fixes there's also a lot of new checks, and new extensions that have been asked for for a long time
that were implemented.
If you want to benefit from all the new checks load the following plugins::
pylint.extensions.dict_init_mutate,
pylint.extensions.dunder,
pylint.extensions.typing,
pylint.extensions.magic_value,
We still welcome any community effort to help review, integrate, and add good/bad examples to the doc for
#5953. This should be doable without any pylint or astroid
knowledge, so this is the perfect entrypoint if you want to contribute to pylint or open source without
any experience with our code!
Last but not least @clavedeluna and @nickdrozd became triagers, welcome to the team !
What's new in Pylint 2.16.0?
Changes requiring user actions
-
The
accept-no-raise-docoption related tomissing-raises-docwill now be correctly taken into account all the time.Pylint will no longer raise missing-raises-doc (W9006) when no exceptions are documented and accept-no-raise-doc is true (issue #7208). If you were expecting missing-raises-doc errors to be raised in that case, you will now have to add
accept-no-raise-doc=noin your configuration to keep the same behavior. Closes #7208
New Features
-
Added the
no-headeroutput format. If enabled with--output-format=no-header, it will not include the module name in the output. Closes #5362 -
Added configuration option
clear-cache-post-runto support server-like usage. Use this flag if you expect the linted files to be altered between runs. Refs #5401 -
Add
--allow-reexport-from-packageoption to configure theuseless-import-aliascheck not to emit a warning if a name is reexported from a package. Closes #6006 -
Update
pyreverseto differentiate between aggregations and compositions.pyreversechecks if it's an Instance or a Call of an object via method parameters (via type hints) to decide if it's a composition or an aggregation. Refs #6543
New Checks
-
Adds a
pointless-exception-statementcheck that emits a warning when an Exception is created and not assigned, raised or returned. Refs #3110 -
Add a
shadowed-importmessage for aliased imports. Closes #4836 -
Add new check called
unbalanced-dict-unpackingto check for unbalanced dict unpacking in assignment and for loops. Closes #5797 -
Add new checker
positional-only-arguments-expectedto check for cases when positional-only arguments have been passed as keyword arguments. Closes #6489 -
Added
singledispatch-methodwhich informs that@singledispatchshould decorate functions and not class/instance methods. Addedsingledispatchmethod-functionwhich informs that@singledispatchmethodshould decorate class/instance methods and not functions. Closes #6917 -
Rename
broad-excepttobroad-exception-caughtand add new checkerbroad-exception-raisedwhich will warn if general exceptionsBaseExceptionorExceptionare raised. Closes #7494 -
Added
nested-min-maxwhich flagsmin(1, min(2, 3))to simplify tomin(1, 2, 3). Closes #7546 -
Extended
use-dict-literalto also warn about call todict()when passing keyword arguments. Closes #7690 -
Add
named-expr-without-contextcheck to emit a warning if a named expression is used outside a context likeif,for,while, or a comprehension. Refs #7760 -
Add
invalid-slice-stepcheck to warn about a slice step value of0for common builtin sequences. Refs #7762 -
Add
consider-refactoring-into-while-conditioncheck to recommend refactoring when a while loop is defined with a constant condition with an immediateifstatement to check forbreakcondition as a first statement. Closes #8015
Extensions
-
Add new extension checker
dict-init-mutatethat flags mutating a dictionary immediately after the dictionary was created. Closes #2876 -
Added
bad-dunder-nameextension check, which flags bad or misspelled dunder methods. You can use thegood-dunder-namesoption to allow specific dunder names. Closes #3038 -
Added
consider-using-augmented-assigncheck forCodeStyleextension which flagsx = x + 1to simplify tox += 1. This check is disabled by default. To use it, load the code style extension withload-plugins=pylint.extensions.code_styleand addconsider-using-augmented-assignin theenableoption. Closes #3391 -
Add
magic-numberplugin checker for comparison with constants instead of named constants or enums. You can use it with--load-plugins=pylint.extensions.magic_value. Closes #7281 -
Add
redundant-typehint-argumentmessage fortypingplugin for duplicate assign typehints. Enable the plugin to enable the message with:--load-plugins=pylint.extensions.typing. Closes #7636
False Positives Fixed
-
Fix false positive for
unused-variableandunused-importwhen a name is only used in a string literal type annotation. Closes #3299 -
Document a known false positive for
useless-suppressionwhen disablingline-too-longin a module with only comments and no code. Closes #3368 -
trailing-whitespacesis no longer reported within strings. Closes #3822 -
Fix false positive for
global-variable-not-assignedwhen a global variable is re-assigned via anImportFromnode. Closes #4809 -
Fix false positive for
use-maxsplit-argwith custom split method. Closes #4857 -
Fix
logging-fstring-interpolationfalse positive raised when logging and f-string with%sformatting. Closes #4984 -
Fix false-positive for
used-before-assignmentin pattern matching with a guard. Closes #5327 -
Fix
use-sequence-for-iterationwhen unpacking a set with*. Closes #5788 -
Fix
deprecated-methodfalse positive when alias for method is similar to name of deprecated method. Closes #5886 -
Fix false positive
assigning-non-slotwhen a class attribute is re-assigned. Closes #6001 -
Fix false positive for
too-many-function-argswhen a function call is assigned to a class attribute inside the class where the function is defined. Closes #6592 -
Fixes false positive
abstract-methodon Protocol classes. Closes #7209 -
Pylint now understands the
kw_onlykeyword argument fordataclass. Closes #7290, closes #6550, closes #5857 -
Fix false positive for
undefined-loop-variableinfor-elseloops that use a function having a return type annotation ofNoReturnorNever. Closes #7311 -
Fix
used-before-assignmentfor functions/classes defined in type checking guard. Closes #7368 -
Fix false positive for
unhashable-memberwhen subclassingdictand using the subclass as a dictionary key. Closes #7501 -
Fix the message for
unnecessary-dunder-callfor__aiter__and__aneext__. Also only emit the warning whenpy-version>= 3.10. Closes #7529 -
Fix
used-before-assignmentfalse positive when else branch callssys.exitor similar terminating functions. Closes #7563 -
Fix a false positive for
used-before-assignmentfor imports guarded bytyping.TYPE_CHECKINGlater used in variable annotations. Closes #7609 -
Fix a false positive for
simplify-boolean-expressionwhen multiple values are inferred for a constant. Closes #7626 -
unnecessary-list-index-lookupwill not be wrongly emitted ifenumerateis called withstart. Closes #7682 -
Don't warn about
stop-iteration-returnwhen usingnext()overitertools.cycle. Closes #7765 -
Fixes
used-before-assignmentfalse positive when the walrus operator is used in a ternary operator. Closes #7779 -
Fix
missing-param-docfalse positive when function parameter has an escaped underscore. Closes #7827 -
Fixes
method-cache-max-size-nonefalse positive for methods inheriting fromEnum. Closes #7857 -
multiple-statementsno longer triggers for function stubs using inlined.... Closes #7860 -
Fix a false positive for
used-before-assignmentwhen a name guarded byif TYPE_CHECKING:is used as a type annotation in a function body and later re-imported in the same scope. Closes #7882 -
Prevent
used-before-assignmentwhen imports guarded byif TYPE_CHECKINGare guarded again when used. Closes #7979 -
Fixes false positive for
try-except-raisewith multiple exceptions in one except statement if exception are in different namespace. Closes #8051 -
Fix
invalid-nameerrors fortyping_extension.TypeVar. Refs #8089 -
Fix
no-kwoafalse positive for context managers. Closes #8100 -
Fix a false positive for
redefined-variable-typewhenasyncmethods are present. Closes #8120
False Negatives Fixed
-
Code following a call to
quit,exit,sys.exitoros._exitwill be marked asunreachable. Refs #519 -
Emit
used-before-assignmentwhen function arguments are redefined inside an inner function and accessed there before assignment. Closes #2374 -
Fix a false negative for
unused-importwhen one module used an import in a type annotation that was also used in another module. Closes #4150 -
Flag
superfluous-parensif parentheses are used during string concatenation. Closes #4792 -
Emit
used-before-assignmentwhen relying on names only defined under conditions always testing false. Closes #4913 -
consider-using-joincan now be emitted for non-empty string separators. Closes #6639 -
Emit
used-before-assignmentfor further imports guarded byTYPE_CHECKINGPreviously, this message was only emitted for imports guarded directly underTYPE_CHECKING, not guarded two if-branches deep, nor whenTYPE_CHECKINGwas imported fromtypingunder an alias. Closes #7539 -
Fix a false negative for
unused-importwhen a constant insidetyping.Annotatedwas treated as a reference to an import. Closes #7547 -
consider-using-any-or-allmessage will now be raised in cases when boolean is initialized, reassigned during loop, and immediately returned. Closes #7699 -
Extend
invalid-slice-indexto emit an warning for invalid slice indices used with string and byte sequences, and range objects. Refs #7762 -
Fixes
unnecessary-list-index-lookupfalse negative whenenumerateis called withiterableas a kwarg. Closes #7770 -
no-else-returnorno-else-raisewill be emitted ifexceptblock always returns or raises. Closes #7788 -
Fix
dangerous-default-valuefalse negative when*is used. Closes #7818 -
consider-using-withnow triggers forpathlib.Path.open. Closes #7964
Other Bug Fixes
-
Fix bug in detecting
unused-variablewhen iterating on variable. Closes #3044 -
Fix bug in scanning of names inside arguments to
typing.Literal. See https://peps.python.org/pep-0586/#literals-enums-and-forward-references for details. Refs #3299 -
Update
disallowed-namecheck to flag module-level variables. Closes #3701 -
Pylint will no longer deadlock if a parallel job is killed but fail immediately instead. Closes #3899
-
Fix ignored files being linted when passed on stdin. Closes #4354
-
Fix
no-memberfalse negative when augmented assign is done manually, without+=. Closes #4562 -
Any assertion on a populated tuple will now receive a
assert-on-tuplewarning. Closes #4655 -
missing-return-doc,missing-raises-docandmissing-yields-docnow respect theno-docstring-rgxoption. Closes #4743 -
Update
reimportedhelp message for clarity. Closes #4836 -
consider-iterating-dictionarywill no longer be raised if bitwise operations are used. Closes #5478 -
Using custom braces in
msg-templatewill now work properly. Closes #5636 -
Pylint will now filter duplicates given to it before linting. The output should be the same whether a file is given/discovered multiple times or not. Closes #6242, #4053
-
Remove
__index__dunder method call fromunnecessary-dunder-callcheck. Closes #6795 -
Fixed handling of
--as separator between positional arguments and flags. This was not actually fixed in 2.14.5. Closes #7003, Refs #7096 -
Don't crash on
OSErrorin config file discovery. Closes #7169 -
Messages sent to reporter are now copied so a reporter cannot modify the message sent to other reporters. Closes #7214
-
Fixed a case where custom plugins specified by command line could silently fail. Specifically, if a plugin relies on the
init-hookoption changingsys.pathbefore it can be imported, this will now emit abad-plugin-valuemessage. Before this change, it would silently fail to register the plugin for use, but would load any configuration, which could have unintended effects. Fixes part of #7264. -
Update
modified_iteratingchecker to fix a crash withforloops on empty list. Closes #7380 -
Update wording for
arguments-differandarguments-renamedto clarify overriding object. Closes #7390 -
disable-nextis now correctly scoped to only the succeeding line. Closes #7401 -
Fixed a crash in the
unhashable-memberchecker when using alambdaas a dict key. Closes #7453 -
Add
mailcapto deprecated modules list. Closes #7457 -
Fix a crash in the
modified-iterating-dictchecker involving instance attributes. Closes #7461 -
invalid-class-objectdoes not crash anymore when__class__is assigned alongside another variable. Closes #7467 -
--help-msgnow accepts a comma-separated list of message IDs again. Closes #7471 -
Allow specifying non-builtin exceptions in the
overgeneral-exceptionoption using an exception's qualified name. Closes #7495 -
Report
no-self-argumentrather thanno-method-argumentfor methods with variadic arguments. Closes #7507 -
Fixed an issue where
syntax-errorcouldn't be raised on files with invalid encodings. Closes #7522 -
Fix false positive for
redefined-outer-namewhen aliasingtypinge.g. astand guarding imports undert.TYPE_CHECKING. Closes #7524 -
Fixed a crash of the
modified_iteratingchecker when iterating on a set defined as a class attribute. Closes #7528 -
Use
py-versionto determine if a message should be emitted for messages defined withmax-versionormin-version. Closes #7569 -
Improve
bad-thread-instantiationcheck to warn iftargetis not passed in as a keyword argument or as a second argument. Closes #7570 -
Fixes edge case of custom method named
nextraised an astroid error. Closes #7610 -
Fixed a multi-processing crash that prevents using any more than 1 thread on MacOS. The returned module objects and errors that were cached by the linter plugin loader cannot be reliably pickled. This means that
dillwould throw an error when attempting to serialise the linter object for multi-processing use. Closes #7635. -
Fix crash that happened when parsing files with unexpected encoding starting with 'utf' like
utf13. Closes #7661 -
Fix a crash when a child class with an
__init__method inherits from a parent class with an__init__class attribute. Closes #7742 -
Fix
valid-metaclass-classmethod-first-argdefault config value from "cls" to "mcs" which would cause both a false-positive and false-negative. Closes #7782 -
Fixes a crash in the
unnecessary_list_index_lookupcheck when usingenumeratewithstartand a class attribute. Closes #7821 -
Fixes a crash in
stop-iteration-returnwhen thenextbuiltin is called without arguments. Closes #7828 -
When pylint exit due to bad arguments being provided the exit code will now be the expected
32. Refs #7931 -
Fixes a
ModuleNotFoundexception when running pylint on a Django project with thepylint_djangoplugin enabled. Closes #7938 -
Fixed a crash when inferring a value and using its qname on a slice that was being incorrectly called. Closes #8067
-
Use better regex to check for private attributes. Refs #8081
-
Fix issue with new typing Union syntax in runtime context for Python 3.10+. Closes #8119
Other Changes
-
Pylint now provides basic support for Python 3.11. Closes #5920
-
Update message for
abstract-methodto include child class name. Closes #7124 -
Update Pyreverse's dot and plantuml printers to detect when class methods are abstract and show them with italic font. For the dot printer update the label to use html-like syntax. Closes #7346
-
The
docparamsextension now considers typing in Numpy style docstrings as "documentation" for themissing-param-docmessage. Refs #7398 -
Relevant
DeprecationWarningsare now raised withstacklevel=2, so they have the callsite attached in the message. Closes #7463 -
Add a
minimaloption topylint-configand its toml generator. Closes #7485 -
Add method name to the error messages of
no-method-argumentandno-self-argument. Closes #7507 -
Prevent leaving the pip install cache in the Docker image. Refs #7544
-
Add a keyword-only
compare_constantsargument tosafe_infer. Refs #7626 -
Add
default_enabledoption to optional message dict. Provides an option to disable a checker message by default. To use a disabled message, the user must enable it explicitly by adding the message to theenableoption. Refs #7629 -
Sort
--generated-rcfileoutput. Refs #7655 -
epylint is now deprecated and will be removed in pylint 3.0.0. All emacs and flymake related files were removed and their support will now happen in an external repository : https://github.com/emacsorphanage/pylint. Closes #7737
-
Adds test for existing preferred-modules configuration functionality. Refs #7957
Internal Changes
- Add and fix regression tests for plugin loading.
This shores up the tests that cover the loading of custom plugins as affected
by any changes made to the
sys.pathduring execution of aninit-hook. Given the existing contract of allowing plugins to be loaded by fiddling with the path in this way, this is now the last bit of work needed to close Github issue #7264. Closes #7264
v2.15.10
False Positives Fixed
-
Fix
use-sequence-for-iterationwhen unpacking a set with*.Closes #5788
-
Fix false positive
assigning-non-slotwhen a class attribute is re-assigned.Closes #6001
-
Fixes
used-before-assignmentfalse positive when the walrus operator is used in a ternary operator.Closes #7779
-
Prevent
used-before-assignmentwhen imports guarded byif TYPE_CHECKINGare guarded again when used.Closes #7979
Other Bug Fixes
-
Using custom braces in
msg-templatewill now work properly.Closes #5636
v2.15.9
False Positives Fixed
-
Fix false-positive for
used-before-assignmentin pattern matching with a guard.Closes #5327
Other Bug Fixes
-
Pylint will no longer deadlock if a parallel job is killed but fail immediately instead.
Closes #3899
-
When pylint exit due to bad arguments being provided the exit code will now be the expected
32.Refs #7931
-
Fixes a
ModuleNotFoundexception when running pylint on a Django project with thepylint_djangoplugin enabled.Closes #7938
v2.15.8
False Positives Fixed
-
Document a known false positive for
useless-suppressionwhen disablingline-too-longin a module with only comments and no code.Closes #3368
-
Fix
logging-fstring-interpolationfalse positive raised when logging and f-string with%sformatting.Closes #4984
-
Fixes false positive
abstract-methodon Protocol classes.Closes #7209
-
Fix
missing-param-docfalse positive when function parameter has an escaped underscore.Closes #7827
-
multiple-statementsno longer triggers for function stubs using inlined....Closes #7860
v2.15.7
False Positives Fixed
-
Fix
deprecated-methodfalse positive when alias for method is similar to name of deprecated method.Closes #5886
-
Fix a false positive for
used-before-assignmentfor imports guarded bytyping.TYPE_CHECKINGlater used in variable annotations.Closes #7609
Other Bug Fixes
-
Pylint will now filter duplicates given to it before linting. The output should be the same whether a file is given/discovered multiple times or not.
-
Fixes a crash in
stop-iteration-returnwhen thenextbuiltin is called without arguments.Closes #7828
v2.15.6
False Positives Fixed
-
Fix false positive for
unhashable-memberwhen subclassingdictand using the subclass as a dictionary key.Closes #7501
-
unnecessary-list-index-lookupwill not be wrongly emitted ifenumerateis called withstart.Closes #7682
-
Don't warn about
stop-iteration-returnwhen usingnext()overitertools.cycle.Closes #7765
Other Bug Fixes
-
Messages sent to reporter are now copied so a reporter cannot modify the message sent to other reporters.
Closes #7214
-
Fixes edge case of custom method named
nextraised an astroid error.Closes #7610
-
Fix crash that happened when parsing files with unexpected encoding starting with 'utf' like
utf13.Closes #7661
-
Fix a crash when a child class with an
__init__method inherits from a parent class with an__init__class attribute.Closes #7742
v2.15.5
What's new in Pylint 2.15.5?
Release date: 2022-10-21
False Positives Fixed
-
Fix a false positive for
simplify-boolean-expressionwhen multiple values are inferred for a constant.Closes #7626
Other Bug Fixes
-
Remove
__index__dunder method call fromunnecessary-dunder-callcheck.Closes #6795
-
Fixed a multi-processing crash that prevents using any more than 1 thread on MacOS.
The returned module objects and errors that were cached by the linter plugin loader cannot be reliably pickled. This means that
dillwould throw an error when attempting to serialise the linter object for multi-processing use.Closes #7635.
Other Changes
-
Add a keyword-only
compare_constantsargument tosafe_infer.Refs #7626
-
Sort
--generated-rcfileoutput.Refs #7655
v2.15.4
False Positives Fixed
-
Fix the message for
unnecessary-dunder-callfor__aiter__and__anext__. Also only emit the warning whenpy-version>= 3.10.Closes #7529
Other Bug Fixes
-
Fix bug in detecting
unused-variablewhen iterating on variable.Closes #3044
-
Fixed handling of
--as separator between positional arguments and flags. This was not actually fixed in 2.14.5. -
Report
no-self-argumentrather thanno-method-argumentfor methods with variadic arguments.Closes #7507
-
Fixed an issue where
syntax-errorcouldn't be raised on files with invalid encodings.Closes #7522
-
Fix false positive for
redefined-outer-namewhen aliasingtypinge.g. astand guarding imports undert.TYPE_CHECKING.Closes #7524
-
Fixed a crash of the
modified_iteratingchecker when iterating on a set defined as a class attribute.Closes #7528
-
Fix bug in scanning of names inside arguments to
typing.Literal. See https://peps.python.org/pep-0586/#literals-enums-and-forward-references for details.Refs #3299
Other Changes
-
Add method name to the error messages of
no-method-argumentandno-self-argument.Closes #7507
v2.15.3
-
Fixed a crash in the
unhashable-memberchecker when using alambdaas a dict key.Closes #7453
-
Fix a crash in the
modified-iterating-dictchecker involving instance attributes.Closes #7461
-
invalid-class-objectdoes not crash anymore when__class__is assigned alongside another variable.Closes #7467
-
Fix false positive for
global-variable-not-assignedwhen a global variable is re-assigned via anImportFromnode.Closes #4809
-
Fix false positive for
undefined-loop-variableinfor-elseloops that use a function having a return type annotation ofNoReturnorNever.Closes #7311
-
--help-msgnow accepts a comma-separated list of message IDs again.Closes #7471
v2.15.2
-
Fixed a case where custom plugins specified by command line could silently fail.
Specifically, if a plugin relies on the
init-hookoption changingsys.pathbefore it can be imported, this will now emit abad-plugin-valuemessage. Before this change, it would silently fail to register the plugin for use, but would load any configuration, which could have unintended effects.Fixes part of #7264.
-
Fix
used-before-assignmentfor functions/classes defined in type checking guard.Closes #7368
-
Update
modified_iteratingchecker to fix a crash withforloops on empty list.Closes #7380
-
The
docparamsextension now considers typing in Numpy style docstrings as "documentation" for themissing-param-docmessage.Refs #7398
-
Fix false positive for
unused-variableandunused-importwhen a name is only used in a string literal type annotation.Closes #3299
-
Fix false positive for
too-many-function-argswhen a function call is assigned to a class attribute inside the class where the function is defined.Closes #6592
-
Fix
used-before-assignmentfor functions/classes defined in type checking guard.Closes #7368
-
Fix ignored files being linted when passed on stdin.
Closes #4354
-
missing-return-doc,missing-raises-docandmissing-yields-docnow respect theno-docstring-rgxoption.Closes #4743
-
Don't crash on
OSErrorin config file discovery.Closes #7169
-
disable-nextis now correctly scoped to only the succeeding line.Closes #7401
-
Update
modified_iteratingchecker to fix a crash withforloops on empty list.Closes #7380
v2.15.0
In pylint 2.15.0, we added a new check missing-timeout to warn of default timeout values that could cause a program to be hanging indefinitely.
We improved pylint's handling of namespace packages. More packages should be linted without resorting to using the --recursive=y option.
We still welcome any community effort to help review, integrate, and add good/bad examples to the doc for PyCQA#5953. This should be doable without any pylint or astroid knowledge, so this is the perfect entrypoint if you want to contribute to pylint or open source without any experience with our code!
Internally, we changed the way we generate the release notes, thanks to DudeNr33. There will be no more conflict resolution to do in the changelog, and every contributor rejoice.
Marc Byrne became a maintainer, welcome to the team !
New Checks
-
Added new checker
missing-timeoutto warn of default timeout values that could cause a program to be hanging indefinitely.Refs #6780
False Positives Fixed
-
Don't report
super-init-not-calledfor abstract__init__methods.Closes #3975
-
Don't report
unsupported-binary-operationon Python <= 3.9 when using the|operator with types, if one has a metaclass that overloads__or__or__ror__as appropriate.Closes #4951
-
Don't report
no-value-for-parameterfor dataclasses fields annotated withKW_ONLY.Closes #5767
-
Fixed inference of
Enumswhen they are imported under an alias.Closes #5776
-
Prevent false positives when accessing
PurePath.parentsby index (not slice) on Python 3.10+.Closes #5832
-
unnecessary-list-index-lookupis now more conservative to avoid potential false positives.Closes #6896
-
Fix double emitting
trailing-whitespacefor multi-line docstrings.Closes #6936
-
import-errornow correctly checks forcontextlib.suppressguards on import statements.Closes #7270
-
Fix false positive for
no-self-argument/no-method-argumentwhen a staticmethod is applied to a function but uses a different name.Closes #7300
-
Fix
undefined-loop-variablewithbreakandcontinuestatements inelseblocks.Refs #7311
False Negatives Fixed
-
Emit
used-before-assignmentwhen relying on a name that is reimported later in a function.Closes #4624
-
Emit
used-before-assignmentfor self-referencing named expressions (:=) lacking prior assignments.Closes #5653
-
Emit
used-before-assignmentfor self-referencing assignments under if conditions.Closes #6643
-
Emit
modified-iterating-listand analogous messages for dicts and sets when iterating literals, or when using thedelkeyword.Closes #6648
-
Emit
used-before-assignmentwhen calling nested functions before assignment.Closes #6812
-
Emit
nonlocal-without-bindingwhen a nonlocal name has been assigned at a later point in the same scope.Closes #6883
-
Emit
using-constant-testwhen testing the truth value of a variable or call result holding a generator.Closes #6909
-
Rename
unhashable-dict-keytounhashable-memberand emit when creating sets and dicts, not just when accessing dicts.
Other Bug Fixes
-
Fix a failure to lint packages with
__init__.pycontained in directories lacking__init__.py.Closes #1667
-
Fixed a syntax-error crash that was not handled properly when the declared encoding of a file was
utf-9.Closes #3860
-
Fix a crash in the
not-callablecheck when there is ambiguity whether an instance is being incorrectly provided to__new__().Closes #7109
-
Fix crash when regex option raises a
re.errorexception.Closes #7202
-
Fix
undefined-loop-variablefrom walrus in comprehension test.Closes #7222
-
Check for
<cwd>before removing first item fromsys.pathinmodify_sys_path.Closes #7231
-
Fix sys.path pollution in parallel mode.
Closes #7246
-
Prevent
useless-parent-delegationfor delegating to a builtin written in C (e.g.Exception.__init__) with non-self arguments.Closes #7319
Other Changes
-
bad-exception-contexthas been renamed tobad-exception-causeas it is about the cause and not the context.Closes #3694
-
The message for
literal-comparisonis now more explicit about the problem and the solution.Closes #5237
-
useless-super-delegationhas been renamed touseless-parent-delegationin order to be more generic.Closes #6953
-
Pylint now uses
towncrierfor changelog generation.Refs #6974
-
Update
astroidto 2.12.Refs #7153
-
Fix crash when a type-annotated
__slots__with no value is declared.Closes #7280
Internal Changes
-
Fixed an issue where it was impossible to update functional tests output when the existing output was impossible to parse. Instead of raising an error we raise a warning message and let the functional test fail with a default value.
Refs #6891
-
pylint.testutils.primeris now a private API.Refs #6905
-
We changed the way we handle the changelog internally by using towncrier. If you're a contributor you won't have to fix merge conflicts in the changelog anymore.
Closes #6974
-
Pylint is now using Scorecards to implement security recommendations from the
OpenSSF <https://openssf.org/>_. This is done in order to secure our supply chains using a combination of automated tooling and best practices, most of which were already implemented before.Refs #7267
v2.14.5
-
Fixed a crash in the
undefined-loop-variablecheck whenenumerate()is used in a ternary expression.Closes #7131
-
Fixed handling of
--as separator between positional arguments and flags.Closes #7003
-
Fixed the disabling of
fixmeand its interaction withuseless-suppression. -
Allow lists of default values in parameter documentation for
Numpystyle.Closes #4035
v2.14.4
-
The
differing-param-doccheck was triggered by positional only arguments.Closes #6950
-
Fixed an issue where scanning
.directory recursively with--ignore-path=^path/to/diris not ignoring thepath/to/dirdirectory.Closes #6964
-
Fixed regression that didn't allow quoted
init-hooksin option files.Closes #7006
-
Fixed a false positive for
modified-iterating-dictwhen updating an existing key.Closes #6179
-
Fixed an issue where many-core Windows machines (>~60 logical processors) would hang when using the default jobs count.
Closes #6965
-
Fixed an issue with the recognition of
setup.cfgfiles. Only.cfgfiles that are exactly namedsetup.cfgrequire section names that start withpylint..Closes #3630
-
Don't report
import-private-namefor relative imports.Closes #7078
v2.14.3
-
Fixed two false positives for
bad-super-callfor calls that refer to a non-direct parent. -
Fixed a false positive for
useless-super-delegationfor subclasses that specify the number of of parameters against a parent that uses a variadic argument.Closes #2270
-
Allow suppressing
undefined-loop-variableandundefined-variablewithout raisinguseless-suppression. -
Fixed false positive for
undefined-variablefor__class__in inner methods.Closes #4032
v2.14.2
-
Fixed a false positive for
unused-variablewhen a function returns anargparse.Namespaceobject.Closes #6895
-
Avoided raising an identical
undefined-loop-variablemessage twice on the same line. -
Don't crash if
lint.run._query_cpu()is run within a Kubernetes Pod, that has only a fraction of a cpu core assigned. Just go with one process then.Closes #6902
-
Fixed a false positive in
consider-using-f-stringif the left side of a%is not a string.Closes #6689
-
Fixed a false positive in
unnecessary-list-index-lookupandunnecessary-dict-index-lookupwhen the subscript is updated in the body of a nested loop.Closes #6818
-
Fixed an issue with multi-line
init-hookoptions which did not record the line endings.Closes #6888
-
Fixed a false positive for
used-before-assignmentwhen a try block returns but an except handler defines a name via type annotation. -
--errors-onlyno longer enables previously disabled messages. It was acting as "emit all and only error messages" without being clearly documented that way.Closes #6811
v2.14.1
-
Avoid reporting
unnecessary-dict-index-lookuporunnecessary-list-index-lookupwhen the index lookup is part of a destructuring assignment.Closes #6788
-
Fixed parsing of unrelated options in
tox.ini.Closes #6800
-
Fixed a crash when linting
__new__()methods that return a call expression.Closes #6805
-
Don't crash if we can't find the user's home directory.
Closes #6802
-
Fixed false positives for
unused-importwhen aliasingtypinge.g. astand guarding imports undert.TYPE_CHECKING.Closes #3846
-
Fixed a false positive regression in 2.13 for
used-before-assignmentwhere it is safe to rely on a name defined only in anexceptblock because theelseblock returned.Closes #6790
-
Fixed the use of abbreviations for some special options on the command line.
Closes #6810
-
Fix a crash in the optional
pylint.extensions.private_importextension.Closes #6624
-
bad-option-value(E0012) is now a warningunknown-option-value(W0012). Deleted messages that do not exist anymore in pylint now raiseuseless-option-value(R0022) instead ofbad-option-value. This allows to distinguish between genuine typos and configuration that could be cleaned up. Existing message disables forbad-option-valuewill still work on both new messages.Refs #6794
v2.14.0
Summary -- Release highlights
With 2.14 pylint only supports Python version 3.7.2 and above.
We introduced several new checks among which duplicate-value for sets,
comparison-of-constants, and checks related to lambdas. We removed no-init and
made no-self-use optional as they were too opinionated. We also added an option
to generate a toml configuration: --generate-toml-config.
We migrated to argparse from optparse and refactored the configuration handling
thanks to Daniël van Noord. On the user side it should change the output of the
--help command, and some inconsistencies and bugs should disappear. The behavior
between options set in a config file versus on the command line will be more consistent. For us,
it will permit to maintain this part of the code easily in the future and anticipate
optparse's removal in Python 3.12.
As a result of the refactor there are a lot of internal deprecations. If you're a library maintainer that depends on pylint, please verify that you're ready for pylint 3.0 by activating deprecation warnings.
We continued the integration of pylint-error and are now at 33%!. We still welcome
any community effort to help review, integrate, and add good/bad examples in #5953.
This should be doable without any pylint or astroid knowledge, so this is the perfect
entrypoint if you want to contribute to pylint or open source without any experience
with our code!
New checkers
-
Added new checker
comparison-of-constants.Closes #6076
-
Added new checker
typevar-name-mismatch: TypeVar must be assigned to a variable with the same name as its name argument.Closes #5224
-
invalid-enum-extension: Used when a class tries to extend an inherited Enum class.Closes #5501
-
Added new checker
typevar-double-variance: The "covariant" and "contravariant" keyword arguments cannot both be set to "True" in a TypeVar.Closes #5895
-
Add new check
unnecessary-dunder-callfor unnecessary dunder method calls.Closes #5936
-
unnecessary-lambda-assignment: Lambda expression assigned to a variable. Define a function using the "def" keyword instead.unnecessary-direct-lambda-call: Lambda expression called directly. Execute the expression inline instead.Closes #5976
-
potential-index-error: Emitted when the index of a list or tuple exceeds its length. This checker is currently quite conservative to avoid false positives. We welcome suggestions for improvements.Closes #578
-
Added new checker
unnecessary-list-index-lookupfor indexing into a list while iterating overenumerate().Closes #4525
-
Added new message called
duplicate-valuewhich identifies duplicate values inside sets.Closes #5880
-
Added the
super-without-bracketschecker, raised when a super call is missing its brackets.Closes #4008
Removed checkers
-
The
no-init(W0232) warning has been removed. It's ok to not have an__init__in a class.Closes #2409
-
Removed the
assign-to-new-keywordmessage as there are no new keywords in the supported Python versions any longer.Closes #4683
-
Moved
no-self-usecheck to optional extension. You now need to explicitly enable this check usingload-plugins=pylint.extensions.no_self_use.Closes #5502
Extensions
-
RedefinedLoopNameChecker- Added optional extension
redefined-loop-nameto emit messages when a loop variable is redefined in the loop body.
Closes #5072
- Added optional extension
-
DocStringStyleChecker- Re-enable checker
bad-docstring-quotesfor Python <= 3.7.
Closes #6087
- Re-enable checker
-
NoSelfUseChecker- Added
no-self-usecheck, previously enabled by default.
Closes #5502
- Added
Other Changes
-
Started ignoring underscore as a local variable for
too-many-locals.Closes #6488
-
Pylint can now be installed with an extra-require called
spelling(pip install pylint[spelling]). This will addpyenchantto pylint's dependencies. You will still need to install the requirements forpyenchant(theenchantlibrary and any dictionaries) yourself. You will also need to set thespelling-dictoption.Refs #6462
-
Improved wording of the message of
deprecated-moduleCloses #6169
-
Pylintnow requires Python 3.7.2 or newer to run.Closes #4301
-
We made a greater effort to reraise failures stemming from the
astroidlibrary asAstroidError, with the effect that pylint emitsastroid-errorrather than merelyfatal. Regardless, please report any such issues you encounter! -
We have improved our recognition of inline disable and enable comments. It is now possible to disable
bad-option-valueinline (as long as you disable it before the bad option value is raised, i.e.disable=bad-option-value,bad-messagenotdisable=bad-message,bad-option-value) as well as certain other previously unsupported messages.Closes #3312
-
The main checker name is now
maininstead ofmaster. The configuration does not need to be updated as sections' name are optional.Closes #5467
-
Update
invalid-slots-objectmessage to show bad object rather than its inferred value.Closes #6101
-
Fixed a crash in the
not-an-iterablechecker involving multiple starred expressions inside a call.Closes #6372
-
Fixed a crash in the
unused-private-memberchecker involving chained private attributes.Closes #6709
-
Disable spellchecking of mypy rule names in ignore directives.
Closes #5929
-
implicit-str-concatwill now be raised on calls likeopen("myfile.txt" "a+b")too.Closes #6441
-
Fix a failure to respect inline disables for
fixmeoccurring on the last line of a module when pylint is launched with--enable=fixme. -
Removed the broken
generate-manoption. -
Fixed failure to enable
deprecated-moduleafter adisable=allby makingImportsCheckersolely responsible for emittingdeprecated-moduleinstead of sharing responsibility withStdlibChecker. (This could have led to double messages.) -
Added the
generate-toml-configoption.Refs #5462
-
bad-option-valuewill be emitted whenever a configuration value or command line invocation includes an unknown message.Closes #4324
-
Added the
unrecognized-optionmessage. Raised if we encounter any unrecognized options.Closes #5259
-
Fix false negative for
bad-string-format-typeif the value to be formatted is passed in as a variable holding a constant. -
The concept of checker priority has been removed.
-
The
cache-max-size-nonechecker has been renamed tomethod-cache-max-size-none.Closes #5670
-
The
method-cache-max-size-nonechecker will now also checkfunctools.cache.Closes #5670
-
BaseCheckerclasses now require thelinterargument to be passed. -
The
set_config_directlydecorator has been removed. -
Don't report
useless-super-delegationfor the__hash__method in classes that also override the__eq__method.Closes #3934
-
Fix falsely issuing
useless-suppressionon thewrong-import-positionchecker.Closes #5219
-
Fixed false positive
no-memberfor Enums with self-defined members.Closes #5138
-
Fix false negative for
no-memberwhen attempting to assign an instance attribute to itself without any prior assignment.Closes #1555
-
Changed message type from
redefined-outer-nametoredefined-loop-name(optional extension) for redefinitions of outer loop variables by inner loops.Closes #5608
-
By default the similarity checker will now ignore imports and ignore function signatures when computing duplication. If you want to keep the previous behaviour set
ignore-importsandignore-signaturestoFalse. -
Pylint now expands the user path (i.e.
~tohome/yusef/) and expands environment variables (i.e.home/$USER/$projecttohome/yusef/pylintforUSER=yusefandproject=pylint) for pyreverse'soutput-directory,import-graph,ext-import-graph,int-import-graphoptions, and the spell checker'sspelling-private-dict-fileoption.Refs #6493
-
Don't emit
unsubscriptable-objectfor string annotations. Pylint doesn't check if class is only generic in type stubs only. -
Fix pyreverse crash
RuntimeError: dictionary changed size during iterationRefs #6612
-
Fix syntax for return type annotations in MermaidJS diagrams produced with
pyreverse.Closes #6467
-
Fix type annotations of class and instance attributes using the alternative union syntax in
pyreversediagrams. -
Fix bug where it writes a plain text error message to stdout, invalidating output formats.
Closes #6597
-
The refactoring checker now also raises 'consider-using-a-generator' messages for
max(),min()andsum().Refs #6595
-
Update ranges for
using-constant-testandmissing-parentheses-for-call-in-testerror messages. -
Don't emit
no-memberinside type annotations withfrom __future__ import annotations.Closes #6594
-
Fix
unexpected-special-method-signaturefalse positive for__init_subclass__methods with one or more arguments.Closes #6644
Deprecations
-
The
ignore-mixin-membersoption has been deprecated. You should now use the newignored-checks-for-mixinsoption.Closes #5205
-
interfaces.implementshas been deprecated and will be removed in 3.0. Please use standard inheritance patterns instead of__implements__.Refs #2287
-
All
Interfaceclasses inpylint.interfaceshave been deprecated. You can subclass the respective normal classes to get the same behaviour. The__implements__functionality was based on a rejected PEP from 2001: https://peps.python.org/pep-0245/Closes #2287
-
MapReduceMixinhas been deprecated.BaseCheckernow implementsget_map_dataandreduce_map_data. If a checker actually needs to reduce data it should defineget_map_dataas returning something different thanNoneand let itsreduce_map_datahandle a list of the types returned byget_map_data. An example can be seen by looking atpylint/checkers/similar.py. -
The
configattribute ofBaseCheckerhas been deprecated. You can usechecker.linter.configto access the global configuration object instead of a checker-specific object.Refs #5392
-
The
levelattribute ofBaseCheckerhas been deprecated: everything is now displayed in--help, all the time.Refs #5392
-
The
set_optionmethod ofBaseCheckerhas been deprecated. You can usechecker.linter.set_optionto set an option on the global configuration object instead of a checker-specific object.Refs #5392
-
The
options_providersattribute ofArgumentsManagerhas been deprecated.Refs #5392
-
Fix saving of persistent data files in environments where the user's cache directory and the linted file are on a different drive.
Closes #6394
-
The
method-cache-max-size-nonechecker will now also checkfunctools.cache. -
The
configattribute ofPyLinteris now of theargparse.Namespacetype instead ofoptparse.Values.Refs #5392
-
UnsupportedActionhas been deprecated.Refs #5392
-
OptionsManagerMixInhas been deprecated.Refs #5392
-
OptionParserhas been deprecated.Refs #5392
-
Optionhas been deprecated.Refs #5392
-
OptionsProviderMixInhas been deprecated.Refs #5392
-
ConfigurationMixInhas been deprecated. -
The
option_groupsattribute ofPyLinterhas been deprecated.Refs #5392
-
get_global_confighas been deprecated. You can now access all global options fromchecker.linter.config.Refs #5392
-
OptionsManagerMixInhas been replaced withArgumentsManager.ArgumentsManageris considered private API and most methods that were public onOptionsManagerMixInhave now been deprecated and will be removed in a future release.Refs #5392
-
OptionsProviderMixInhas been replaced withArgumentsProvider.ArgumentsProvideris considered private API and most methods that were public onOptionsProviderMixInhave now been deprecated and will be removed in a future release.Refs #5392
-
pylint.pyreverse.ASTWalkerhas been removed, as it was only used internally by a single child class.Refs #6712
-
pyreverse: Resolving and displaying implemented interfaces that are defined by the__implements__attribute has been deprecated and will be removed in 3.0.Refs #6713
-
is_class_subscriptable_pep585_with_postponed_evaluation_enabledhas been deprecated. Useis_postponed_evaluation_enabled(node) and is_node_in_type_annotation_context(node)instead.Refs #6536
v2.13.9
2.13.9 is the last release supporting python interpreter between 3.6.2 and 3.7.2.
-
Respect ignore configuration options with
--recursive=y.Closes #6471
-
Fix false positives for
no-name-in-moduleandimport-errorfornumpy.distutilsandpydantic.Closes #6497
-
Fix
IndexErrorcrash inuninferable_final_decoratorsmethod.Relates to #6531
-
Fix a crash in
unnecessary-dict-index-lookupwhen subscripting an attribute.Closes #6557
-
Fix a crash when accessing
__code__and assigning it to a variable.Closes #6539
-
Fix a false positive for
undefined-loop-variablewhen usingenumerate().Closes #6593
v2.13.8
-
Fix a false positive for
undefined-loop-variablefor a variable used in a lambda inside the first of multiple loops.Closes #6419
-
Fix a crash when linting a file that passes an integer
mode=toopenCloses #6414
-
Avoid reporting
superfluous-parenson expressions using theis notoperator.Closes #5930
-
Fix a false positive for
undefined-loop-variablewhen theelseof aforloop raises or returns.Closes #5971
-
Fix false positive for
unused-variablefor classes inside functions and where a metaclass is provided via a call.Closes #4020
-
Fix false positive for
unsubscriptable-objectin Python 3.8 and below for statements guarded byif TYPE_CHECKING.Closes #3979
v2.13.7
-
Fix a crash caused by using the new config from 2.14.0 in 2.13.x code.
Closes #6408
v2.13.6
-
Fix a crash in the
unsupported-membership-testchecker when assigning multiple constants to class attributes including__iter__via unpacking.Closes #6366
-
Asterisks are no longer required in Sphinx and Google style parameter documentation for
missing-param-docand are parsed correctly. -
Fixed a false positive for
unused-variablewhen a builtin specified in--additional-builtinsis given a type annotation.Closes #6388
-
Fixed an
AstroidErrorin 2.13.0 raised by theduplicate-codechecker withignore-importsorignore-signaturesenabled.Closes #6301
v2.13.5
-
Fix false positive regression in 2.13.0 for
used-before-assignmentfor homonyms between variable assignments in try/except blocks and variables in subscripts in comprehensions. -
lru-cache-decorating-methodhas been renamed tocache-max-size-noneand will only be emitted whenmaxsizeisNone.Closes #6180
-
Fix false positive for
unused-importwhen disabling bothused-before-assignmentandundefined-variable.Closes #6089
-
Narrow the scope of the
unnecessary-ellipsischecker to:- functions & classes which contain both a docstring and an ellipsis.
- A body which contains an ellipsis
nodes.Exprnode & at least one other statement.
-
Fix false positive for
used-before-assignmentfor assignments taking place via nonlocal declarations after an earlier type annotation.Closes #5394
-
Fix crash for
redefined-slots-in-subclasswhen the type of the slot is not a const or a string.Closes #6100
-
Only raise
not-callablewhen all the inferred values of a property are not callable.Closes #5931
-
Fix a false negative for
subclassed-final-classwhen a set of other messages were disabled.
v2.13.4
-
Fix false positive regression in 2.13.0 for
used-before-assignmentfor homonyms between variable assignments in try/except blocks and variables in a comprehension's filter.Closes #6035
-
Include
testing_pylintrcin source and wheel distributions.Closes #6028
-
Fix crash in
super-init-not-calledchecker when usingctypes.Union.Closes #6027
-
Fix crash for
unneccessary-ellipsischecker when an ellipsis is used inside of a container or a lambda expression.
v2.13.3
-
Fix false positive for
unnecessary-ellipsiswhen using an ellipsis as a default argument.Closes #5973
-
Fix crash involving unbalanced tuple unpacking.
Closes #5998
-
Fix false positive for 'nonexistent-operator' when repeated '-' are separated (e.g. by parens).
Closes #5769
v2.13.2
-
Fix crash when subclassing a
namedtuple.Closes #5982
-
Fix false positive for
superfluous-parensfor patterns like "return (a or b) in iterable".Closes #5803
-
Fix a false negative regression in 2.13.0 where
protected-accesswas 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-assignmentwas emitted for the usage of a nonlocal in a try block.Fixes #5965
-
Avoid emitting
raising-bad-typewhen 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.
HVACModeTorIPAddressT.Closes #5981
-
Fixed false positive for
unused-argumentwhen anonlocalname 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/dictwhen the list/dict/set being iterated through is a function call.Closes #5969
-
Don't emit
broken-noreturnandbroken-collections-callableerrors insideif TYPE_CHECKINGblocks.
v2.13.0: 2.13.0
-
Add missing dunder methods to
unexpected-special-method-signaturecheck. -
No longer emit
no-memberin for loops that referenceselfif the binary operation that started the for loop uses aselfthat is encapsulated in tuples or lists.Ref PyCQA/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
--notesoptions 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 the
deforclass+ the name of the class/function are covered.Closes #5466
-
using-f-string-in-unsupported-versionandusing-final-decorator-in-unsupported-versionmsgids were renamed fromW1601andW1602toW2601andW2602. Disabling using these msgids will break. This is done in order to restore consistency with the already existing msgids forapply-builtinandbasestring-builtinfrom 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
--recursiveoption to allow recursive discovery of all modules and packages in subtree. Running pylint with--recursive=yoption will check all discovered.pyfiles and packages found inside subtree of directory provided as parameter to pylint.Closes #352
-
Add
modified-iterating-list,modified-iterating-dictandmodified-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-nonechecker 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-differandarguments-renamedwhen methods were defined outside the top level of a class.Closes #5648
-
Removed the deprecated
check_docsextension. You can use thedocparamschecker to get the checks previously included incheck_docs.Closes #5322
-
Added a
testutilextra require to the packaging, asgitpythonshould 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_hashoptional extension.Closes #5025
-
Fixed an issue where
ungrouped-importscould not be disabled without raisinguseless-suppression.Ref #2366
-
Added several checkers to deal with unicode security issues (see
Trojan Sources <https://trojansource.codes/>_ andPEP 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-encodingchecks that the file is encoded in UTF-8 as suggested byPEP8 <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 changesinvalid-unicode-codecchecks that they aren't used, to allow for backwards compatibility. -
bidirectional-unicodechecks 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-spaceandinvalid-character-nulto check for possibly harmful unescaped characters.
Closes #5281
-
-
Use the
tomlipackage instead oftomlto parse.tomlfiles.
Closes #5885
- Fix false positive - Allow unpacking of
selfin a subclass oftyping.NamedTuple.
Closes #5312
- Fixed false negative
unpacking-non-sequencewhen 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-comprehensionwhen 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-undefinedwhenglobalis used with a class nameCloses #3088
-
Fixed false positive for
unused-variablewhen anonlocalname is assigned as part of a multi-name assignment.Closes #3781
-
Fixed a crash in
unspecified-encodingchecker when providingNoneto themodeargument of anopen()call.Closes #5731
-
Fixed a crash involving a
NewTypenamed with an f-string.Closes #5770 Ref PyCQA/astroid#1400
-
Improved
bad-open-modemessage when providingNoneto themodeargument of anopen()call.Closes #5733
-
Added
lru-cache-decorating-methodchecker with checks for the use offunctools.lru_cacheon 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 PyCQA/astroid#1392
-
Fixed false positive for
unused-argumentwhen a method overridden in a subclass does nothing with the value of a keyword-only argument.Closes #5771 Ref PyCQA/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. See
Confusable Characters in PEP 672 <https://www.python.org/dev/peps/pep-0672/#confusable-characters-in-identifiers>_ -
When run in parallel mode
pylintnow pickles the data passed to subprocesses with thedillpackage. Thedillpackage has therefore been added as a dependency. -
An astroid issue where symlinks were not being taken into account was fixed
Closes #1470 Closes #3499 Closes #4302 Closes #4798 Closes #5081
-
Fix a crash in
unused-private-memberchecker when analyzing code usingtype(self)in bound methods.Closes #5569
-
Optimize parsing of long lines when
missing-final-newlineis enabled.Closes #5724
-
Fix false positives for
used-before-assignmentfrom using named expressions in a ternary operator test and using that expression as a call argument. -
Fix false positive for
undefined-variablewhennamedtupleclass attributes are used as return annotations.Closes #5568
-
Fix false negative for
undefined-variableand 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-assignmentinstead ofundefined-variablewhen attempting to access unused type annotations.Closes #5713
-
Added confidence level
CONTROL_FLOWfor warnings relying on assumptions about control flow. -
used-before-assignmentnow 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-assignmentwhen a conditional or context manager intervened before the try statement that suggested it might fail.Closes #4045
-
Fixed false negative for
used-before-assignmentin 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-slotwhen the slotted class defined__setattr__.Closes #3793
-
Fixed a false positive for
invalid-class-objectwhen the object being assigned to the__class__attribute is uninferable. -
Fixed false positive for
used-before-assignmentwith 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-assignedwhen thedelstatement 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-Locks.html. This behavior can be reverted by redefining theignore-patternsoption.Closes #367
-
Fixed a false positive for
used-before-assignmentwhen a named expression appears as the first value in a container.Closes #5112
-
used-before-assignmentnow assumes that assignments in except blocks may not have occurred and warns accordingly.Closes #4761
-
When evaluating statements after an except block,
used-before-assignmentassumes that assignments in the except blocks took place if the corresponding try block contained a return statement.Closes #5500
-
Fixed a false negative for
used-before-assignmentwhen some but not all except handlers defined a name relied upon after an except block when the corresponding try block contained a return statement.Closes #5524
-
When evaluating statements in the
elseclause of a loop,used-before-assignmentassumes that assignments in the except blocks took place if the except handlers constituted the only ways for the loop to finish without breaking early.Closes #5683
-
used-before-assignmentnow checks names in try blocks. -
Fixed false positive with
used-before-assignmentfor assignment expressions in lambda statements. -
Fixed a false positive (affecting unreleased development) for
used-before-assignmentinvolving homonyms between filtered comprehensions and assignments in except blocks.Closes #5586
-
Fixed crash with slots assignments and annotated assignments.
Closes #5479
-
Fixed crash on list comprehensions that used
typeas inner variable name.Closes #5461
-
Fixed crash in
use-maxsplit-argchecker when providing thesepargument tostr.split()by keyword.Closes #5737
-
Fix false positive for
unused-variablefor a comprehension variable matching an outer scope type annotation.Closes #5326
-
Fix false negative for
undefined-variablefor a variable used multiple times in a comprehension matching an unused outer scope type annotation.Closes #5654
-
Some files in
pylint.testutilswere deprecated. In the future imports should be done from thepylint.testutils.functionalnamespace directly. -
Fixed false positives for
no-value-for-parameterwith variadic positional arguments.Closes #5416
-
safe_inferno longer makes an inference when given two function definitions with differing numbers of arguments.Closes #3675
-
Fix
comparison-with-callablefalse positive for callables that raise, such as typing constants.Closes #5557
-
Fixed a crash on
__init__nodes when the attribute was previously uninferable due to a cache limit size. This limit can be hit when the inheritance pattern of a class (and therefore of the__init__attribute) is very large.Closes #5679
-
Fix false positive for
used-before-assignmentfrom a class definition nested under a function subclassing a class defined outside the function.Closes #4590
-
Fix
unnecessary_dict_index_lookupfalse positive when deleting a dictionary's entry.Closes #4716
-
Fix false positive for
used-before-assignmentwhen an except handler shares a name with a test in a filtered comprehension.Closes #5817
-
Fix crash in
unnecessary-dict-index-lookupchecker if the output ofitems()is assigned to a 1-tuple.Closes #5504
-
When invoking
pylint,epylint,symilarorpyreverseby importing them in a python file you can now pass anargvkeyword besides patchingsys.argv.Closes #5320
-
The
PyLinterclass will now be initialized with aTextReporteras its reporter if none is provided. -
Fix
super-init-not-calledwhen parent orselfis aProtocolCloses #4790
-
Fix false positive
not-callablewith attributes that aliasNamedTuplePartially closes #1730
-
Emit
redefined-outer-namewhen a nested except handler shadows an outer one. -
Fix false positive
super-init-not-calledfor classes that inherit theirinitfrom a parent.Closes #4941
-
encodingcan now be supplied as a positional argument to calls that open files without triggeringunspecified-encoding.Closes #5638
-
Fatal errors now emit a score of 0.0 regardless of whether the linted module contained any statements
Closes #5451
-
fatalwas added to the variables permitted in score evaluation expressions. -
The default score evaluation now uses a floor of 0.
Closes #2399
-
Fix false negative for
consider-iterating-dictionaryduring membership checks encapsulated in iterables ornot inchecksCloses #5323
-
Fixed crash on uninferable decorators on Python 3.6 and 3.7
-
Add checker
unnecessary-ellipsis: Emitted when the ellipsis constant is used unnecessarily.Closes #5460
-
Disable checker
bad-docstring-quotesfor Python <= 3.7, because in these versions the line numbers for decorated functions and classes are not reliable which interferes with the checker.Closes #3077
-
Fixed incorrect classification of Numpy-style docstring as Google-style docstring for docstrings with property setter documentation. Docstring classification is now based on the highest amount of matched sections instead of the order in which the docstring styles were tried.
-
Fixed detection of
arguments-differwhen superclass static methods lacked a@staticmethoddecorator.Closes #5371
-
TypingChecker-
Added new check
broken-noreturnto detect broken uses oftyping.NoReturnifpy-versionis set to Python3.7.1or below. https://bugs.python.org/issue34921 -
Added new check
broken-collections-callableto detect broken uses ofcollections.abc.Callableifpy-versionis set to Python3.9.1or below. https://bugs.python.org/issue42965
-
-
The
testutilsfor unittests now acceptend_linenoandend_column. Tests without these will trigger aDeprecationWarning. -
arguments-differwill no longer complain about method redefinitions with extra parameters that have default values. -
Fixed false positive
unexpected-keyword-argfor decorators.Closes #258
-
Importing the deprecated stdlib module
xml.etree.cElementTreenow emitsdeprecated_module.Closes #5862
-
Disables for
deprecated-moduleand similar warnings for stdlib features deprecated in newer versions of Python no longer raiseuseless-suppressionwhen linting with older Python interpreters where those features are not yet deprecated. -
Importing the deprecated stdlib module
distutilsnow emitsdeprecated_moduleon Python 3.10+. -
missing-raises-docwill now check the class hierarchy of the raised exceptions.. code-block:: python
def my_function() """My function.
Raises: Exception: if something fails """ raise ValueErrorCloses #4955
-
Allow disabling
duplicate-codewith a disable comment when running through pylint.Closes #214
-
Improve
invalid-namecheck forTypeVarnames. The accepted pattern can be customized with--typevar-rgx.Closes #3401
-
Added new checker
typevar-name-missing-variance. Emitted when a covariant or contravariantTypeVardoes not end with_coor_contrarespectively or when aTypeVaris not either but has a suffix. -
Allow usage of mccabe 0.7.x release
Closes #5878
-
Fix
unused-private-memberfalse positive when accessing private methods throughproperty.Closes #4756
v2.12.2
-
Fixed a false positive for
unused-importwhere everything was not analyzed properly inside typing guards. -
Fixed a false-positive regression for
used-before-assignmentfor typed variables in the body of class methods that reference the same classCloses #5342
-
Specified that the
ignore-pathsoption considers "" to represent a windows directory delimiter instead of a regular expression escape character. -
Fixed a crash with the
ignore-pathsoption 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
endLineandendColumnkeys 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 for
missing-param-doc.Closes #5452
-
Fix false negative for
consider-iterating-dictionaryduring membership checks encapsulated in iterables ornot inchecksCloses #5323
-
unused-importnow check all ancestors for typing guardsCloses #5316
v2.12.1: 2.12.1
-
Require Python
3.6.2to run pylint.Closes #5065
v2.12.0: 2.12.0
-
Upgrade astroid to 2.9.0
Closes #4982
-
Add ability to add
end_lineandend_columnto the--msg-templateoption. With the standardTextReporterthis 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 graphizmessage which isn't needed for puml output format. -
MessageTestof the unittesttestutilnow requires theconfidenceattribute to match the expected value. If none is provided it is set toUNDEFINED. -
add_messageof the unittesttestutilnow actually handles thecol_offsetparameter and allows it to be checked against actual output in a test. -
Fix a crash in the
check_elifextensions 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-expressionwhen condition can be inferred as False.Closes #5200
-
Fix exception when pyreverse parses
property functionof a class. -
The functional
testutilsnow acceptend_linenoandend_column. Expected output files without these will trigger aDeprecationWarning. Expected output files can be easily updated with thepython tests/test_functional.py --update-functional-outputcommand. -
The functional
testutilsnow correctly check the distinction betweeenHIGHandUNDEFINEDconfidence. Expected output files without defiendconfidencelevels will now trigger aDeprecationWarning. Expected output files can be easily updated with thepython tests/test_functional.py --update-functional-outputcommand. -
The functional test runner now supports the option
min_pyver_end_positionto control on which python versions theend_linenoandend_columnattributes should be checked. The default value is 3.8. -
Fix
accept-no-yields-docandaccept-no-return-docnot allowing missingyieldorreturndocumentation when a docstring is partially correctCloses #5223
-
Add an optional extension
consider-using-any-or-all: Emitted when aforloop only produces a boolean and could be replaced byanyorallusing 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-docCloses #3799
-
Add checkers
overridden-final-method&subclassed-final-classCloses #3197
-
Fixed
protected-accessfor accessing of attributes and methods of inner classesCloses #3066
-
Added support for
ModuleNotFoundError(import-errorandno-name-in-module).ModuleNotFoundErrorinherits fromImportErrorand was added in Python3.6 -
undefined-variablenow correctly flags variables which only receive a type annotations and never get assigned a valueCloses #5140
-
undefined-variablenow correctly considers the line numbering and order of classes used in metaclass declarationsCloses #4031
-
used-before-assignmentnow correctly considers references to classes as type annotation or default values in first-level methodsCloses #3771
-
undefined-variableandunused-variablenow correctly trigger for assignment expressions in functions defaultsFixes part of #3688
-
undefined-variablenow 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-extensionscommand 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-importmessageCloses #3859
-
In length checker,
len-as-conditionhas been renamed asuse-implicit-booleaness-not-lenin order to be consistent withuse-implicit-booleaness-not-comparison. -
Created new
UnsupportedVersionCheckerchecker class that includes checks for features not supported by all versions indicated by apy-version.- Added
using-f-string-in-unsupported-versionchecker. Issued whenpy-versionis set to a version that does not support f-strings (< 3.6)
- Added
-
Fix
useless-super-delegationfalse positive when default keyword argument is a variable. -
Properly emit
duplicate-keywhen Enum members are duplicate dictionary keysCloses #5150
-
Use
py-versionsetting for alternative union syntax check (PEP 604), instead of the Python interpreter version. -
Subclasses of
dictare regarded as reversible by thebad-reversed-sequencechecker (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-docnow correctly parses asterisks for variable length and keyword parametersCloses #3733
-
mising-param-docnow correctly handles Numpy parameter documentation without explicit typingCloses #5222
-
pylintno 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-pathsoption to allow both Posix and Windows pathsCloses #5194
-
Fix double emitting of
not-callableon inferrablepropertiesCloses #4426
-
self-cls-assignmentnow also considers tuple assignment -
Fix
missing-function-docstringnot being able to check__init__and other magic methods even if theno-docstring-rgxsetting was set to do so -
Added
using-final-decorator-in-unsupported-versionchecker. Issued whenpy-versionis set to a version that does not supporttyping.final(< 3.8) -
Added configuration option
exclude-too-few-public-methodsto allow excluding classes from themin-public-methodschecker.Closes #3370
-
The
--jobsparameter now fallbacks to 1 if the host operating system does not have functioning shared semaphore implementation.Closes #5216
-
Fix crash for
unused-private-memberwhen 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-constantto its own extensioncomparison_placement. This checker was opinionated and now no longer a default. It can be reactived by addingpylint.extensions.comparison_placementtoload-pluginsin your config.Closes #1064
-
A new
bad-configuration-sectionchecker 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-accesson (outer) class traversal -
Added new checker
useless-with-lockto 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
TrueandFalsein config files. -
Fix crash on
open()calls when themodeargument 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-stringifpy-versionis set to Python <3.6.f-stringswere added in Python3.6Closes #5019
-
Fix regression for
unspecified-encodingwithpathlib.Path.read_text()Closes #5029
-
Don't emit
consider-using-f-stringif the variables to be interpolated include a backslash -
Fixed false positive for
cell-var-from-loopwhen variable is used as the default value for a keyword-only parameter.Closes #5012
-
Fix false-positive
undefined-variablewithLambda,IfExp, and assignment expression. -
Fix false-positive
useless-suppressionforwrong-import-orderCloses #2366
-
Fixed
tomldependency issueCloses #5066
-
Fix false-positive
useless-suppressionforline-too-longCloses #4212
-
Fixed
invalid-namenot checking parameters of overwritten baseobjectmethodsCloses #3614
-
Fixed crash in
consider-using-f-stringifformatis not calledCloses #5058
-
Fix crash with
AssignAttrinif TYPE_CHECKINGblocks.Closes #5111
-
Improve node information for
invalid-nameon function argument. -
Prevent return type checkers being called on functions with ellipses as body
Closes #4736
-
Add
is_sys_guardandis_typing_guardhelper functions from astroid topylint.checkers.utils. -
Fix regression on ClassDef inference
-
Fix regression on Compare node inference
Closes #5048
-
Fix false-positive
isinstance-second-argument-not-valid-typewithtyping.Callable. -
It is now recommended to do
pylintdevelopment onPython3.8 or higher. This allows using the latestastparser. -
All standard jobs in the
pylintCI now run onPython3.8 by default. We still support python 3.6 and 3.7 and run tests for those interpreters. -
TypingChecker- Fix false-negative for
deprecated-typing-aliasandconsider-using-aliaswithtyping.Type+typing.Callable.
- Fix false-negative for
v2.11.1
-
unspecified-encodingnow checks the encoding ofpathlib.Path()correctlyCloses #5017
v2.11.0
-
The python3 porting mode checker and it's
py3koption were removed. You can still find it in older pylint versions. -
raising-bad-typeis now properly emitted when raising a string -
Added new extension
SetMembershipCheckerwithuse-set-for-membershipcheck: Emitted when using an in-place definedlistortupleto do a membership test.setsare better optimized for that.Closes #4776
-
Added
py-versionconfig 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-withif 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-redefinedfor simple type annotationsCloses #4936
-
Fix false positive for
protected-accessif a protected member is used in type hints of function definitions -
Fix false positive
dict-iter-missing-itemsfor dictionaries only using tuples as keysCloses #3282
-
The
unspecified-encodingchecker now also checks calls topathlib.Path().read_text()andpathlib.Path().write_text()Closes #4945
-
Fix false positive
superfluous-parensfor tuples created with inner tuplesCloses #4907
-
Fix false positive
unused-private-memberfor accessing attributes in a class usingclsCloses #4849
-
Fix false positive
unused-private-memberfor private staticmethods accessed in classmethods.Closes #4849
-
Extended
consider-using-incheck to work for attribute access. -
Setting
min-similarity-linesto 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-assignedchecker 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-useanddocparams extensionfor async functions and methods. -
Add documentation for
pyreverseandsymilarCloses #4616
-
Non symbolic messages with the wrong capitalisation now correctly trigger
use-symbolic-message-insteadCloses #5000
-
The
consider-iterating-dictionarychecker now also considers membership checksCloses #4069
-
The
invalid-namemessage is now more detailed when using multiple naming style regexes.
v2.10.2
-
We now use platformdirs instead of appdirs since the latter is not maintained.
Closes #4886
-
Fix a crash in the checker raising
shallow-copy-environwhen failing to infer oncopy.copyCloses #4891
v2.10.1
-
pylint does not crash when PYLINT_HOME does not exist.
Closes #4883
v2.10.0
-
pyreverse: add option to produce colored output.
Closes #4488
-
pyreverse: add output in PlantUML format.
Closes #4498
-
consider-using-withis no longer triggered if a context manager is returned from a function.Closes #4748
-
pylint does not crash with a traceback anymore when a file is problematic. It creates a template text file for opening an issue on the bug tracker instead. The linting can go on for other non problematic files instead of being impossible.
-
pyreverse: Show class has-a relationships inferred from the type-hint
Closes #4744
-
Fixed a crash when importing beyond the top level package during
import-errormessage creationCloses #4775
-
Added
ignored-parentsoption to the design checker to ignore specific classes from thetoo-many-ancestorscheck (R0901).Partially closes #3057
-
Added
unspecified-encoding: Emitted when open() is called without specifying an encodingCloses #3826
-
Improved the Similarity checker performance. Fix issue with
--min-similarity-linesused with--jobs. -
Don't emit
no-membererror if guarded behind if statement. -
The default for
PYLINTHOMEis now the standardXDG_CACHE_HOME, and pylint now usesappdirs.Closes #3878
-
Added
use-list-literal: Emitted whenlist()is called with no arguments instead of using[]Closes #4365
-
Added
use-dict-literal: Emitted whendict()is called with no arguments instead of using{}Closes #4365
-
Added optional extension
consider-ternary-expression: Emitted whenever a variable is assigned in both branches of an if/else block.Closes #4366
-
Added optional extension
while-used: Emitted whenever awhileloop is used.Closes #4367
-
Added
forgotten-debug-statement: Emitted whenbreakpoint,pdb.set_traceorsys.breakpointhookcalls are foundCloses #3692
-
Fix false-positive of
unused-private-memberwhen using nested functions in a classCloses #4673
-
Fix crash for
unused-private-memberthat occurred with nested attributes.Closes #4755
-
Fix a false positive for
unused-private-memberwith class namesCloses #4681
-
Fix false positives for
superfluous-parenswith walrus operator, ternary operator and inside list comprehension. -
Added
format-string-without-interpolationchecker: Emitted when formatting is applied to a string without any variables to be replacedCloses #4042
-
Refactor of
--list-msgs&--list-msgs-enabled: both options now show whether messages are emittable with the current interpreter.Closes #4778
-
Fix false negative for
used-before-assignmentwhen the variable is assigned in an exception handler, but used outside of the handler.Closes #626
-
Added
disable-nextoption: allows using# pylint: disable-next=msgidto disable a message for the following lineCloses #1682
-
Added
redundant-u-string-prefixchecker: Emitted when the u prefix is added to a stringCloses #4102
-
Fixed
cell-var-from-loopchecker: handle cell variables in comprehensions within functions, and function default argument expressions. Also handle basic variable shadowing. -
Fixed bug with
cell-var-from-loopchecker: it no longer has false negatives when bothunused-variableandused-before-assignmentare disabled. -
Fix false postive for
invalid-all-formatif the list or tuple builtin functions are usedCloses #4711
-
Config files can now contain environment variables
Closes #3839
-
Fix false-positive
used-before-assignmentwith an assignment expression in aReturnnodeCloses #4828
-
Added
use-sequence-for-iteration: Emitted when iterating over an in-place definedset. -
CodeStyleChecker-
Limit
consider-using-tupleto be emitted only for in-place definedlists. -
Emit
consider-using-tupleeven if list contains astarredexpression.
-
-
Ignore decorators lines by similarities checker when ignore signatures flag enabled
Closes #4839
-
Allow
trueandfalsevalues inpylintrcfor better compatibility withtomlconfig. -
Class methods' signatures are ignored the same way as functions' with similarities "ignore-signatures" option enabled
Closes #4653
-
Improve performance when inferring
Callnodes, by utilizing caching. -
Improve error message for invalid-metaclass when the node is an Instance.
v2.9.6
-
Fix a false positive
undefined-variablewhen variable name in decoration matches function argumentCloses #3791
v2.9.5
-
Fix a crash when there would be a 'TypeError object does not support item assignment' in the code we parse.
Closes #4439
-
Fix crash if a callable returning a context manager was assigned to a list or dict item
Closes #4732
-
Fix a crash when a AttributeInferenceError was not handled properly when failing to infer the real name of an import in astroid.
Closes #4692
v2.9.4
-
Added
time.clockto deprecated functions/methods for python 3.3 -
Fix bug in which --fail-on can return a zero exit code even when the specified issue is present
-
Fix hard failure when handling missing attribute in a class with duplicated bases
Closes #4687
-
Fix false-positive
consider-using-with(R1732) if a ternary conditional is used together withwithCloses #4676
-
Fix false-positive
deprecated-modulewhen relative import uses deprecated module name.Closes #4629
-
Fix false-positive
consider-using-with(R1732) ifcontextlib.ExitStacktakes care of calling the__exit__methodCloses #4654
-
Fix a false positive for
unused-private-memberwhen mutating a private attribute withclsCloses #4657
-
Fix ignored empty functions by similarities checker with "ignore-signatures" option enabled
Closes #4652
-
Fix false-positive of
use-maxsplit-argwhen index is incremented in a loopCloses #4664
-
Don't emit
cyclic-importmessage if import is guarded bytyping.TYPE_CHECKING.Closes #3525
-
Fix false-positive
not-callablewith alternativeTypedDictsyntaxCloses #4715
-
Clarify documentation for consider-using-from-import
-
Don't emit
unreachablewarning for empty generator functionsCloses #4698
-
Don't emit
import-error,no-name-in-module, andungrouped-importsfor imports guarded bysys.version_infoortyping.TYPE_CHECKING. -
Fix
invalid-overridden-methodwith nested propertyCloses #4368
-
Fix false-positive of
unused-private-memberwhen using__new__in a classCloses #4668
-
No longer emit
consider-using-withforThreadPoolExecutorandProcessPoolExecutoras they have legitimate use cases without awithblock.Closes #4689
-
Fix crash when inferring variables assigned in match patterns
Closes #4685
-
Fix a crash when a StopIteration was raised when inferring a faulty function in a context manager.
Closes #4723
v2.9.3
-
Fix a crash that happened when analyzing empty function with docstring in the
similaritychecker.Closes #4648
-
The
similaritychecker no longer add three trailing whitespaces for empty lines in its report.
v2.9.2
-
Fix a crash that happened when analysing code using
type(self)to access a class attribute in theunused-private-memberchecker.Closes #4638
-
Fix a false positive for
unused-private-memberwhen accessing a private variable withselfCloses #4644
-
Fix false-positive of
unnecessary-dict-index-lookupandconsider-using-dict-itemsfor reassigned dict index lookupsCloses #4630
v2.9.1
v2.9.0
-
Python 3.10 is now supported.
-
Add type annotations to pyreverse dot files
Closes #1548
-
Fix missing support for detecting deprecated aliases to existing functions/methods.
Closes #4618
-
astroid has been upgraded to 2.6.1
-
Added various deprecated functions/methods for python 3.10, 3.7, 3.6 and 3.3
-
Fix false positive
useless-type-docon ignored argument usingpylint.extensions.docparamswhen a function was typed using pep484 but not inside the docstring. -
setuptools_scmhas been removed and replaced bytbumpin order to not have hidden runtime dependencies to setuptools -
Fix a crash when a test function is decorated with
@pytest.fixtureand astroid can't infer the name of the decorator when usingopenwithoutwith.Closes #4612
-
Added
deprecated-decorator: Emitted when deprecated decorator is used.Closes #4429
-
Added
ignore-pathsbehaviour. Defined regex patterns are matched against full file path.Close #2541
-
Fix false negative for
consider-using-withif calls likeopen()were used outside of assignment expressions. -
The warning for
arguments-differnow signals explicitly the difference it detected by naming the argument or arguments that changed and the type of change that occurred. -
Suppress
consider-using-withinside context managers.Closes #4430
-
Added
--fail-onoption to return non-zero exit codes regardless of--fail-undervalue. -
numversion tuple contains integers again to fix multiple pylint's plugins that relied on it
Closes #4420
-
Fix false-positive
too-many-ancestorswhen inheriting from builtin classes, especially from thecollections.abcmodule -
Stdlib deprecated modules check is moved to stdlib checker. New deprecated modules are added.
-
Fix raising false-positive
no-memberon abstract properties -
Created new error message called
arguments-renamedwhich identifies any changes at the parameter names of overridden functions.Closes #3536
-
New checker
consider-using-dict-items. Emitted when iterating over dictionary keys and then indexing the same dictionary with the key within loop body.Closes #3389
-
Don't emit
import-errorif import guarded behindif sys.version_info >= (x, x) -
Fix incompatibility with Python 3.6.0 caused by
typing.Counterandtyping.NoReturnusageCloses #4412
-
New checker
use-maxsplit-arg. Emitted either when accessing only the first or last element ofstr.split().Closes #4440
-
Add ignore_signatures to duplicate code checker
Closes #3619
-
Fix documentation errors in "Block disables" paragraph of User Guide.
-
New checker
unnecessary-dict-index-lookup. Emitted when iterating over dictionary items (key-value pairs) and accessing the value by index lookup.Closes #4470
-
New checker
consider-using-from-import. Emitted when a submodule/member of a package is imported and aliased with the same name.Closes #2309
-
Allow comma-separated list in
output-formatand separate output files for each specified format.Closes #1798
-
Make
using-constant-testdetect constant tests consisting of list literals like[]and[1, 2, 3]. -
Improved error message of
unnecessary-comprehensionchecker by providing code suggestion.Closes #4499
-
New checker
unused-private-member. Emitted when a private member (i.e., starts with__) of a class is defined but not used.Closes #4483
-
Fix false negative of
consider-using-enumeratewhen iterating over an attribute.Closes #3657
-
New checker
invalid-class-object. Emitted when a non-class is assigned to a__class__attribute.Closes #585
-
Fix a crash when a plugin from the configuration could not be loaded and raise an error 'bad-plugin-value' instead
Closes #4555
-
Added handling of floating point values when parsing configuration from pyproject.toml
Closes #4518
-
invalid-length-returned, now also works when nothing at all is returned following an upgrade in astroid. -
logging-format-interpolationandlogging-not-lazy, now works on logger class created from renamed logging import following an upgrade in astroid. -
Fix false-positive
no-memberwith generic base classCloses PyCQA/astroid#942
-
Fix
assigning-non-slotfalse-positive with base that inherits fromtyping.GenericCloses #4509 Closes PyCQA/astroid#999
-
New checker
invalid-all-format. Emitted when__all__has an invalid format, i.e. isn't atupleorlist. -
Fix false positive
unused-variableandundefined-variablewith Pattern Matching in Python 3.10 -
New checker
await-outside-async. Emitted when await is used outside an async function. -
Clarify documentation for
typingextension.Closes #4545
-
Add new extension
CodeStyleChecker. It includes checkers that can improve code consistency. As such they don't necessarily provide a performance benefit and are often times opinionated. -
New checker
consider-using-tuple. Emitted when an in-place defined list or set can be replaced by a tuple. -
New checker
consider-using-namedtuple-or-dataclass. Emitted when dictionary values can be replaced by namedtuples or dataclass instances. -
Fix error that occurred when using
sliceas subscript for dict. -
Reduce false-positives around inference of
.valueand.nameproperties onEnumsubclasses, following an upgrade in astroid -
Fix issue with
cached_propertythat causedinvalid-overridden-methoderror when overriding aproperty.Closes #4023
-
Fix
unused-importfalse positive for imported modules referenced in attribute lookups in type comments.Closes #4603
v2.8.3
Pin astroid to 2.5.6 for pylint 2.8.3
v2.8.2
-
Keep
__pkginfo__.numversiona tuple to avoid breaking pylint-django.Closes #4405
-
scm_setuptools has been added to the packaging.
-
Pylint's tags are now the standard form
vX.Y.Zand notpylint-X.Y.Zanymore.
v2.8.1
-
Add numversion back (temporarily) in
__pkginfo__because it broke Pylama and revert the unnecessarypylint.versionbreaking change.Closes #4399
v2.8.0
-
New refactoring message
consider-using-with. This message is emitted if resource-allocating functions or methods of the standard library (likeopen()orthreading.Lock.acquire()) that can be used as a context manager are called without awithblock.Closes #3413
-
Resolve false positives on unused variables in decorator functions
Closes #4252
-
Add new extension
ConfusingConsecutiveElifChecker. This optional checker emits a refactoring message (R5601confusing-consecutive-elif) if if/elif statements with different indentation levels follow directly one after the other. -
New option
--output=<file>to output result to a file rather than printing to stdout.Closes #1070
-
Use a prescriptive message for
unidiomatic-typecheckCloses #3891
-
Apply
const-naming-styleto module constants annotated withtyping.Final -
The packaging is now done via setuptools exclusively.
doc,tests,man,elispandChangelogare not packaged anymore - reducing the size of the package by 75%. -
Debian packaging is now (officially) done in https://salsa.debian.org/python-team/packages/pylint.
-
The 'doc' extra-require has been removed.
-
__pkginfo__now only contain__version__(also accessible withpylint.__version__), other meta-information are still accessible withimport importlib;metadata.metadata('pylint'). -
COPYING has been renamed to LICENSE for standardization.
-
Fix false-positive
used-before-assignmentin function returns.Closes #4301
-
Updated
astroidto 2.5.3 -
Add
consider-using-min-max-builtincheck for if statement which could be replaced by Python builtin min or maxCloses #3406
-
Don't auto-enable postponed evaluation of type annotations with Python 3.10
-
Update
astroidto 2.5.4 -
Add new extension
TypingChecker. This optional checker can detect the use of deprecated typing aliases and can suggest the use of the alternative union syntax where possible. (For example, 'typing.Dict' can be replaced by 'dict', and 'typing.Unions' by '|', etc.) Make sure to check the config options if you plan on using it! -
Reactivates old counts in report mode.
Closes #3819
-
During detection of
inconsistent-return-statementsconsider thatassert Falseis a return node.Closes #4019
-
Run will not fail if score exactly equals
config.fail_under. -
Functions that never returns may declare
NoReturnas type hints, so thatinconsistent-return-statementsis not emitted. -
Improved protected access checks to allow access inside class methods
Closes #1159
-
Fix issue with PEP 585 syntax and the use of
collections.abc.Set -
Fix issue that caused class variables annotated with
typing.ClassVarto be identified as class constants. Now, class variables annotated withtyping.Finalare identified as such.Closes #4277
-
Continuous integration with read the doc has been added.
Closes #3850
-
Don't show
DuplicateBasesErrorfor attribute access -
Fix crash when checking
setup.cfgfor pylint config when there are non-ascii characters in thereCloses #4328
-
Allow code flanked in backticks to be skipped by spellchecker
Closes #4319
-
Allow Python tool directives (for black, flake8, zimports, isort, mypy, bandit, pycharm) at beginning of comments to be skipped by spellchecker
Closes #4320
-
Fix issue that caused emacs pylint to fail when used with tramp
-
Improve check for invalid PEP 585 syntax inside functions if postponed evaluation of type annotations is enabled
-
Improve check for invalid PEP 585 syntax as default function arguments
v2.7.4
-
Fix a problem with disabled msgid not being ignored
Closes #4265
-
Fix issue with annotated class constants
- Closes #4264
v2.7.3
-
Introduce logic for checking deprecated attributes in DeprecationMixin.
-
Reduce usage of blacklist/whitelist terminology. Notably,
extension-pkg-allow-listis an alternative toextension-pkg-whitelistand the messageblacklisted-nameis now emitted asdisallowed-name. The previous names are accepted to maintain backward compatibility. -
Move deprecated checker to
DeprecatedMixinCloses #4086
-
Bump
astroidversion to2.5.2 -
Fix false positive for
method-hiddenwhen using private attribute and methodCloses #3936
-
use-symbolic-message-insteadnow also works on legacy messages likeC0111(missing-docstring). -
Remove unwanted print to stdout from
_emit_no_member -
Introduce a command-line option to specify pyreverse output directory
Closes #4159
-
Fix issue with Enums and
class-attribute-naming-style=snake_caseCloses #4149
-
Add
allowed-redefined-builtinsoption for fine tuningredefined-builtincheck.Close #3263
-
Fix issue when executing with
python -m pylintCloses #4161
-
Exempt
typing.TypedDictfromtoo-few-public-methodscheck.Closes #4180
-
Fix false-positive
no-memberfor typed annotations without default value.Closes #3167
-
Add
--class-const-naming-stylefor Enum constants and class variables annotated withtyping.ClassVarCloses #4181
-
Fix astroid.Inference error for undefined-variables with ``len()```
Closes #4215
-
Fix column index on FIXME warning messages
Closes #4218
-
Improve handling of assignment expressions, better edge case handling
-
Improve check if class is subscriptable PEP585
-
Fix documentation and filename handling of --import-graph
-
Fix false-positive for
unused-importon class keyword argumentsCloses #3202
-
Fix regression with plugins on PYTHONPATH if latter is cwd
Closes #4252
v2.7.2
-
Fix False Positive on
Enum.__members__.items(),Enum.__members__.values, andEnum.__members__.keysCloses #4123 -
Properly strip dangerous sys.path entries (not just the first one)
Closes #3636
v2.7.1
-
Expose
UnittestLinterin pylint.testutils -
Don't check directories starting with '.' when using register_plugins
Closes #4119
v2.7.0
-
Introduce DeprecationMixin for reusable deprecation checks.
Closes #4049
-
Fix false positive for
builtin-not-iteratingwhenmapreceives iterableCloses #4078
-
Python 3.6+ is now required.
-
Fix false positive for
builtin-not-iteratingwhenzipreceives iterable -
Add
nan-comparisoncheck for NaN comparisons -
Bug fix for empty-comment message line number.
Closes #4009
-
Only emit
bad-reversed-sequenceon dictionaries if below py3.8Closes #3940
-
Handle class decorators applied to function.
Closes #3882
-
Add check for empty comments
-
Fix minor documentation issue in contribute.rst
-
Enums are now required to be named in UPPER_CASE by
invalid-name.Close #3834
-
Add missing checks for deprecated functions.
-
Postponed evaluation of annotations are now recognized by default if python version is above 3.10
Closes #3992
-
Fix column metadata for anomalous backslash lints
-
Drop support for Python 3.5
-
Add support for pep585 with postponed evaluation
Closes #3320
-
Check alternative union syntax - PEP 604
Closes #4065
-
Fix multiple false positives with assignment expressions
-
Fix TypedDict inherit-non-class false-positive Python 3.9+
Closes #1927
-
Fix issue with nested PEP 585 syntax
-
Fix issue with nested PEP 604 syntax
-
Fix a crash in
undefined-variablecaused by chained attributes in metaclassClose #3742
-
Fix false positive for
not-async-context-managerwhencontextlib.asynccontextmanageris usedClose #3862
-
Fix linter multiprocessing pool shutdown (triggered warnings when runned in parallels with other pytest plugins)
Closes #3779
-
Fix a false-positive emission of
no-self-useandunused-argumentfor methods of generic structural types (Protocol[T])Closes #3885
-
Fix bug that lead to duplicate messages when using
--jobs 2or more.Close #3584
-
Adds option
check-protected-access-in-special-methodsin the ClassChecker to activate/deactivateprotected-accessmessage emission for single underscore prefixed attribute in special methods.Close #3120
-
Fix vulnerable regular expressions in
pyreverseClose #3811
-
inconsistent-return-statementsmessage is now emitted if one oftry/exceptstatement is not returning explicitly while the other do.Closes #3468
-
Fix
useless-super-delegationfalse positive when default keyword argument is a dictionnary.Close #3773
-
Fix a crash when a specified config file does not exist
-
Add support to
ignored-argument-namesin DocstringParameterChecker and addsuseless-param-docanduseless-type-docmessages.Close #3800
-
Enforce docparams consistently when docstring is not present
Close #2738
-
Fix
duplicate-codefalse positive when lines only contain whitespace and non-alphanumeric characters (e.g. parentheses, bracket, comman, etc.) -
Improve lint message for
singleton-comparisonwith bools -
Fix spell-checker crash on indented docstring lines that look like # comments
Close #3786
-
Fix AttributeError in checkers/refactoring.py
-
Improve sphinx directives spelling filter
-
Fix a bug with postponed evaluation when using aliases for annotations.
Close #3798
-
Fix minor documentation issues
-
Improve the performance of the line length check.
-
Removed incorrect deprecation of
inspect.getfullargspec -
Fix
signature-differsfalse positive for functions with variadicsClose #3737
-
Fix a crash in
consider-using-enumeratewhen encounteringrange()without argumentsClose #3735
-
len-as-conditionsis now triggered only for classes that are inheriting directly from list, dict, or set and not implementing the__bool__function, or from generators like range or list/dict/set comprehension. This should reduce the false positives for other classes, like pandas's DataFrame or numpy's Array.Close #1879
-
Fixes duplicate-errors not working with -j2+
Close #3314
-
generated-membersnow matches the qualified name of membersClose #2498
-
Add check for bool function to
len-as-condition -
Add
simplifiable-conditioncheck for extraneous constants in conditionals using and/or. -
Add
condition-evals-to-constantcheck for conditionals using and/or that evaluate to a constant.Close #3407
-
Changed setup.py to work with distlib
Close #3555
-
New check:
consider-using-generatorThis check warns when a comprehension is used inside an
anyorallfunction, since it is unnecessary and should be replaced by a generator instead. Using a generator would be less code and way faster.Close #3165
-
Add Github Actions to replace Travis and AppVeyor in the future
v2.6.2
-
Astroid version has been set as < 2.5
Close #4093
v2.6.0
-
Fix various scope-related bugs in
undefined-variablechecker -
bad-continuation and bad-whitespace have been removed, black or another formatter can help you with this better than Pylint
Close #246, #289, #638, #747, #1148, #1179, #1943, #2041, #2301, #2304, #2944, #3565
-
The no-space-check option has been removed. It's no longer possible to consider empty line like a
trailing-whitespaceby using clever optionsClose #1368
-
missing-kwoais no longer emitted when dealing with overload functionsClose #3655
-
mixed-indentation has been removed, it is no longer useful since TabError is included directly in python3
-
Add
super-with-argumentscheck for flagging instances of Python 2 style super calls. -
Add an faq detailing which messages to disable to avoid duplicates w/ other popular linters
-
Fix superfluous-parens false-positive for the walrus operator
Close #3383
-
Fix
fail-undernot accepting floats -
Fix a bug with
ignore-docstringsignoring all lines in a module -
Fix
pre-commitconfig that could lead to undetected duplicate lines of code -
Fix a crash in parallel mode when the module's filepath is not set
Close #3564
-
Add
raise-missing-fromcheck for exceptions that should have a cause. -
Support both isort 4 and isort 5. If you have pinned isort 4 in your projet requirements, nothing changes. If you use isort 5, though, note that the
known-standard-libraryoption is not interpreted the same in isort 4 and isort 5 (see the migration guide in isort documentation for further details). For compatibility's sake for most pylint users, theknown-standard-libraryoption in pylint now maps toextra-standard-libraryin isort 5. If you really want whatknown-standard-librarynow means in isort 5, you must disable thewrong-import-ordercheck in pylint and run isort manually with a proper isort configuration file.Close #3722
v2.5.3
-
Fix a regression where disable comments that have checker names with numbers in them are not parsed correctly
Close #3666
-
property-with-parametersproperly handles abstract propertiesClose #3600
-
continue-in-finallyno longer emitted on Python 3.8 where it's now validClose #3612
-
Fix a regression where messages with dash are not fully parsed
Close #3604
-
In a TOML configuration file, it's now possible to use rich (non-string) types, such as list, integer or boolean instead of strings. For example, one can now define a list of message identifiers to enable like this::
enable = [ "use-symbolic-message-instead", "useless-suppression", ]
Close #3538
-
Fix a regression where the score was not reported with multiple jobs
Close #3547
-
Protect against
AttributeErrorwhen checkingcell-var-from-loopClose #3646
v2.5.2
-
pylint.Runacceptsdo_exitas a deprecated parameterClose #3590
v2.5.1
-
Fix a crash in
method-hiddenlookup for unknown base classesClose #3527
-
Revert pylint.Run's
exitparameter todo_exitThis has been inadvertently changed several releases ago to
do_exit.Close #3533
-
no-value-for-parametervariadic detection has improved for assign statementsClose #3563
-
Allow package files to be properly discovered with multiple jobs
Close #3524
-
Allow linting directories without
__init__.pywhich was a regression in 2.5.Close #3528
v2.5.0
-
Fix a false negative for
undefined-variablewhen using class attribute in comprehension.Close #3494
-
Fix a false positive for
undefined-variablewhen using class attribute in decorator or as type hint. -
Remove HTML quoting of messages in JSON output.
Close #2769
-
Adjust the
invalid-namerule to work with non-ASCII identifiers and add thenon-ascii-namerule.Close #2725
-
Positional-only arguments are taken in account for
useless-super-delegation -
unidiomatic-typecheckis no longer emitted forinandnot inoperatorsClose #3337
-
Positional-only argument annotations are taken in account for
unused-importClose #3462
-
Add a command to list available extensions.
-
Allow used variables to be properly consumed when different checks are enabled / disabled
Close #3445
-
Fix dangerous-default-value rule to account for keyword argument defaults
Close #3373
-
Fix a false positive of
self-assigning-variableon tuple unpacking.Close #3433
-
no-self-useis no longer emitted for typing stubs.Close #3439
-
Fix a false positive for
undefined-variablewhen__class__is usedClose #3090
-
Emit
invalid-namefor variables defined in loops at module level.Close #2695
-
Add a check for cases where the second argument to
isinstanceis not a type.Close #3308
-
Add 'notes-rgx' option, to be used for fixme check.
Close #2874
-
function-redefinedexempts function redefined on a condition.Close #2410
-
typing.overloadfunctions are exempted from docstring checksClose #3350
-
Emit
invalid-overridden-methodfor improper async def overrides.Close #3355
-
Do not allow
python -m pylint ...to import user codepython -m pylint ...adds the current working directory as the first element ofsys.path. This opens up a potential security hole wherepylintwill import user level code as long as that code resides in modules having the same name as stdlib or pylint's own modules.Close #3386
-
Add
dummy-variables-rgxoption for_redeclared-assigned-namecheck.Close #3341
-
Fixed graph creation for relative paths
-
Add a check for asserts on string literals.
Close #3284
-
not inis considered iterating context for some of the Python 3 porting checkers. -
A new check
inconsistent-quoteswas added. -
Add a check for non string assignment to name attribute.
Close #583
-
__pow__,__imatmul__,__trunc__,__floor__, and__ceil__are recognized as special method names.Close #3281
-
Added errors for protocol functions when invalid return types are detected. E0304 (invalid-bool-returned): bool did not return a bool E0305 (invalid-index-returned): index did not return an integer E0306 (invalid-repr-returned): repr did not return a string E0307 (invalid-str-returned): str did not return a string E0308 (invalid-bytes-returned): bytes did not return a string E0309 (invalid-hash-returned): hash did not return an integer E0310 (invalid-length-hint-returned): length_hint did not return a non-negative integer E0311 (invalid-format-returned): format did not return a string E0312 (invalid-getnewargs-returned): getnewargs did not return a tuple E0313 (invalid-getnewargs-ex-returned): getnewargs_ex did not return a tuple of the form (tuple, dict)
Close #560
-
missing-*-docstringcan look for__doc__assignments.Close #3301
-
undefined-variablecan now find undefined loop iterablesClose #498
-
safe_infercan infer a value as long as all the paths share the same type.Close #2503
-
Add a --fail-under flag, also configurable in a .pylintrc file. If the final score is more than the specified score, it's considered a success and pylint exits with exitcode 0. Otherwise, it's considered a failure and pylint exits with its current exitcode based on the messages issued.
Close #2242
-
Don't emit
line-too-longfor multilines whendisable=line-too-longcomment stands at their endClose #2957
-
Fixed an
AttributeErrorcaused by improper handling ofdataclassesinference inpyreverseClose #3256
-
Do not exempt bare except from
undefined-variableand similar checksIf a node was wrapped in a
TryExcept,pylintwas taking a hint from the except handler when deciding to emit or not a message. We were treating bare except as a fully fledged ignore but only the corresponding exceptions should be handled that way (e.g.NameErrororImportError)Close #3235
-
No longer emit
assignment-from-no-returnwhen a function only raises an exceptionClose #3218
-
Allow import aliases to exempt
import-errorwhen used in type annotations.Close #3178
-
Ellipsis` is exempted frommultiple-statements`` for function overloads.Close #3224
-
No longer emit
invalid-namefor non-constants found at module level.Pylint was taking the following statement from PEP-8 too far, considering all module level variables as constants, which is not what the statement is saying:
Constants are usually defined on a module level and written in all capital letters with underscores separating words. -
Allow
implicit-str-concat-in-sequenceto be emitted for string juxtapositionClose #3030
-
implicit-str-concat-in-sequencewas renamedimplicit-str-concat -
The
jsonreporter no longer bypassesredirect_stdout. Close #3227 -
Move
NoFileError,OutputLine,FunctionalTestReporter,FunctionalTestFile,LintModuleTestand related methods fromtest_functional.pytopylint.testutilsto help testing for 3rd party pylint plugins. -
Can read config from a setup.cfg or pyproject.toml file.
Close #617
-
Fix exception-escape false positive with generators
Close #3128
-
inspect.getargvaluesis no longer marked as deprecated. -
A new check
f-string-without-interpolationwas addedClose #3190
-
Flag mutable
collections.*utilities as dangerous defaultsClose #3183
-
docparamsextension supports multiple types in raises sections.Multiple types can also be separated by commas in all valid sections.
Closes #2729
-
Allow parallel linting when run under Prospector
-
Fixed false positives of
method-hiddenwhen a subclass defines the method that is being hidden.Closes #414
-
Python 3 porting mode is 30-50% faster on most codebases
-
Python 3 porting mode no longer swallows syntax errors
Closes #2956
-
Pass the actual PyLinter object to sub processes to allow using custom PyLinter classes.
PyLinter object (and all its members except reporter) needs to support pickling so the PyLinter object can be passed to worker processes.
-
Clean up setup.py
Make pytest-runner a requirement only if running tests, similar to McCabe.
Clean up the setup.py file, resolving a number of warnings around it.
-
Handle SyntaxError in files passed via
--from-stdinoptionPylint no longer outputs a traceback, if a file, read from stdin, contains a syntaxerror.
-
Fix uppercase style to disallow 3+ uppercase followed by lowercase.
-
Fixed
undefined-variableandunused-importfalse positives when using a metaclass via an attribute.Close #1603
-
Emit
unused-argumentfor functions that partially uses their argument list before raising an exception.Close #3246
-
Fixed
broad_try_clauseextension to check try/finally statements and to check for nested statements (e.g., inside of anifstatement). -
Recognize classes explicitly inheriting from
abc.ABCor having anabc.ABCMetametaclass as abstract. This makes them not trigger W0223.Closes #3098
-
Fix overzealous
arguments-differwhen overridden function uses variadicsNo message is emitted if the overriding function provides positional or keyword variadics in its signature that can feasibly accept and pass on all parameters given by the overridden function.
-
Multiple types of string formatting are allowed in logging functions.
The
logging-fstring-interpolationmessage has been brought back to allow multiple types of string formatting to be used.Close #3361
v2.4.4
-
Exempt all the names found in type annotations from
unused-importThe previous code was assuming that only
typingnames need to be exempted, but we need to do that for the rest of the type comment names as well.Close #3112
-
Relax type import detection for names that do not come from the
typingmoduleClose #3191
v2.4.3
v2.4.2
v2.4.1
v2.4.0
Configuration
- If you want to rebase/retry this MR, check this box
This MR has been generated by Renovate Bot.