chore(deps): update python linters (major)
This MR contains the following updates:
Package | Type | Update | Change |
---|---|---|---|
black (changelog) | dev-dependencies | major |
23.3.0 -> 24.4.2
|
pylint (changelog) | dev-dependencies | major |
2.12.2 -> 3.1.0
|
Release Notes
psf/black (black)
v24.4.2
This is a bugfix release to fix two regressions in the new f-string parser introduced in 24.4.1.
Parser
- Fix regression where certain complex f-strings failed to parse (#4332)
Performance
- Fix bad performance on certain complex string literals (#4331)
v24.4.1
Highlights
- Add support for the new Python 3.12 f-string syntax introduced by PEP 701 (#3822)
Stable style
- Fix crash involving indented dummy functions containing newlines (#4318)
Parser
- Add support for type parameter defaults, a new syntactic feature added to Python 3.13 by PEP 696 (#4327)
Integrations
- Github Action now works even when
git archive
is skipped (#4313)
v24.4.0
Stable style
- Fix unwanted crashes caused by AST equivalency check (#4290)
Preview style
-
if
guards incase
blocks are now wrapped in parentheses when the line is too long. (#4269) - Stop moving multiline strings to a new line unless inside brackets (#4289)
Integrations
- Add a new option
use_pyproject
to the GitHub Actionpsf/black
. This will read the Black version frompyproject.toml
. (#4294)
v24.3.0
Highlights
This release is a milestone: it fixes Black's first CVE security vulnerability. If you run Black on untrusted input, or if you habitually put thousands of leading tab characters in your docstrings, you are strongly encouraged to upgrade immediately to fix CVE-2024-21503.
This release also fixes a bug in Black's AST safety check that allowed Black to make incorrect changes to certain f-strings that are valid in Python 3.12 and higher.
Stable style
- Don't move comments along with delimiters, which could cause crashes (#4248)
- Strengthen AST safety check to catch more unsafe changes to strings. Previous versions of Black would incorrectly format the contents of certain unusual f-strings containing nested strings with the same quote type. Now, Black will crash on such strings until support for the new f-string syntax is implemented. (#4270)
- Fix a bug where line-ranges exceeding the last code line would not work as expected (#4273)
Performance
- Fix catastrophic performance on docstrings that contain large numbers of leading tab characters. This fixes CVE-2024-21503. (#4278)
Documentation
- Note what happens when
--check
is used with--quiet
(#4236)
v24.2.0
Stable style
- Fixed a bug where comments where mistakenly removed along with redundant parentheses (#4218)
Preview style
- Move the
hug_parens_with_braces_and_square_brackets
feature to the unstable style due to an outstanding crash and proposed formatting tweaks (#4198) - Fixed a bug where base expressions caused inconsistent formatting of ** in tenary expression (#4154)
- Checking for newline before adding one on docstring that is almost at the line limit (#4185)
- Remove redundant parentheses in
case
statementif
guards (#4214).
Configuration
- Fix issue where Black would ignore input files in the presence of symlinks (#4222)
-
Black now ignores
pyproject.toml
that is missing atool.black
section when discovering project root and configuration. Since Black continues to use version control as an indicator of project root, this is expected to primarily change behavior for users in a monorepo setup (desirably). If you wish to preserve previous behavior, simply add an empty[tool.black]
to the previously discoveredpyproject.toml
(#4204)
Output
- Black will swallow any
SyntaxWarning
s orDeprecationWarning
s produced by theast
module when performing equivalence checks (#4189)
Integrations
- Add a JSONSchema and provide a validate-pyproject entry-point (#4181)
v24.1.1
Bugfix release to fix a bug that made Black unusable on certain file systems with strict limits on path length.
Preview style
- Consistently add trailing comma on typed parameters (#4164)
Configuration
- Shorten the length of the name of the cache file to fix crashes on file systems that do not support long paths (#4176)
v24.1.0
Highlights
This release introduces the new 2024 stable style (#4106), stabilizing the following changes:
- Add parentheses around
if
-else
expressions (#2278) - Dummy class and function implementations consisting only of
...
are formatted more compactly (#3796) - If an assignment statement is too long, we now prefer splitting on the right-hand side (#3368)
- Hex codes in Unicode escape sequences are now standardized to lowercase (#2916)
- Allow empty first lines at the beginning of most blocks (#3967, #4061)
- Add parentheses around long type annotations (#3899)
- Enforce newline after module docstrings (#3932, #4028)
- Fix incorrect magic trailing comma handling in return types (#3916)
- Remove blank lines before class docstrings (#3692)
- Wrap multiple context managers in parentheses if combined in a single
with
statement (#3489) - Fix bug in line length calculations for power operations (#3942)
- Add trailing commas to collection literals even if there's a comment after the last entry (#3393)
- When using
--skip-magic-trailing-comma
or-C
, trailing commas are stripped from subscript expressions with more than 1 element (#3209) - Add extra blank lines in stubs in a few cases (#3564, #3862)
- Accept raw strings as docstrings (#3947)
- Split long lines in case blocks (#4024)
- Stop removing spaces from walrus operators within subscripts (#3823)
- Fix incorrect formatting of certain async statements (#3609)
- Allow combining
# fmt: skip
with other comments (#3959)
There are already a few improvements in the --preview
style, which are slated for the
2025 stable style. Try them out and
share your feedback. In the past, the preview
style has included some features that we were not able to stabilize. This year, we're
adding a separate --unstable
style for features with known problems. Now, the
--preview
style only includes features that we actually expect to make it into next
year's stable style.
Stable style
Several bug fixes were made in features that are moved to the stable style in this release:
- Fix comment handling when parenthesising conditional expressions (#4134)
- Fix bug where spaces were not added around parenthesized walruses in subscripts, unlike other binary operators (#4109)
- Remove empty lines before docstrings in async functions (#4132)
- Address a missing case in the change to allow empty lines at the beginning of all blocks, except immediately before a docstring (#4130)
- For stubs, fix logic to enforce empty line after nested classes with bodies (#4141)
Preview style
- Add
--unstable
style, covering preview features that have known problems that would block them from going into the stable style. Also add the--enable-unstable-feature
flag; for example, use--enable-unstable-feature hug_parens_with_braces_and_square_brackets
to apply this preview feature throughout 2024, even if a later Black release downgrades the feature to unstable (#4096) - Format module docstrings the same as class and function docstrings (#4095)
- Fix crash when using a walrus in a dictionary (#4155)
- Fix unnecessary parentheses when wrapping long dicts (#4135)
- Stop normalizing spaces before
# fmt: skip
comments (#4146)
Configuration
- Print warning when configuration in
pyproject.toml
contains an invalid key (#4165) - Fix symlink handling, properly ignoring symlinks that point outside of root (#4161)
- Fix cache mtime logic that resulted in false positive cache hits (#4128)
- Remove the long-deprecated
--experimental-string-processing
flag. This feature can currently be enabled with--preview --enable-unstable-feature string_processing
. (#4096)
Integrations
- Revert the change to run Black's pre-commit integration only on specific git hooks (#3940) for better compatibility with older versions of pre-commit (#4137)
v23.12.1
Packaging
- Fixed a bug that included dependencies from the
d
extra by default (#4108)
v23.12.0
Highlights
It's almost 2024, which means it's time for a new edition of Black's stable style! Together with this release, we'll put out an alpha release 24.1a1 showcasing the draft 2024 stable style, which we'll finalize in the January release. Please try it out and share your feedback.
This release (23.12.0) will still produce the 2023 style. Most but not all of the
changes in --preview
mode will be in the 2024 stable style.
Stable style
- Fix bug where
# fmt: off
automatically dedents when used with the--line-ranges
option, even when it is not within the specified line range. (#4084) - Fix feature detection for parenthesized context managers (#4104)
Preview style
- Prefer more equal signs before a break when splitting chained assignments (#4010)
- Standalone form feed characters at the module level are no longer removed (#4021)
- Additional cases of immediately nested tuples, lists, and dictionaries are now indented less (#4012)
- Allow empty lines at the beginning of all blocks, except immediately before a docstring (#4060)
- Fix crash in preview mode when using a short
--line-length
(#4086) - Keep suites consisting of only an ellipsis on their own lines if they are not functions or class definitions (#4066) (#4103)
Configuration
-
--line-ranges
now skips Black's internal stability check in--safe
mode. This avoids a crash on rare inputs that have many unformatted same-content lines. (#4034)
Packaging
- Upgrade to mypy 1.7.1 (#4049) (#4069)
- Faster compiled wheels are now available for CPython 3.12 (#4070)
Integrations
- Enable 3.12 CI (#4035)
- Build docker images in parallel (#4054)
- Build docker images with 3.12 (#4055)
v23.11.0
Highlights
- Support formatting ranges of lines with the new
--line-ranges
command-line option (#4020)
Stable style
- Fix crash on formatting bytes strings that look like docstrings (#4003)
- Fix crash when whitespace followed a backslash before newline in a docstring (#4008)
- Fix standalone comments inside complex blocks crashing Black (#4016)
- Fix crash on formatting code like
await (a ** b)
(#3994) - No longer treat leading f-strings as docstrings. This matches Python's behaviour and fixes a crash (#4019)
Preview style
- Multiline dicts and lists that are the sole argument to a function are now indented less (#3964)
- Multiline unpacked dicts and lists as the sole argument to a function are now also indented less (#3992)
- In f-string debug expressions, quote types that are visible in the final string are now preserved (#4005)
- Fix a bug where long
case
blocks were not split into multiple lines. Also enable general trailing comma rules oncase
blocks (#4024) - Keep requiring two empty lines between module-level docstring and first function or class definition (#4028)
- Add support for single-line format skip with other comments on the same line (#3959)
Configuration
- Consistently apply force exclusion logic before resolving symlinks (#4015)
- Fix a bug in the matching of absolute path names in
--include
(#3976)
Performance
- Fix mypyc builds on arm64 on macOS (#4017)
Integrations
- Black's pre-commit integration will now run only on git hooks appropriate for a code formatter (#3940)
v23.10.1
Highlights
- Maintenance release to get a fix out for GitHub Action edge case (#3957)
Preview style
- Fix merging implicit multiline strings that have inline comments (#3956)
- Allow empty first line after block open before a comment or compound statement (#3967)
Packaging
- Change Dockerfile to hatch + compile black (#3965)
Integrations
- The summary output for GitHub workflows is now suppressible using the
summary
parameter. (#3958) - Fix the action failing when Black check doesn't pass (#3957)
Documentation
- It is known Windows documentation CI is broken https://github.com/psf/black/issues/3968
v23.10.0
Stable style
- Fix comments getting removed from inside parenthesized strings (#3909)
Preview style
- Fix long lines with power operators getting split before the line length (#3942)
- Long type hints are now wrapped in parentheses and properly indented when split across multiple lines (#3899)
- Magic trailing commas are now respected in return types. (#3916)
- Require one empty line after module-level docstrings. (#3932)
- Treat raw triple-quoted strings as docstrings (#3947)
Configuration
- Fix cache versioning logic when
BLACK_CACHE_DIR
is set (#3937)
Parser
- Fix bug where attributes named
type
were not accepted insidematch
statements (#3950) - Add support for PEP 695 type aliases containing lambdas and other unusual expressions (#3949)
Output
- Black no longer attempts to provide special errors for attempting to format Python 2 code (#3933)
- Black will more consistently print stacktraces on internal errors in verbose mode (#3938)
Integrations
- The action output displayed in the job summary is now wrapped in Markdown (#3914)
v23.9.1
Due to various issues, the previous release (23.9.0) did not include compiled mypyc wheels, which make Black significantly faster. These issues have now been fixed, and this release should come with compiled wheels once again.
There will be no wheels for Python 3.12 due to a bug in mypyc. We will provide 3.12 wheels in a future release as soon as the mypyc bug is fixed.
Packaging
- Upgrade to mypy 1.5.1 (#3864)
Performance
- Store raw tuples instead of NamedTuples in Black's cache, improving performance and decreasing the size of the cache (#3877)
v23.9.0
Preview style
- More concise formatting for dummy implementations (#3796)
- In stub files, add a blank line between a statement with a body (e.g an
if sys.version_info > (3, x):
) and a function definition on the same level (#3862) - Fix a bug whereby spaces were removed from walrus operators within subscript(#3823)
Configuration
- Black now applies exclusion and ignore logic before resolving symlinks (#3846)
Performance
- Avoid importing
IPython
if notebook cells do not contain magics (#3782) - Improve caching by comparing file hashes as fallback for mtime and size (#3821)
Blackd
- Fix an issue in
blackd
with single character input (#3558)
Integrations
- Black now has an
official pre-commit mirror. Swapping
https://github.com/psf/black
tohttps://github.com/psf/black-pre-commit-mirror
in your.pre-commit-config.yaml
will make Black about 2x faster (#3828) - The
.black.env
folder specified byENV_PATH
will now be removed on the completion of the GitHub Action (#3759)
v23.7.0
Highlights
- Runtime support for Python 3.7 has been removed. Formatting 3.7 code will still be supported until further notice (#3765)
Stable style
- Fix a bug where an illegal trailing comma was added to return type annotations using PEP 604 unions (#3735)
- Fix several bugs and crashes where comments in stub files were removed or mishandled under some circumstances (#3745)
- Fix a crash with multi-line magic comments like
type: ignore
within parentheses (#3740) - Fix error in AST validation when Black removes trailing whitespace in a type comment (#3773)
Preview style
- Implicitly concatenated strings used as function args are no longer wrapped inside parentheses (#3640)
- Remove blank lines between a class definition and its docstring (#3692)
Configuration
- The
--workers
argument to Black can now be specified via theBLACK_NUM_WORKERS
environment variable (#3743) -
.pytest_cache
,.ruff_cache
and.vscode
are now excluded by default (#3691) - Fix Black not honouring
pyproject.toml
settings when running--stdin-filename
and thepyproject.toml
found isn't in the current working directory (#3719) -
Black will now error if
exclude
andextend-exclude
have invalid data types inpyproject.toml
, instead of silently doing the wrong thing (#3764)
Packaging
- Upgrade mypyc from 0.991 to 1.3 (#3697)
- Remove patching of Click that mitigated errors on Python 3.6 with
LANG=C
(#3768)
Parser
- Add support for the new PEP 695 syntax in Python 3.12 (#3703)
Performance
- Speed up Black significantly when the cache is full (#3751)
- Avoid importing
IPython
in a case where we wouldn't need it (#3748)
Output
- Use aware UTC datetimes internally, avoids deprecation warning on Python 3.12 (#3728)
- Change verbose logging to exactly mirror Black's logic for source discovery (#3749)
Blackd
- The
blackd
argument parser now shows the default values for options in their help text (#3712)
Integrations
- Black is now tested with
PYTHONWARNDEFAULTENCODING = 1
(#3763) - Update GitHub Action to display black output in the job summary (#3688)
Documentation
pylint-dev/pylint (pylint)
v3.1.0
Two new checks--use-yield-from
, deprecated-attribute
-- and a smattering of bug fixes.
New Features
-
Skip
consider-using-join
check for non-empty separators if ansuggest-join-with-non-empty-separator
option is set tono
.Closes #8701
-
Discover
.pyi
files when linting.These can be ignored with the
ignore-patterns
setting.Closes #9097
-
Check
TypeAlias
andTypeVar
(PEP 695) nodes forinvalid-name
.Refs #9196
-
Support for resolving external toml files named pylintrc.toml and .pylintrc.toml.
Closes #9228
-
Check for
.clear
,.discard
,.pop
andremove
methods being called on a set while it is being iterated over.Closes #9334
New Checks
-
New message
use-yield-from
added to the refactoring checker. This message is emitted when yielding from a loop can be replaced byyield from
.Closes #9229.
-
Added a
deprecated-attribute
message to check deprecated attributes in the stdlib.Closes #8855
False Positives Fixed
-
Fixed false positive for
inherit-non-class
for generic Protocols.Closes #9106
-
Exempt
TypedDict
fromtyping_extensions
fromtoo-many-ancestor
checks.Refs #9167
False Negatives Fixed
-
Extend broad-exception-raised and broad-exception-caught to except*.
Closes #8827
-
Fix a false-negative for unnecessary if blocks using a different than expected ordering of arguments.
Closes #8947.
Other Bug Fixes
-
Improve the message provided for wrong-import-order check. Instead of the import statement ("import x"), the message now specifies the import that is out of order and which imports should come after it. As reported in the issue, this is particularly helpful if there are multiple imports on a single line that do not follow the PEP8 convention.
The message will report imports as follows: For "import X", it will report "(standard/third party/first party/local) import X" For "import X.Y" and "from X import Y", it will report "(standard/third party/first party/local) import X.Y" The import category is specified to provide explanation as to why pylint has issued the message and guidence to the developer on how to fix the problem.
Closes #8808
Other Changes
-
Print how many files were checked in verbose mode.
Closes #8935
-
Fix a crash when an enum class which is also decorated with a
dataclasses.dataclass
decorator is defined.Closes #9100
Internal Changes
-
Update astroid version to 3.1.0.
Refs #9457
v3.0.4
False Positives Fixed
-
used-before-assignment
is no longer emitted when using a name in a loop and depending on an earlier name assignment in anexcept
block paired withelse: continue
.Closes #6804
-
Avoid false positives for
no-member
involving function attributes supplied by decorators.Closes #9246
-
Fixed false positive nested-min-max for nested lists.
Closes #9307
-
Fix false positive for
used-before-assignment
in afinally
block when assignments took place in both thetry
block and each exception handler.Closes #9451
Other Bug Fixes
-
Catch incorrect ValueError
"generator already executing"
for Python 3.12.0 - 3.12.2. This is fixed upstream in Python 3.12.3.Closes #9138
v3.0.3
What's new in Pylint 3.0.3?
Release date: 2023-12-11
False Positives Fixed
-
Fixed false positive for
unnecessary-lambda
when the call has keyword arguments but not the lambda.Closes #9148
-
Fixed incorrect suggestion for shallow copy in unnecessary-comprehension
Example of the suggestion: #pylint: disable=missing-module-docstring a = [1, 2, 3] b = [x for x in a] b[0] = 0 print(a) # [1, 2, 3]
After changing b = [x for x in a] to b = a based on the suggestion, the script now prints [0, 2, 3]. The correct suggestion should be use list(a) to preserve the original behavior.
Closes #9172
-
Fix false positives for
undefined-variable
andunused-argument
for classes and functions using Python 3.12 generic type syntax.Closes #9193
-
Fixed
pointless-string-statement
false positive for docstrings on Python 3.12 type aliases.Closes #9268
-
Fix false positive for
invalid-exception-operation
when concatenating tuples of exception types.Closes #9288
Other Bug Fixes
-
Fix a bug where pylint was unable to walk recursively through a directory if the directory has an
__init__.py
file.Closes #9210
v3.0.2
False Positives Fixed
-
Fix
used-before-assignment
false positive for generic type syntax (PEP 695, Python 3.12).Closes #9110
Other Bug Fixes
-
Escape special symbols and newlines in messages.
Closes #7874
-
Fixes suggestion for
nested-min-max
for expressions with additive operators, list and dict comprehensions.Closes #8524
-
Fixes ignoring conditional imports with
ignore-imports=y
.Closes #8914
-
Emit
inconsistent-quotes
for f-strings with 3.12 interpreter only if targeting pre-3.12 versions.Closes #9113
v3.0.1
False Positives Fixed
-
Fixed false positive for
inherit-non-class
for generic Protocols.Closes #9106
Other Changes
-
Fix a crash when an enum class which is also decorated with a
dataclasses.dataclass
decorator is defined.Closes #9100
v3.0.0
Pylint now support python 3.12 officially.
This long anticipated major version also provides some important usability and performance improvements, along with enacting necessary breaking changes and long-announced deprecations. The documentation of each message with an example is very close too.
The required astroid version is now 3.0.0. See the astroid changelog for additional fixes, features, and performance improvements applicable to pylint.
Our code is now fully typed. The invalid-name message no longer checks for a minimum length of 3 characters by default. Dependencies like wrapt or setuptools were removed.
A new json2 reporter has been added. It features an enriched output that is easier to parse and provides more info, here's a sample output.
{
"messages": [
{
"type": "convention",
"symbol": "line-too-long",
"message": "Line too long (1/2)",
"messageId": "C0301",
"confidence": "HIGH",
"module": "0123",
"obj": "",
"line": 1,
"column": 0,
"endLine": 1,
"endColumn": 4,
"path": "0123",
"absolutePath": "0123"
}
],
"statistics": {
"messageTypeCount": {
"fatal": 0,
"error": 0,
"warning": 0,
"refactor": 0,
"convention": 1,
"info": 0
},
"modulesLinted": 1,
"score": 5.0
}
}
Breaking Changes
-
Enabling or disabling individual messages will now take effect even if an
--enable=all
ordisable=all
follows in the same configuration file (or on the command line).This means for the following example,
fixme
messages will now be emitted:pylint my_module --enable=fixme --disable=all
To regain the prior behavior, remove the superfluous earlier option.
Closes #3696
-
Remove support for launching pylint with Python 3.7. Code that supports Python 3.7 can still be linted with the
--py-version=3.7
setting.Refs #6306
-
Disables placed in a
try
block now apply to theexcept
block. Previously, they only happened to do so in the presence of anelse
clause.Refs #7767
-
pyreverse
now uses a new default color palette that is more colorblind friendly. The color scheme is taken fromPaul Tol's Notes <https://personal.sron.nl/~pault/>
_. If you prefer other colors, you can use the--color-palette
option to specify custom colors.Closes #8251
-
Everything related to the
__implements__
construct was removed. It was based on PEP245 that was proposed in 2001 and rejected in 2006.The capability from pyreverse to take
__implements__
into account when generating diagrams was also removed.Refs #8404
-
pyreverse
: Support for the.vcg
output format (Visualization of Compiler Graphs) has been dropped.Closes #8416
-
The warning when the now useless old pylint cache directory (pylint.d) was found was removed. The cache dir is documented in
the FAQ <https://pylint.readthedocs.io/en/latest/faq.html#where-is-the-persistent-data-stored-to-compare-between-successive-runs>
_.Refs #8462
-
Following a deprecation period,
pylint.config.PYLINTRC
was removed. Use thepylint.config.find_default_config_files
generator instead.Closes #8862
Changes requiring user actions
-
The
invalid-name
message no longer checks for a minimum length of 3 characters by default. (This was an unadvertised commingling of concerns between casing and name length, and users regularly reported this to be surprising.)If checking for a minimum length is still desired, it can be regained in two ways:
-
If you are content with a
disallowed-name
message (instead ofinvalid-name
), then simply add the optionbad-names-rgxs="^..?$"
, which will fail 1-2 character-long names. (Ensure you enabledisallowed-name
.) -
If you would prefer an
invalid-name
message to be emitted, or would prefer finer-grained control over the circumstances in which messages are emitted (classes vs. methods, etc.), then avail yourself of the regex options describedhere <https://pylint.readthedocs.io/en/stable/user_guide/configuration/all-options.html#main-checker>
*. (In particular, take note of the commented out options in the "example configuration" given at the bottom of the section.) The prior regexes can be found in thepull request <https://github.com/pylint-dev/pylint/pull/8813>
* that removed the length requirements.
Closes #2018
-
-
The compare to empty string checker (
pylint.extensions.emptystring
) and the compare to zero checker (pylint.extensions.compare-to-zero
) have been removed and their checks are now part of the implicit booleaness checker:-
compare-to-zero
was renameduse-implicit-booleaness-not-comparison-to-zero
andcompare-to-empty-string
was renameduse-implicit-booleaness-not-comparison-to-string
and they now need to be enabled explicitly. -
The
pylint.extensions.emptystring
andpylint.extensions.compare-to-zero
extensions no longer exist and need to be removed from theload-plugins
option. -
Messages related to implicit booleaness were made more explicit and actionable. This permits to make their likeness explicit and will provide better performance as they share most of their conditions to be raised.
Closes #6871
-
-
epylint was removed. It now lives at: https://github.com/emacsorphanage/pylint.
Refs #7737
-
The
overgeneral-exceptions
option now only takes fully qualified names into account (builtins.Exception
notException
). If you overrode this option, you need to use the fully qualified name now.There's still a warning, but it will be removed in 3.1.0.
Refs #8411
-
Following a deprecation period, it's no longer possible to use
MASTER
ormaster
as configuration section insetup.cfg
ortox.ini
. It's bad practice to not start a section title with the tool name. Please usepylint.main
instead.Refs #8465
-
Package stats are now printed when running Pyreverse and a
--verbose
flag was added to get the original output with parsed modules. You might need to activate the verbose option if you want to keep the old output.Closes #8973
New Features
-
A new
json2
reporter has been added. It features a more enriched output that is easier to parse and provides more info.Compared to
json
the only changes are that messages are now under the"messages"
key and that"message-id"
now follows the camelCase convention and is renamed to"messageId"
. The new reporter also reports the "score" of the modules you linted as defined by theevaluation
option and provides statistics about the modules you linted.We encourage users to use the new reporter as the
json
reporter will no longer be maintained.Closes #4741
-
In Pyreverse package dependency diagrams, show when a module imports another only for type-checking.
Closes #8112
-
Add new option (
--show-stdlib
,-L
) topyreverse
. This is similar to the behavior of--show-builtin
in that standard library modules are now not included by default, and this option will include them.Closes #8181
-
Add Pyreverse option to exclude standalone nodes from diagrams with
--no-standalone
.Closes #8476
New Checks
-
Added
DataclassChecker
module andinvalid-field-call
checker to check for invalid dataclasses.field() usage.Refs #5159
-
Add
return-in-finally
to emit a message if a return statement was found in a finally clause.Closes #8260
-
Add a new checker
kwarg-superseded-by-positional-arg
to warn when a function is called with a keyword argument which shares a name with a positional-only parameter and the function contains a keyword variadic parameter dictionary. It may be surprising behaviour when the keyword argument is added to the keyword variadic parameter dictionary.Closes #8558
Extensions
-
Add new
prefer-typing-namedtuple
message to theCodeStyleChecker
to suggest rewriting calls tocollections.namedtuple
as classes inheriting fromtyping.NamedTuple
on Python 3.6+.Requires
load-plugins=pylint.extensions.code_style
andenable=prefer-typing-namedtuple
to be raised.Closes #8660
False Positives Fixed
-
Extend concept of "function ambiguity" in
safe_infer()
from differing number of function arguments to differing set of argument names.Solves false positives in
tensorflow
.Closes #3613
-
Fix
unused-argument
false positive when__new__
does not use all the arguments of__init__
.Closes #3670
-
Fix a false positive for
invalid-name
when a type-annotated class variable in anenum.Enum
class has no assigned value.Refs #7402
-
Fix
unused-import
false positive for usage ofsix.with_metaclass
.Closes #7506
-
Fix false negatives and false positives for
too-many-try-statements
,too-complex
, andtoo-many-branches
by correctly counting statements under atry
.Refs #7767
-
When checking for unbalanced dict unpacking in for-loops, Pylint will now test whether the length of each value to be unpacked matches the number of unpacking targets. Previously, Pylint would test the number of values for the loop iteration, which would produce a false unbalanced-dict-unpacking warning.
Closes #8156
-
Fix false positive for
used-before-assignment
when usage and assignment are guarded by the same test in different statements.Closes #8167
-
Adds
asyncSetUp
to the defaultdefining-attr-methods
list to silenceattribute-defined-outside-init
warning when usingunittest.IsolatedAsyncioTestCase
.Refs #8403
-
logging-not-lazy
is 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
-
invalid-name
now allows for integers intypealias
names:- now valid:
Good2Name
,GoodName2
. - still invalid:
_1BadName
.
Closes #8485
- now valid:
-
No longer consider
Union
as type annotation as type alias for naming checks.Closes #8487
-
unnecessary-lambda
no 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
-
Fixed
unused-import
so that it observes thedummy-variables-rgx
option.Closes #8500
-
Union
typed variables without assignment are no longer treated asTypeAlias
.Closes #8540
-
Allow parenthesized implicitly concatenated strings when
check-str-concat-over-line-jumps
is enabled.Closes #8552.
-
Fix false positive for
positional-only-arguments-expected
when a function contains both a positional-only parameter that has a default value, and**kwargs
.Closes #8555
-
Fix false positive for
keyword-arg-before-vararg
when a positional-only parameter with a default value precedes*args
.Closes #8570
-
Fix false positive for
arguments-differ
when overriding__init_subclass__
.Closes #8919
-
Fix a false positive for
no-value-for-parameter
when a staticmethod is called in a class body.Closes #9036
False Negatives Fixed
-
Emit
used-before-assignment
when calling module-level functions before definition.Closes #1144
-
Apply
infer_kwarg_from_call()
to more checksThese mostly solve false negatives for various checks, save for one false positive for
use-maxsplit-arg
.Closes #7761
-
TypeAlias
variables defined in functions are now checked forinvalid-name
errors.Closes #8536
-
Fix false negative for
no-value-for-parameter
when a function, whose signature contains both a positional-only parametername
and also*kwargs
, is called with a keyword-argument forname
.Closes #8559
-
Fix a false negative for
too-many-arguments
by considering positional-only and keyword-only parameters.Closes #8667
-
Emit
assignment-from-no-return
for calls to builtin methods likedict.update()
. Calls tolist.sort()
now raiseassignment-from-no-return
rather thanassignment-from-none
for consistency. -
consider-using-augmented-assign
is now applied to dicts and lists as well.Closes #8959
Other Bug Fixes
-
Support
duplicate-code
message when parallelizing with--jobs
.Closes #374
-
Support
cyclic-import
message when parallelizing with--jobs
.Closes #4171
-
--jobs
can now be used with--load-plugins
.This had regressed in astroid 2.5.0.
Closes #4874
-
docparams extension considers type comments as type documentation.
Closes #6287
-
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
-
The
ignored-modules
option will now be correctly taken into account forno-name-in-module
.Closes #7578
-
sys.argv
is now always correctly considered as impossible to infer (instead of using the actual values given to pylint).Closes #7710
-
Avoid duplicative warnings for unqualified exception names in the
overgeneral-exceptions
setting when running with--jobs
.Closes #7774
-
Don't show class fields more than once in Pyreverse diagrams.
Closes #8189
-
Fix
used-before-assignment
false negative when TYPE_CHECKING imports are used in multiple scopes.Closes #8198
-
--clear-cache-post-run
now also clears LRU caches for pylint utilities holding references to AST nodes.Closes #8361
-
Fix a crash when
TYPE_CHECKING
is used without importing it.Closes #8434
-
Fix a
used-before-assignment
false positive when imports are made under theTYPE_CHECKING
else if branch.Closes #8437
-
Fix a regression of
preferred-modules
where a partial match was used instead of the required full match.Closes #8453
-
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
-
Don't show arrows more than once in Pyreverse diagrams.
Closes #8522
-
Improve output of
consider-using-generator
message formin()
calls withdefault
keyword.Closes #8563
-
Fixed a crash when generating a configuration file:
tomlkit.exceptions.TOMLKitError: Can't add a table to a dotted key
caused by tomlkitv0.11.8
.Closes #8632
-
Fix a line break error in Pyreverse dot output.
Closes #8671
-
Fix a false positive for
method-hidden
when usingcached_property
decorator.Closes #8753
-
Dunder methods defined in lambda do not trigger
unnecessary-dunder-call
anymore, if they cannot be replaced by the non-dunder call.Closes #8769
-
Don't show duplicate type annotations in Pyreverse diagrams.
Closes #8888
-
Fixing inconsistent hashing issue in
BaseChecker
causing some reports not being exported.Closes #9001
-
Don't add
Optional
to|
annotations withNone
in Pyreverse diagrams.Closes #9014
-
Pyreverse doesn't show multiple class association arrows anymore, but only the strongest one.
Refs #9045
-
Prevented data loss in the linter stats for messages relating to the linter itself (e.g.
unknown-option-value
), fixing problems with score, fail-on, etc.Closes #9059
-
Fix crash in refactoring checker when unary operand used with variable in for loop.
Closes #9074
Other Changes
-
Pylint now exposes its type annotations.
-
Search for
pyproject.toml
recursively in parent directories up to a project or file system root. -
All code related to the optparse config parsing has been removed.
Refs #8405
-
Pylint now supports python 3.12.
Refs #8718
-
Add a CITATION.cff file to the root of the repository containing the necessary metadata to cite Pylint.
Closes #8760
-
Renamed the "unneeded-not" error into "unnecessary_negation" to be clearer.
Closes #8789
Internal Changes
-
get_message_definition
was removed from the base checker API. You can access message definitions through theMessageStore
.Refs #8401
-
Everything related to the
__implements__
construct was removed. It was based on PEP245 that was proposed in 2001 and rejected in 2006.All the classes inheriting
Interface
inpylint.interfaces
were removed.Checker
should only inheritBaseChecker
or any of the other checker types frompylint.checkers
.Reporter
should only inheritBaseReporter
.Refs #8404
-
modname
andmsg_store
are now required to be given inFileState
.collect_block_lines
has also been removed.Pylinter.current_name
cannot be null anymore.Refs #8407
-
Reporter.set_output
was removed in favor ofreporter.out = stream
.Refs #8408
-
A number of old utility functions and classes have been removed:
MapReduceMixin
: To make a checker reduce map data simply implementget_map_data
andreduce_map_data
.is_inside_lambda
: Useutils.get_node_first_ancestor_of_type(x, nodes.Lambda)
check_messages
: Useutils.only_required_for_messages
is_class_subscriptable_pep585_with_postponed_evaluation_enabled
: Useis_postponed_evaluation_enabled(node)
andis_node_in_type_annotation_context(node)
get_python_path
: assumption that there's always an init.py is not true since python 3.3 and is causing problems, particularly with PEP 420. Usediscover_package_path
and pass source root(s).fix_import_path
: Useaugmented_sys_path
and pass additionalsys.path
entries as an argument obtained fromdiscover_package_path
.get_global_option
: Usechecker.linter.config
to get all global options.Related private objects have been removed as well.
Refs #8409
-
colorize_ansi
now only accepts aMessageStyle
object.Refs #8412
-
Following a deprecation period,
Pylinter.check
now only works with sequences of strings, not strings.Refs #8463
-
Following a deprecation period,
ColorizedTextReporter
only acceptsColorMappingDict
.Refs #8464
-
Following a deprecation period,
MessageTest
'send_line
andend_col_offset
must be accurate in functional tests (for python 3.8 or above on cpython, and for python 3.9 or superior on pypy).Refs #8466
-
Following a deprecation period, the
do_exit
argument of theRun
class (and of the_Run
class in testutils) were removed.Refs #8472
-
Following a deprecation period, the
py_version
argument of theMessageDefinition.may_be_emitted
function is now required. The most likely solution is to use 'linter.config.py_version' if you need to keep using this function, or to use 'MessageDefinition.is_message_enabled' instead.Refs #8473
-
Following a deprecation period, the
OutputLine
class now requires the right number of argument all the time. The functional output can be regenerated automatically to achieve that easily.Refs #8474
-
Following a deprecation period,
is_typing_guard
,is_node_in_typing_guarded_import_block
andis_node_in_guarded_import_block
frompylint.utils
were removed: use a combination ofis_sys_guard
andin_type_checking_block
instead.Refs #8475
-
Following a deprecation period, the
location
argument of theMessage
class must now be aMessageLocationTuple
.Refs #8477
-
Following a deprecation period, the
check_single_file
function of thePylinter
is replaced byPylinter.check_single_file_item
.Refs #8478
Performance Improvements
-
pylint
runs (at least) ~5% faster after improvements toastroid
that make better use of the inference cache. -
- Optimize
is_trailing_comma()
. - Cache
class_is_abstract()
.
Refs #1954
- Optimize
-
Exit immediately if all messages are disabled.
Closes #8715
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.argv
is 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
Optional
to|
annotations withNone
in 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-variable
when there is an import in aif TYPE_CHECKING:
block andallow-global-unused-variables
is set tono
in the configuration.Closes #8696
-
Fix false positives generated when supplying arguments as
**kwargs
to IO calls like open().Closes #8719
-
Fix a false positive where pylint was ignoring method calls annotated as
NoReturn
during theinconsistent-return-statements
check.Closes #8747
-
Exempt parents with only type annotations from the
invalid-enum-extension
message.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-iterating
checker when deleting members of a dict returned from a call.Closes #8598
-
Fix crash in
invalid-metaclass
check when a metaclass had duplicate bases.Closes #8698
-
Avoid
consider-using-f-string
on 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
nonlocal
is defined at module-level.Closes #8735
v2.17.4
False Positives Fixed
-
Fix a false positive for
bad-dunder-name
when 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 key
caused 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-argument
false positive when__new__
does not use all the arguments of__init__
.Closes #3670
-
Fix
unused-import
false positive for usage ofsix.with_metaclass
.Closes #7506
-
logging-not-lazy
is 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-import
so that it observes thedummy-variables-rgx
option.Closes #8500
-
Union
typed variables without assignment are no longer treated asTypeAlias
.Closes #8540
-
Fix false positive for
positional-only-arguments-expected
when a function contains both a positional-only parameter that has a default value, and**kwargs
.Closes #8555
-
Fix false positive for
keyword-arg-before-vararg
when a positional-only parameter with a default value precedes*args
.Closes #8570
Other Bug Fixes
-
Improve output of
consider-using-generator
message formin()` calls with
default`` keyword.Closes #8563
v2.17.2
False Positives Fixed
-
invalid-name
now allows for integers intypealias
names:- now valid:
Good2Name
,GoodName2
. - still invalid:
_1BadName
.
Closes #8485
- now valid:
-
No longer consider
Union
as type annotation as type alias for naming checks.Closes #8487
-
unnecessary-lambda
no 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
asyncSetUp
to the defaultdefining-attr-methods
list to silenceattribute-defined-outside-init
warning when usingunittest.IsolatedAsyncioTestCase
.Refs #8403
Other Bug Fixes
-
--clear-cache-post-run
now also clears LRU caches for pylint utilities holding references to AST nodes.Closes #8361
-
Fix a crash when
TYPE_CHECKING
is used without importing it.Closes #8434
-
Fix a regression of
preferred-modules
where 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_block
and will be removed in pylint 3.0:is_node_in_guarded_import_block
is_node_in_typing_guarded_import_block
is_typing_guard
is_sys_guard
is 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
-
pyreverse
now supports custom color palettes with the--color-palette
option.Closes #6738
-
Add
invalid-name
check forTypeAlias
names.Closes #7081
-
Accept values of the form
<class name>.<attribute name>
for theexclude-protected
list.Closes #7343
-
Add
--version
option 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
TryStar
nodes from Python 3.11 and should be fully compatible with Python 3.11.Closes #8387
New Checks
-
Add a
bad-chained-comparison
check 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-alias
check that emits a warning when a class derived fromenum.IntFlag
assigns 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-assignment
whentyping.TYPE_CHECKING
is 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-assignment
for named expressions appearing after the first element in a list, tuple, or set.Closes #8252
-
Fix false positive for
wrong-spelling-in-comment
with 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-assignment
false positive when the walrus operator is used with a ternary operator in dictionary key/value initialization.Closes #8125
-
Fix
no-name-in-module
false 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-max
suggestion 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-name
for the line on which aglobal
statement is declared.Closes #8307
Other Changes
-
Update explanation for
global-variable-not-assigned
and 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-comment
with class names in a python 2 type comment.Closes #8370
Other Bug Fixes
-
Prevent emitting
invalid-name
for the line on which aglobal
statement is declared.Closes #8307
v2.16.2
New Features
-
Add
--version
option topyreverse
.Refs #7851
False Positives Fixed
-
Fix false positive for
used-before-assignment
whentyping.TYPE_CHECKING
is used with if/elif/else blocks.Closes #7574
-
Fix false positive for
used-before-assignment
for named expressions appearing after the first element in a list, tuple, or set.Closes #8252
Other Bug Fixes
-
Fix
used-before-assignment
false positive when the walrus operator is used with a ternary operator in dictionary key/value initialization.Closes #8125
-
Fix
no-name-in-module
false positive raised when a package defines a variable with the same name as one of its submodules.Closes #8148
-
Fix
nested-min-max
suggestion 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-doc
option related tomissing-raises-doc
will 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=no
in your configuration to keep the same behavior. Closes #7208
New Features
-
Added the
no-header
output 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-run
to support server-like usage. Use this flag if you expect the linted files to be altered between runs. Refs #5401 -
Add
--allow-reexport-from-package
option to configure theuseless-import-alias
check not to emit a warning if a name is reexported from a package. Closes #6006 -
Update
pyreverse
to differentiate between aggregations and compositions.pyreverse
checks 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-statement
check that emits a warning when an Exception is created and not assigned, raised or returned. Refs #3110 -
Add a
shadowed-import
message for aliased imports. Closes #4836 -
Add new check called
unbalanced-dict-unpacking
to check for unbalanced dict unpacking in assignment and for loops. Closes #5797 -
Add new checker
positional-only-arguments-expected
to check for cases when positional-only arguments have been passed as keyword arguments. Closes #6489 -
Added
singledispatch-method
which informs that@singledispatch
should decorate functions and not class/instance methods. Addedsingledispatchmethod-function
which informs that@singledispatchmethod
should decorate class/instance methods and not functions. Closes #6917 -
Rename
broad-except
tobroad-exception-caught
and add new checkerbroad-exception-raised
which will warn if general exceptionsBaseException
orException
are raised. Closes #7494 -
Added
nested-min-max
which flagsmin(1, min(2, 3))
to simplify tomin(1, 2, 3)
. Closes #7546 -
Extended
use-dict-literal
to also warn about call todict()
when passing keyword arguments. Closes #7690 -
Add
named-expr-without-context
check to emit a warning if a named expression is used outside a context likeif
,for
,while
, or a comprehension. Refs #7760 -
Add
invalid-slice-step
check to warn about a slice step value of0
for common builtin sequences. Refs #7762 -
Add
consider-refactoring-into-while-condition
check to recommend refactoring when a while loop is defined with a constant condition with an immediateif
statement to check forbreak
condition as a first statement. Closes #8015
Extensions
-
Add new extension checker
dict-init-mutate
that flags mutating a dictionary immediately after the dictionary was created. Closes #2876 -
Added
bad-dunder-name
extension check, which flags bad or misspelled dunder methods. You can use thegood-dunder-names
option to allow specific dunder names. Closes #3038 -
Added
consider-using-augmented-assign
check forCodeStyle
extension which flagsx = x + 1
to simplify tox += 1
. This check is disabled by default. To use it, load the code style extension withload-plugins=pylint.extensions.code_style
and addconsider-using-augmented-assign
in theenable
option. Closes #3391 -
Add
magic-number
plugin 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-argument
message fortyping
plugin 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-variable
andunused-import
when a name is only used in a string literal type annotation. Closes #3299 -
Document a known false positive for
useless-suppression
when disablingline-too-long
in a module with only comments and no code. Closes #3368 -
trailing-whitespaces
is no longer reported within strings. Closes #3822 -
Fix false positive for
global-variable-not-assigned
when a global variable is re-assigned via anImportFrom
node. Closes #4809 -
Fix false positive for
use-maxsplit-arg
with custom split method. Closes #4857 -
Fix
logging-fstring-interpolation
false positive raised when logging and f-string with%s
formatting. Closes #4984 -
Fix false-positive for
used-before-assignment
in pattern matching with a guard. Closes #5327 -
Fix
use-sequence-for-iteration
when unpacking a set with*
. Closes #5788 -
Fix
deprecated-method
false positive when alias for method is similar to name of deprecated method. Closes #5886 -
Fix false positive
assigning-non-slot
when a class attribute is re-assigned. Closes #6001 -
Fix false positive for
too-many-function-args
when a function call is assigned to a class attribute inside the class where the function is defined. Closes #6592 -
Fixes false positive
abstract-method
on Protocol classes. Closes #7209 -
Pylint now understands the
kw_only
keyword argument fordataclass
. Closes #7290, closes #6550, closes #5857 -
Fix false positive for
undefined-loop-variable
infor-else
loops that use a function having a return type annotation ofNoReturn
orNever
. Closes #7311 -
Fix
used-before-assignment
for functions/classes defined in type checking guard. Closes #7368 -
Fix false positive for
unhashable-member
when subclassingdict
and using the subclass as a dictionary key. Closes #7501 -
Fix the message for
unnecessary-dunder-call
for__aiter__
and__aneext__
. Also only emit the warning whenpy-version
>= 3.10. Closes #7529 -
Fix
used-before-assignment
false positive when else branch callssys.exit
or similar terminating functions. Closes #7563 -
Fix a false positive for
used-before-assignment
for imports guarded bytyping.TYPE_CHECKING
later used in variable annotations. Closes #7609 -
Fix a false positive for
simplify-boolean-expression
when multiple values are inferred for a constant. Closes #7626 -
unnecessary-list-index-lookup
will not be wrongly emitted ifenumerate
is called withstart
. Closes #7682 -
Don't warn about
stop-iteration-return
when usingnext()
overitertools.cycle
. Closes #7765 -
Fixes
used-before-assignment
false positive when the walrus operator is used in a ternary operator. Closes #7779 -
Fix
missing-param-doc
false positive when function parameter has an escaped underscore. Closes #7827 -
Fixes
method-cache-max-size-none
false positive for methods inheriting fromEnum
. Closes #7857 -
multiple-statements
no longer triggers for function stubs using inlined...
. Closes #7860 -
Fix a false positive for
used-before-assignment
when 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-assignment
when imports guarded byif TYPE_CHECKING
are guarded again when used. Closes #7979 -
Fixes false positive for
try-except-raise
with multiple exceptions in one except statement if exception are in different namespace. Closes #8051 -
Fix
invalid-name
errors fortyping_extension.TypeVar
. Refs #8089 -
Fix
no-kwoa
false positive for context managers. Closes #8100 -
Fix a false positive for
redefined-variable-type
whenasync
methods are present. Closes #8120
False Negatives Fixed
-
Code following a call to
quit
,exit
,sys.exit
oros._exit
will be marked asunreachable
. Refs #519 -
Emit
used-before-assignment
when function arguments are redefined inside an inner function and accessed there before assignment. Closes #2374 -
Fix a false negative for
unused-import
when one module used an import in a type annotation that was also used in another module. Closes #4150 -
Flag
superfluous-parens
if parentheses are used during string concatenation. Closes #4792 -
Emit
used-before-assignment
when relying on names only defined under conditions always testing false. Closes #4913 -
consider-using-join
can now be emitted for non-empty string separators. Closes #6639 -
Emit
used-before-assignment
for further imports guarded byTYPE_CHECKING
Previously, this message was only emitted for imports guarded directly underTYPE_CHECKING
, not guarded two if-branches deep, nor whenTYPE_CHECKING
was imported fromtyping
under an alias. Closes #7539 -
Fix a false negative for
unused-import
when a constant insidetyping.Annotated
was treated as a reference to an import. Closes #7547 -
consider-using-any-or-all
message will now be raised in cases when boolean is initialized, reassigned during loop, and immediately returned. Closes #7699 -
Extend
invalid-slice-index
to emit an warning for invalid slice indices used with string and byte sequences, and range objects. Refs #7762 -
Fixes
unnecessary-list-index-lookup
false negative whenenumerate
is called withiterable
as a kwarg. Closes #7770 -
no-else-return
orno-else-raise
will be emitted ifexcept
block always returns or raises. Closes #7788 -
Fix
dangerous-default-value
false negative when*
is used. Closes #7818 -
consider-using-with
now triggers forpathlib.Path.open
. Closes #7964
Other Bug Fixes
-
Fix bug in detecting
unused-variable
when 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-name
check 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-member
false negative when augmented assign is done manually, without+=
. Closes #4562 -
Any assertion on a populated tuple will now receive a
assert-on-tuple
warning. Closes #4655 -
missing-return-doc
,missing-raises-doc
andmissing-yields-doc
now respect theno-docstring-rgx
option. Closes #4743 -
Update
reimported
help message for clarity. Closes #4836 -
consider-iterating-dictionary
will no longer be raised if bitwise operations are used. Closes #5478 -
Using custom braces in
msg-template
will 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-call
check. 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
OSError
in 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-hook
option changingsys.path
before it can be imported, this will now emit abad-plugin-value
message. 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_iterating
checker to fix a crash withfor
loops on empty list. Closes #7380 -
Update wording for
arguments-differ
andarguments-renamed
to clarify overriding object. Closes #7390 -
disable-next
is now correctly scoped to only the succeeding line. Closes #7401 -
Fixed a crash in the
unhashable-member
checker when using alambda
as a dict key. Closes #7453 -
Add
mailcap
to deprecated modules list. Closes #7457 -
Fix a crash in the
modified-iterating-dict
checker involving instance attributes. Closes #7461 -
invalid-class-object
does not crash anymore when__class__
is assigned alongside another variable. Closes #7467 -
--help-msg
now accepts a comma-separated list of message IDs again. Closes #7471 -
Allow specifying non-builtin exceptions in the
overgeneral-exception
option using an exception's qualified name. Closes #7495 -
Report
no-self-argument
rather thanno-method-argument
for methods with variadic arguments. Closes #7507 -
Fixed an issue where
syntax-error
couldn't be raised on files with invalid encodings. Closes #7522 -
Fix false positive for
redefined-outer-name
when aliasingtyping
e.g. ast
and guarding imports undert.TYPE_CHECKING
. Closes #7524 -
Fixed a crash of the
modified_iterating
checker when iterating on a set defined as a class attribute. Closes #7528 -
Use
py-version
to determine if a message should be emitted for messages defined withmax-version
ormin-version
. Closes #7569 -
Improve
bad-thread-instantiation
check to warn iftarget
is not passed in as a keyword argument or as a second argument. Closes #7570 -
Fixes edge case of custom method named
next
raised 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
dill
would 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-arg
default 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_lookup
check when usingenumerate
withstart
and a class attribute. Closes #7821 -
Fixes a crash in
stop-iteration-return
when thenext
builtin 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
ModuleNotFound
exception when running pylint on a Django project with thepylint_django
plugin 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-method
to 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
docparams
extension now considers typing in Numpy style docstrings as "documentation" for themissing-param-doc
message. Refs #7398 -
Relevant
DeprecationWarnings
are now raised withstacklevel=2
, so they have the callsite attached in the message. Closes #7463 -
Add a
minimal
option topylint-config
and its toml generator. Closes #7485 -
Add method name to the error messages of
no-method-argument
andno-self-argument
. Closes #7507 -
Prevent leaving the pip install cache in the Docker image. Refs #7544
-
Add a keyword-only
compare_constants
argument tosafe_infer
. Refs #7626 -
Add
default_enabled
option 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 theenable
option. Refs #7629 -
Sort
--generated-rcfile
output. 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.path
during 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-iteration
when unpacking a set with*
.Closes #5788
-
Fix false positive
assigning-non-slot
when a class attribute is re-assigned.Closes #6001
-
Fixes
used-before-assignment
false positive when the walrus operator is used in a ternary operator.Closes #7779
-
Prevent
used-before-assignment
when imports guarded byif TYPE_CHECKING
are guarded again when used.Closes #7979
Other Bug Fixes
-
Using custom braces in
msg-template
will now work properly.Closes #5636
v2.15.9
False Positives Fixed
-
Fix false-positive for
used-before-assignment
in 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
ModuleNotFound
exception when running pylint on a Django project with thepylint_django
plugin enabled.Closes #7938
v2.15.8
False Positives Fixed
-
Document a known false positive for
useless-suppression
when disablingline-too-long
in a module with only comments and no code.Closes #3368
-
Fix
logging-fstring-interpolation
false positive raised when logging and f-string with%s
formatting.Closes #4984
-
Fixes false positive
abstract-method
on Protocol classes.Closes #7209
-
Fix
missing-param-doc
false positive when function parameter has an escaped underscore.Closes #7827
-
multiple-statements
no longer triggers for function stubs using inlined...
.Closes #7860
v2.15.7
False Positives Fixed
-
Fix
deprecated-method
false positive when alias for method is similar to name of deprecated method.Closes #5886
-
Fix a false positive for
used-before-assignment
for imports guarded bytyping.TYPE_CHECKING
later 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-return
when thenext
builtin is called without arguments.Closes #7828
v2.15.6
False Positives Fixed
-
Fix false positive for
unhashable-member
when subclassingdict
and using the subclass as a dictionary key.Closes #7501
-
unnecessary-list-index-lookup
will not be wrongly emitted ifenumerate
is called withstart
.Closes #7682
-
Don't warn about
stop-iteration-return
when 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
next
raised 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-expression
when multiple values are inferred for a constant.Closes #7626
Other Bug Fixes
-
Remove
__index__
dunder method call fromunnecessary-dunder-call
check.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
dill
would throw an error when attempting to serialise the linter object for multi-processing use.Closes #7635.
Other Changes
-
Add a keyword-only
compare_constants
argument tosafe_infer
.Refs #7626
-
Sort
--generated-rcfile
output.Refs #7655
v2.15.4
False Positives Fixed
-
Fix the message for
unnecessary-dunder-call
for__aiter__
and__anext__
. Also only emit the warning whenpy-version
>= 3.10.Closes #7529
Other Bug Fixes
-
Fix bug in detecting
unused-variable
when 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-argument
rather thanno-method-argument
for methods with variadic arguments.Closes #7507
-
Fixed an issue where
syntax-error
couldn't be raised on files with invalid encodings.Closes #7522
-
Fix false positive for
redefined-outer-name
when aliasingtyping
e.g. ast
and guarding imports undert.TYPE_CHECKING
.Closes #7524
-
Fixed a crash of the
modified_iterating
checker 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-argument
andno-self-argument
.Closes #7507
v2.15.3
-
Fixed a crash in the
unhashable-member
checker when using alambda
as a dict key.Closes #7453
-
Fix a crash in the
modified-iterating-dict
checker involving instance attributes.Closes #7461
-
invalid-class-object
does not crash anymore when__class__
is assigned alongside another variable.Closes #7467
-
Fix false positive for
global-variable-not-assigned
when a global variable is re-assigned via anImportFrom
node.Closes #4809
-
Fix false positive for
undefined-loop-variable
infor-else
loops that use a function having a return type annotation ofNoReturn
orNever
.Closes #7311
-
--help-msg
now 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-hook
option changingsys.path
before it can be imported, this will now emit abad-plugin-value
message. 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-assignment
for functions/classes defined in type checking guard.Closes #7368
-
Update
modified_iterating
checker to fix a crash withfor
loops on empty list.Closes #7380
-
The
docparams
extension now considers typing in Numpy style docstrings as "documentation" for themissing-param-doc
message.Refs #7398
-
Fix false positive for
unused-variable
andunused-import
when a name is only used in a string literal type annotation.Closes #3299
-
Fix false positive for
too-many-function-args
when a function call is assigned to a class attribute inside the class where the function is defined.Closes #6592
-
Fix
used-before-assignment
for 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-doc
andmissing-yields-doc
now respect theno-docstring-rgx
option.Closes #4743
-
Don't crash on
OSError
in config file discovery.Closes #7169
-
disable-next
is now correctly scoped to only the succeeding line.Closes #7401
-
Update
modified_iterating
checker to fix a crash withfor
loops 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 https://github.com/PyCQA/pylint/issues/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-timeout
to 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-called
for abstract__init__
methods.Closes #3975
-
Don't report
unsupported-binary-operation
on 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-parameter
for dataclasses fields annotated withKW_ONLY
.Closes #5767
-
Fixed inference of
Enums
when they are imported under an alias.Closes #5776
-
Prevent false positives when accessing
PurePath.parents
by index (not slice) on Python 3.10+.Closes #5832
-
unnecessary-list-index-lookup
is now more conservative to avoid potential false positives.Closes #6896
-
Fix double emitting
trailing-whitespace
for multi-line docstrings.Closes #6936
-
import-error
now correctly checks forcontextlib.suppress
guards on import statements.Closes #7270
-
Fix false positive for
no-self-argument
/no-method-argument
when a staticmethod is applied to a function but uses a different name.Closes #7300
-
Fix
undefined-loop-variable
withbreak
andcontinue
statements inelse
blocks.Refs #7311
False Negatives Fixed
-
Emit
used-before-assignment
when relying on a name that is reimported later in a function.Closes #4624
-
Emit
used-before-assignment
for self-referencing named expressions (:=
) lacking prior assignments.Closes #5653
-
Emit
used-before-assignment
for self-referencing assignments under if conditions.Closes #6643
-
Emit
modified-iterating-list
and analogous messages for dicts and sets when iterating literals, or when using thedel
keyword.Closes #6648
-
Emit
used-before-assignment
when calling nested functions before assignment.Closes #6812
-
Emit
nonlocal-without-binding
when a nonlocal name has been assigned at a later point in the same scope.Closes #6883
-
Emit
using-constant-test
when testing the truth value of a variable or call result holding a generator.Closes #6909
-
Rename
unhashable-dict-key
tounhashable-member
and emit when creating sets and dicts, not just when accessing dicts.
Other Bug Fixes
-
Fix a failure to lint packages with
__init__.py
contained 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-callable
check when there is ambiguity whether an instance is being incorrectly provided to__new__()
.Closes #7109
-
Fix crash when regex option raises a
re.error
exception.Closes #7202
-
Fix
undefined-loop-variable
from walrus in comprehension test.Closes #7222
-
Check for
<cwd>
before removing first item fromsys.path
inmodify_sys_path
.Closes #7231
-
Fix sys.path pollution in parallel mode.
Closes #7246
-
Prevent
useless-parent-delegation
for delegating to a builtin written in C (e.g.Exception.__init__
) with non-self arguments.Closes #7319
Other Changes
-
bad-exception-context
has been renamed tobad-exception-cause
as it is about the cause and not the context.Closes #3694
-
The message for
literal-comparison
is now more explicit about the problem and the solution.Closes #5237
-
useless-super-delegation
has been renamed touseless-parent-delegation
in order to be more generic.Closes #6953
-
Pylint now uses
towncrier
for changelog generation.Refs #6974
-
Update
astroid
to 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.primer
is 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-variable
check 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
fixme
and its interaction withuseless-suppression
. -
Allow lists of default values in parameter documentation for
Numpy
style.Closes #4035
v2.14.4
-
The
differing-param-doc
check was triggered by positional only arguments.Closes #6950
-
Fixed an issue where scanning
.
directory recursively with--ignore-path=^path/to/dir
is not ignoring thepath/to/dir
directory.Closes #6964
-
Fixed regression that didn't allow quoted
init-hooks
in option files.Closes #7006
-
Fixed a false positive for
modified-iterating-dict
when 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.cfg
files. Only.cfg
files that are exactly namedsetup.cfg
require section names that start withpylint.
.Closes #3630
-
Don't report
import-private-name
for relative imports.Closes #7078
v2.14.3
-
Fixed two false positives for
bad-super-call
for calls that refer to a non-direct parent. -
Fixed a false positive for
useless-super-delegation
for subclasses that specify the number of of parameters against a parent that uses a variadic argument.Closes #2270
-
Allow suppressing
undefined-loop-variable
andundefined-variable
without raisinguseless-suppression
. -
Fixed false positive for
undefined-variable
for__class__
in inner methods.Closes #4032
v2.14.2
-
Fixed a false positive for
unused-variable
when a function returns anargparse.Namespace
object.Closes #6895
-
Avoided raising an identical
undefined-loop-variable
message 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-string
if the left side of a%
is not a string.Closes #6689
-
Fixed a false positive in
unnecessary-list-index-lookup
andunnecessary-dict-index-lookup
when the subscript is updated in the body of a nested loop.Closes #6818
-
Fixed an issue with multi-line
init-hook
options which did not record the line endings.Closes #6888
-
Fixed a false positive for
used-before-assignment
when a try block returns but an except handler defines a name via type annotation. -
--errors-only
no 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-lookup
orunnecessary-list-index-lookup
when 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-import
when aliasingtyping
e.g. ast
and guarding imports undert.TYPE_CHECKING
.Closes #3846
-
Fixed a false positive regression in 2.13 for
used-before-assignment
where it is safe to rely on a name defined only in anexcept
block because theelse
block 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_import
extension.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-value
will 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-call
for 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-lookup
for indexing into a list while iterating overenumerate()
.Closes #4525
-
Added new message called
duplicate-value
which identifies duplicate values inside sets.Closes #5880
-
Added the
super-without-brackets
checker, 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-keyword
message as there are no new keywords in the supported Python versions any longer.Closes #4683
-
Moved
no-self-use
check 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-name
to emit messages when a loop variable is redefined in the loop body.
Closes #5072
- Added optional extension
-
DocStringStyleChecker
- Re-enable checker
bad-docstring-quotes
for Python <= 3.7.
Closes #6087
- Re-enable checker
-
NoSelfUseChecker
- Added
no-self-use
check, 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 addpyenchant
to pylint's dependencies. You will still need to install the requirements forpyenchant
(theenchant
library and any dictionaries) yourself. You will also need to set thespelling-dict
option.Refs #6462
-
Improved wording of the message of
deprecated-module
Closes #6169
-
Pylint
now requires Python 3.7.2 or newer to run.Closes #4301
-
We made a greater effort to reraise failures stemming from the
astroid
library asAstroidError
, with the effect that pylint emitsastroid-error
rather 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-value
inline (as long as you disable it before the bad option value is raised, i.e.disable=bad-option-value,bad-message
notdisable=bad-message,bad-option-value
) as well as certain other previously unsupported messages.Closes #3312
-
The main checker name is now
main
instead ofmaster
. The configuration does not need to be updated as sections' name are optional.Closes #5467
-
Update
invalid-slots-object
message to show bad object rather than its inferred value.Closes #6101
-
Fixed a crash in the
not-an-iterable
checker involving multiple starred expressions inside a call.Closes #6372
-
Fixed a crash in the
unused-private-member
checker involving chained private attributes.Closes #6709
-
Disable spellchecking of mypy rule names in ignore directives.
Closes #5929
-
implicit-str-concat
will now be raised on calls likeopen("myfile.txt" "a+b")
too.Closes #6441
-
Fix a failure to respect inline disables for
fixme
occurring on the last line of a module when pylint is launched with--enable=fixme
. -
Removed the broken
generate-man
option. -
Fixed failure to enable
deprecated-module
after adisable=all
by makingImportsChecker
solely responsible for emittingdeprecated-module
instead of sharing responsibility withStdlibChecker
. (This could have led to double messages.) -
Added the
generate-toml-config
option.Refs #5462
-
bad-option-value
will be emitted whenever a configuration value or command line invocation includes an unknown message.Closes #4324
-
Added the
unrecognized-option
message. Raised if we encounter any unrecognized options.Closes #5259
-
Fix false negative for
bad-string-format-type
if 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-none
checker has been renamed tomethod-cache-max-size-none
.Closes #5670
-
The
method-cache-max-size-none
checker will now also checkfunctools.cache
.Closes #5670
-
BaseChecker
classes now require thelinter
argument to be passed. -
The
set_config_directly
decorator has been removed. -
Don't report
useless-super-delegation
for the__hash__
method in classes that also override the__eq__
method.Closes #3934
-
Fix falsely issuing
useless-suppression
on thewrong-import-position
checker.Closes #5219
-
Fixed false positive
no-member
for Enums with self-defined members.Closes #5138
-
Fix false negative for
no-member
when attempting to assign an instance attribute to itself without any prior assignment.Closes #1555
-
Changed message type from
redefined-outer-name
toredefined-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-imports
andignore-signatures
toFalse
. -
Pylint now expands the user path (i.e.
~
tohome/yusef/
) and expands environment variables (i.e.home/$USER/$project
tohome/yusef/pylint
forUSER=yusef
andproject=pylint
) for pyreverse'soutput-directory
,import-graph
,ext-import-graph
,int-import-graph
options, and the spell checker'sspelling-private-dict-file
option.Refs #6493
-
Don't emit
unsubscriptable-object
for string annotations. Pylint doesn't check if class is only generic in type stubs only. -
Fix pyreverse crash
RuntimeError: dictionary changed size during iteration
Refs #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
pyreverse
diagrams. -
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-test
andmissing-parentheses-for-call-in-test
error messages. -
Don't emit
no-member
inside type annotations withfrom __future__ import annotations
.Closes #6594
-
Fix
unexpected-special-method-signature
false positive for__init_subclass__
methods with one or more arguments.Closes #6644
Deprecations
-
The
ignore-mixin-members
option has been deprecated. You should now use the newignored-checks-for-mixins
option.Closes #5205
-
interfaces.implements
has been deprecated and will be removed in 3.0. Please use standard inheritance patterns instead of__implements__
.Refs #2287
-
All
Interface
classes inpylint.interfaces
have 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
-
MapReduceMixin
has been deprecated.BaseChecker
now implementsget_map_data
andreduce_map_data
. If a checker actually needs to reduce data it should defineget_map_data
as returning something different thanNone
and let itsreduce_map_data
handle a list of the types returned byget_map_data
. An example can be seen by looking atpylint/checkers/similar.py
. -
The
config
attribute ofBaseChecker
has been deprecated. You can usechecker.linter.config
to access the global configuration object instead of a checker-specific object.Refs #5392
-
The
level
attribute ofBaseChecker
has been deprecated: everything is now displayed in--help
, all the time.Refs #5392
-
The
set_option
method ofBaseChecker
has been deprecated. You can usechecker.linter.set_option
to set an option on the global configuration object instead of a checker-specific object.Refs #5392
-
The
options_providers
attribute ofArgumentsManager
has 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-none
checker will now also checkfunctools.cache
. -
The
config
attribute ofPyLinter
is now of theargparse.Namespace
type instead ofoptparse.Values
.Refs #5392
-
UnsupportedAction
has been deprecated.Refs #5392
-
OptionsManagerMixIn
has been deprecated.Refs #5392
-
OptionParser
has been deprecated.Refs #5392
-
Option
has been deprecated.Refs #5392
-
OptionsProviderMixIn
has been deprecated.Refs #5392
-
ConfigurationMixIn
has been deprecated. -
The
option_groups
attribute ofPyLinter
has been deprecated.Refs #5392
-
get_global_config
has been deprecated. You can now access all global options fromchecker.linter.config
.Refs #5392
-
OptionsManagerMixIn
has been replaced withArgumentsManager
.ArgumentsManager
is considered private API and most methods that were public onOptionsManagerMixIn
have now been deprecated and will be removed in a future release.Refs #5392
-
OptionsProviderMixIn
has been replaced withArgumentsProvider
.ArgumentsProvider
is considered private API and most methods that were public onOptionsProviderMixIn
have now been deprecated and will be removed in a future release.Refs #5392
-
pylint.pyreverse.ASTWalker
has 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_enabled
has 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-module
andimport-error
fornumpy.distutils
andpydantic
.Closes #6497
-
Fix
IndexError
crash inuninferable_final_decorators
method.Relates to #6531
-
Fix a crash in
unnecessary-dict-index-lookup
when 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-variable
when usingenumerate()
.Closes #6593
v2.13.8
-
Fix a false positive for
undefined-loop-variable
for 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=
toopen
Closes #6414
-
Avoid reporting
superfluous-parens
on expressions using theis not
operator.Closes #5930
-
Fix a false positive for
undefined-loop-variable
when theelse
of afor
loop raises or returns.Closes #5971
-
Fix false positive for
unused-variable
for classes inside functions and where a metaclass is provided via a call.Closes #4020
-
Fix false positive for
unsubscriptable-object
in 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-test
checker 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-doc
and are parsed correctly. -
Fixed a false positive for
unused-variable
when a builtin specified in--additional-builtins
is given a type annotation.Closes #6388
-
Fixed an
AstroidError
in 2.13.0 raised by theduplicate-code
checker withignore-imports
orignore-signatures
enabled.Closes #6301
v2.13.5
-
Fix false positive regression in 2.13.0 for
used-before-assignment
for homonyms between variable assignments in try/except blocks and variables in subscripts in comprehensions. -
lru-cache-decorating-method
has been renamed tocache-max-size-none
and will only be emitted whenmaxsize
isNone
.Closes #6180
-
Fix false positive for
unused-import
when disabling bothused-before-assignment
andundefined-variable
.Closes #6089
-
Narrow the scope of the
unnecessary-ellipsis
checker to:- functions & classes which contain both a docstring and an ellipsis.
- A body which contains an ellipsis
nodes.Expr
node & at least one other statement.
-
Fix false positive for
used-before-assignment
for assignments taking place via nonlocal declarations after an earlier type annotation.Closes #5394
-
Fix crash for
redefined-slots-in-subclass
when the type of the slot is not a const or a string.Closes #6100
-
Only raise
not-callable
when all the inferred values of a property are not callable.Closes #5931
-
Fix a false negative for
subclassed-final-class
when a set of other messages were disabled.
v2.13.4
-
Fix false positive regression in 2.13.0 for
used-before-assignment
for homonyms between variable assignments in try/except blocks and variables in a comprehension's filter.Closes #6035
-
Include
testing_pylintrc
in source and wheel distributions.Closes #6028
-
Fix crash in
super-init-not-called
checker when usingctypes.Union
.Closes #6027
-
Fix crash for
unneccessary-ellipsis
checker when an ellipsis is used inside of a container or a lambda expression.
v2.13.3
-
Fix false positive for
unnecessary-ellipsis
when 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-parens
for patterns like "return (a or b) in iterable".Closes #5803
-
Fix a false negative regression in 2.13.0 where
protected-access
was not raised on functions.Fixes #5989
-
Better error messages in case of crash if pylint can't write the issue template.
Refer to #5987
v2.13.1
-
Fix a regression in 2.13.0 where
used-before-assignment
was emitted for the usage of a nonlocal in a try block.Fixes #5965
-
Avoid emitting
raising-bad-type
when there is inference ambiguity on the variable being raised.Closes #2793
-
Loosen TypeVar default name pattern a bit to allow names with multiple uppercase characters. E.g.
HVACModeT
orIPAddressT
.Closes #5981
-
Fixed false positive for
unused-argument
when anonlocal
name is used in a nested function that is returned without being called by its parent.Closes #5187
-
Fix program crash for
modified_iterating-list/set/dict
when the list/dict/set being iterated through is a function call.Closes #5969
-
Don't emit
broken-noreturn
andbroken-collections-callable
errors insideif TYPE_CHECKING
blocks.
v2.13.0
: 2.13.0
-
Add missing dunder methods to
unexpected-special-method-signature
check. -
No longer emit
no-member
in for loops that referenceself
if the binary operation that started the for loop uses aself
that is encapsulated in tuples or lists.Ref 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
--notes
options that end in a non-word character.Closes #5840
-
Updated the position of messages for class and function defintions to no longer cover the complete definition. Only the
def
orclass
+ the name of the class/function are covered.Closes #5466
-
using-f-string-in-unsupported-version
andusing-final-decorator-in-unsupported-version
msgids were renamed fromW1601
andW1602
toW2601
andW2602
. Disabling using these msgids will break. This is done in order to restore consistency with the already existing msgids forapply-builtin
andbasestring-builtin
from the now deleted python 3K+ checker. There is now a check that we're not using existing msgids or symbols from deleted checkers.Closes #5729
-
The line numbering for messages related to function arguments is now more accurate. This can require some message disables to be relocated to updated positions.
-
Add
--recursive
option to allow recursive discovery of all modules and packages in subtree. Running pylint with--recursive=y
option will check all discovered.py
files and packages found inside subtree of directory provided as parameter to pylint.Closes #352
-
Add
modified-iterating-list
,modified-iterating-dict
andmodified-iterating-set
, emitted when items are added to or removed from respectively a list, dictionary or set being iterated through.Closes #5348
-
Fix false-negative for
assignment-from-none
checker using list.sort() method.closes #5722
-
New extension
import-private-name
: indicate imports of external private packages and objects (prefixed with_
). It can be loaded usingload-plugins=pylint.extensions.private_import
.Closes #5463
-
Fixed crash from
arguments-differ
andarguments-renamed
when methods were defined outside the top level of a class.Closes #5648
-
Removed the deprecated
check_docs
extension. You can use thedocparams
checker to get the checks previously included incheck_docs
.Closes #5322
-
Added a
testutil
extra require to the packaging, asgitpython
should not be a dependency all the time but is still required to use the primer helper code inpylint.testutil
. You can install it withpip install pylint[testutil]
.Closes #5486
-
Reinstated checks from the python3 checker that are still useful for python 3 (
eq-without-hash
). This is now in thepylint.extensions.eq_without_hash
optional extension.Closes #5025
-
Fixed an issue where
ungrouped-imports
could not be disabled without 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-encoding
checks 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-codec
checks that they aren't used, to allow for backwards compatibility. -
bidirectional-unicode
checks for bidirectional unicode characters that could make code execution different than what the user expects. -
invalid-character-backspace
,invalid-character-carriage-return
,invalid-character-sub
,invalid-character-esc
,invalid-character-zero-width-space
andinvalid-character-nul
to check for possibly harmful unescaped characters.
Closes #5281
-
-
Use the
tomli
package instead oftoml
to parse.toml
files.
Closes #5885
- Fix false positive - Allow unpacking of
self
in a subclass oftyping.NamedTuple
.
Closes #5312
- Fixed false negative
unpacking-non-sequence
when value is an empty list.
Closes #5707
-
Better warning messages for useless else or elif when a function returns early.
Closes #5614
-
Fixed false positive
consider-using-dict-comprehension
when creating a dict using a list of tuples where key AND value vary depending on the same condition.Closes #5588
-
Fixed false positive for
global-variable-undefined
whenglobal
is used with a class nameCloses #3088
-
Fixed false positive for
unused-variable
when anonlocal
name is assigned as part of a multi-name assignment.Closes #3781
-
Fixed a crash in
unspecified-encoding
checker when providingNone
to themode
argument of anopen()
call.Closes #5731
-
Fixed a crash involving a
NewType
named with an f-string.Closes #5770 Ref PyCQA/astroid#1400
-
Improved
bad-open-mode
message when providingNone
to themode
argument of anopen()
call.Closes #5733
-
Added
lru-cache-decorating-method
checker with checks for the use offunctools.lru_cache
on class methods. This is unrecommended as it creates memory leaks by never letting the instance getting garbage collected.Closes #5670
-
Fixed crash with recursion error for inference of class attributes that referenced the class itself.
Closes #5408 Ref PyCQA/astroid#1392
-
Fixed false positive for
unused-argument
when a method overridden in a subclass does nothing with the value of a keyword-only argument.Closes #5771 Ref 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
pylint
now pickles the data passed to subprocesses with thedill
package. Thedill
package has therefore been added as a dependency. -
An astroid issue where symlinks were not being taken into account was fixed
Closes #1470 Closes #3499 Closes #4302 Closes #4798 Closes #5081
-
Fix a crash in
unused-private-member
checker when analyzing code usingtype(self)
in bound methods.Closes #5569
-
Optimize parsing of long lines when
missing-final-newline
is enabled.Closes #5724
-
Fix false positives for
used-before-assignment
from using named expressions in a ternary operator test and using that expression as a call argument. -
Fix false positive for
undefined-variable
whennamedtuple
class attributes are used as return annotations.Closes #5568
-
Fix false negative for
undefined-variable
and related variable messages when the same undefined variable is used as a type annotation and is accessed multiple times, or is used as a default argument to a function.Closes #5399
-
Pyreverse - add output in mermaidjs format
-
Emit
used-before-assignment
instead ofundefined-variable
when attempting to access unused type annotations.Closes #5713
-
Added confidence level
CONTROL_FLOW
for warnings relying on assumptions about control flow. -
used-before-assignment
now considers that assignments in a try block may not have occurred when the except or finally blocks are executed. -
Fixed false negative for
used-before-assignment
when a conditional or context manager intervened before the try statement that suggested it might fail.Closes #4045
-
Fixed false negative for
used-before-assignment
in finally blocks if an except handler did not define the assignment that might have failed in the try block. -
Fixed extremely long processing of long lines with comma's.
Closes #5483
-
Fixed crash on properties and inherited class methods when comparing them for equality against an empty dict.
Closes #5646
-
Fixed a false positive for
assigning-non-slot
when the slotted class defined__setattr__
.Closes #3793
-
Fixed a false positive for
invalid-class-object
when the object being assigned to the__class__
attribute is uninferable. -
Fixed false positive for
used-before-assignment
with self-referential type annotation in conditional statements within class methods.Closes #5499
-
Add checker
redefined-slots-in-subclass
: Emitted when a slot is redefined in a subclass.Closes #5617
-
Fixed false positive for
global-variable-not-assigned
when thedel
statement is usedCloses #5333
-
By default, pylint does no longer take files starting with
.#
into account. Those are consideredemacs file locks
. See https://www.gnu.org/software/emacs/manual/html_node/elisp/File-Locks.html. This behavior can be reverted by redefining theignore-patterns
option.Closes #367
-
Fixed a false positive for
used-before-assignment
when a named expression appears as the first value in a container.Closes #5112
-
used-before-assignment
now assumes that assignments in except blocks may not have occurred and warns accordingly.Closes #4761
-
When evaluating statements after an except block,
used-before-assignment
assumes 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-assignment
when 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
else
clause of a loop,used-before-assignment
assumes 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-assignment
now checks names in try blocks. -
Fixed false positive with
used-before-assignment
for assignment expressions in lambda statements. -
Fixed a false positive (affecting unreleased development) for
used-before-assignment
involving 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
type
as inner variable name.Closes #5461
-
Fixed crash in
use-maxsplit-arg
checker when providing thesep
argument tostr.split()
by keyword.Closes #5737
-
Fix false positive for
unused-variable
for a comprehension variable matching an outer scope type annotation.Closes #5326
-
Fix false negative for
undefined-variable
for a variable used multiple times in a comprehension matching an unused outer scope type annotation.Closes #5654
-
Some files in
pylint.testutils
were deprecated. In the future imports should be done from thepylint.testutils.functional
namespace directly. -
Fixed false positives for
no-value-for-parameter
with variadic positional arguments.Closes #5416
-
safe_infer
no longer makes an inference when given two function definitions with differing numbers of arguments.Closes #3675
-
Fix
comparison-with-callable
false 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-assignment
from a class definition nested under a function subclassing a class defined outside the function.Closes #4590
-
Fix
unnecessary_dict_index_lookup
false positive when deleting a dictionary's entry.Closes #4716
-
Fix false positive for
used-before-assignment
when an except handler shares a name with a test in a filtered comprehension.Closes #5817
-
Fix crash in
unnecessary-dict-index-lookup
checker if the output ofitems()
is assigned to a 1-tuple.Closes #5504
-
When invoking
pylint
,epylint
,symilar
orpyreverse
by importing them in a python file you can now pass anargv
keyword besides patchingsys.argv
.Closes #5320
-
The
PyLinter
class will now be initialized with aTextReporter
as its reporter if none is provided. -
Fix
super-init-not-called
when parent orself
is aProtocol
Closes #4790
-
Fix false positive
not-callable
with attributes that aliasNamedTuple
Partially closes #1730
-
Emit
redefined-outer-name
when a nested except handler shadows an outer one. -
Fix false positive
super-init-not-called
for classes that inherit theirinit
from a parent.Closes #4941
-
encoding
can 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
-
fatal
was 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-dictionary
during membership checks encapsulated in iterables ornot in
checksCloses #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-quotes
for 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-differ
when superclass static methods lacked a@staticmethod
decorator.Closes #5371
-
TypingChecker
-
Added new check
broken-noreturn
to detect broken uses oftyping.NoReturn
ifpy-version
is set to Python3.7.1
or below. https://bugs.python.org/issue34921 -
Added new check
broken-collections-callable
to detect broken uses ofcollections.abc.Callable
ifpy-version
is set to Python3.9.1
or below. https://bugs.python.org/issue42965
-
-
The
testutils
for unittests now acceptend_lineno
andend_column
. Tests without these will trigger aDeprecationWarning
. -
arguments-differ
will no longer complain about method redefinitions with extra parameters that have default values. -
Fixed false positive
unexpected-keyword-arg
for decorators.Closes #258
-
Importing the deprecated stdlib module
xml.etree.cElementTree
now emitsdeprecated_module
.Closes #5862
-
Disables for
deprecated-module
and similar warnings for stdlib features deprecated in newer versions of Python no longer raiseuseless-suppression
when linting with older Python interpreters where those features are not yet deprecated. -
Importing the deprecated stdlib module
distutils
now emitsdeprecated_module
on Python 3.10+. -
missing-raises-doc
will now check the class hierarchy of the raised exceptions.. code-block:: python
def my_function() """My function.
Raises: Exception: if something fails """ raise ValueError
Closes #4955
-
Allow disabling
duplicate-code
with a disable comment when running through pylint.Closes #214
-
Improve
invalid-name
check forTypeVar
names. The accepted pattern can be customized with--typevar-rgx
.Closes #3401
-
Added new checker
typevar-name-missing-variance
. Emitted when a covariant or contravariantTypeVar
does not end with_co
or_contra
respectively or when aTypeVar
is not either but has a suffix. -
Allow usage of mccabe 0.7.x release
Closes #5878
-
Fix
unused-private-member
false positive when accessing private methods throughproperty
.Closes #4756
Configuration
-
If you want to rebase/retry this MR, check this box
This MR has been generated by Renovate Bot.