NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #501 most downloaded on PyPI
python code static checker
Last release 2 days ago
02 Oct 2026
Release timing varies
gaps range from 9 days to 4 months
Most releases are documented
notes for 50 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
18 years old
218 releases · first in 2009
Passing it explicitly to add_message , add_ignored_message or Message now emits a DeprecationWarning : it will raise an error in pylint 5.0.
Release date: 2026-10-03
Fixed a false positive unbalanced-tuple-unpacking when unpacking a tuple
concatenation whose elements have several possible values.
Fixed by upgrading astroid to 4.3.3.
Closes #2621
Fixed a crash when calling __bases__ on a class.
Fixed by upgrading astroid to 4.3.3.
Closes #11491
Fix a crash (astroid-error) when the class of a called attribute cannot
be fully inferred, for example when the attribute is used as a with
statement target or inside a comprehension.
Closes #11492
Fix a crash when a name bound by a type statement (a TypeVar) is used in a with statement.
Closes #11510
Fixed a crash (TypeError) in the variables checker when checking a class
whose metaclass name binding has no line number, for example a class defined
with metaclass=__annotations__.
Closes #11511
Fix a crash in the using-final-decorator-in-unsupported-version check
when import final is used.
Closes #11521
Fix a crash when a plugin passes confidence=None to add_message, as
pylint-pytest does, for a message that is disabled. confidence=None is
accepted again and means UNDEFINED, like in pylint 4.0. Passing it
explicitly to add_message, add_ignored_message or Message now emits a
DeprecationWarning: it will raise an error in pylint 5.0.
Closes #11530
One column per quarter.
Pylint 4.1.0 could not be uploaded to PyPI, because it required an unreleased version of dill on Python 3.15, and PyPI refuses such a dependency. 4.1.
Release date: 2026-09-29
Pylint 4.1.0 could not be uploaded to PyPI, because it required an unreleased
version of dill on Python 3.15, and PyPI refuses such a dependency. 4.1.1 is
the first 4.1 release available on PyPI, see the 4.1.0 changes below.
Refs #11495
Fix false positives for :ref: unnecessary-lambda when a variable referenced in the called expression is assigned, reassigned, or deleted later in the
Release date: 2026-09-29
Fix false positives for :ref:unnecessary-lambda when a variable referenced in
the called expression is assigned, reassigned, or deleted later in the same scope.
Closes #8192
Fix a false positive for unused-argument in dataclass __new__ methods
when the arguments are consumed by a generated __init__ method.
Closes #9843
Fix a false positive for missing-kwoa when keyword-only arguments are passed
through a **kwargs dictionary that is not a literal at the call site, for
example one filled with options["key"] = value after its creation.
Closes #10029
ungrouped-imports no longer reports imports inside mutually exclusive
OS guard branches (if os.name == "nt": / if sys.platform == "win32":),
matching the existing behavior for sys.version_info guards.
Closes #10460
A TypeError crash could occur when checking a for loop that
iterates over a subscript with non-numeric constant bounds or a zero
step, e.g. for a, b in {"k": [][0: ""]}.values():.
Closes #11472
Fix a crash (AttributeError: 'ClassDef' object has no attribute 'expr') in the
import-private-name extension when an annotated assignment's value is an
attribute access on a call rooted at a non-Name node, e.g. x: str = ''().a.
Closes #11479
Someone without access to the configuration or linted code, but with access to the cache directory (predictable PYLINT_HOME on a multi-user host) can
Release date: 2026-09-23
PYLINT_HOME on a multi-user host) can noPYLINT_HOME~/.cache/pylint,Fixed a false positive for no-self-use on a method that only uses
self before a locally defined class (or other nested method), because
the checker's could-be-a-function tracking state was not restored after
visiting the nested method.
Closes #3705
Fix a false positive for :ref:not-callable when calling functions constructed with
types.FunctionType or types.LambdaType.
Closes #7500
Fix a false positive for unnecessary-direct-lambda-call when a directly called
lambda in a class body wraps a comprehension containing an assignment expression.
PEP 572 makes that a SyntaxError without the lambda's scope, so following the
message produced code that would not compile.
Closes #9294
Fix a false positive for :ref:unnecessary-ellipsis when an ellipsis is the
sole body statement of a method defined on a Protocol.
Closes #9319
Fix a false positive for :ref:bad-exception-cause when the bases of the class
being raised from cannot be inferred, such as an exception deriving from a
C extension class. :ref:raising-non-exception and
:ref:catching-non-exception already guard the same inherit_from_std_ex
helper with has_known_bases.
Refs #11399
method-hidden is no longer silenced when the hidden method shares its name with
a builtin function or with a function defined at module level. Only members of the
ancestor classes themselves can excuse the method now.
Refs #11361
Fix a block-scoped # pylint: disable= directive placed inside an if
body leaking into sibling elif/else blocks for messages such as
stop-iteration-return, which default to a line-based (rather than
node-based) message scope.
Closes #3136
Fix a false positive for declare-non-slot when a class variable is
annotated with ClassVar without an initial value.
Closes #9950
Fix a crash in the no-member checker when attribute lookup raises an
InferenceError.
Closes #11356
Fix a crash in the unnecessary-default-type-args check when a Generator
or AsyncGenerator subscript holds an empty tuple, such as Generator[()].
Closes #11357
Fix a crash in method-hidden when a method shadows a name that builtins
binds to a node without a statement, such as help or license. Every class
inherits from object, which lives in the builtins module, so no base class
was needed to trigger it.
Fix a false positive for :ref: unspecified-encoding when an open call uses a mode argument that cannot be inferred.
Release date: 2026-08-29
Fix a false positive for :ref:unspecified-encoding when an open call uses a mode
argument that cannot be inferred.
Closes #10201
Fix a false positive for invalid-name (C0103) on names assigned in an
if __name__ == "__main__": block. Such a block reads like a script body, so
a name there is now accepted if it matches either the constant or the variable
naming style.
Closes #10766
Fix false positives for :ref:invalid-str-returned, :ref:invalid-repr-returned,
:ref:invalid-format-returned, :ref:invalid-bytes-returned, :ref:invalid-hash-returned,
:ref:invalid-index-returned, :ref:invalid-length-returned,
:ref:invalid-length-hint-returned, :ref:invalid-getnewargs-returned and
:ref:invalid-getnewargs-ex-returned when the returned value is an instance of a
subclass of the expected builtin type, such as self in a str subclass or a
namedtuple.
Closes #11306
Fix false positives for :ref:bad-string-format-type when the argument is an
instance of a subclass of int, float or str, such as bool or an
IntEnum member formatted with %d.
Closes #11315
redundant-unittest-assert now also flags assertEqual and assertNotEqual
when both compared values are constants, e.g. self.assertEqual(5, 5).
Closes #11321
Fix a crash in the docparams extension when a raised name does not infer to an exception, such as raise sum or raise some_module. Such objects have no ancestors(), which aborted the whole file with an astroid-error fatal message.
Closes #11228
Fix a crash in the use-yield-from checker (AttributeError: 'Subscript' object has no attribute 'name') when a loop target is a subscript, attribute, or tuple.
Closes #11286
Fix a crash in the docparams extension (AttributeError: 'AssignName' object has no attribute 'decorators') when a class has non-function attributes sharing the name of a property setter.
Closes #11287
Upgrade the isort upper bound so isort 9 can be installed alongside pylint.
Closes #11351
Fix a false positive for invalid-name when a module-level variable is assigned an instance of a TypedDict subclass. Such a name is a value, not a type
Release date: 2026-08-09
Fix a false positive for invalid-name when a module-level variable is assigned
an instance of a TypedDict subclass. Such a name is a value, not a type
definition, so it is now checked against the constant or variable regex instead
of class-rgx.
Closes #11231
Fix a crash in the bad-open-mode check when the mode argument of
open is the NotImplemented constant (Python >= 3.14).
Closes #11099
Fix a crash in the not-context-manager and not-async-context-manager
checks when the context manager infers to a value without a name, such as the
slice returned by with slice(...) / async with slice(...).
Closes #11102
Fix a false positive for nested-min-max (W3301) when the inner min/max call carries a keyword argument such as key=. Flattening the call dropped the keyword and changed the result, so nested calls whose inner call has keyword arguments are no longer flagged.
Closes #11130
Fix a false suggestion from nested-min-max (W3301): when rewriting a nested min/max into a splat call, arguments positioned after the splatted call were silently dropped, so the suggested code changed the result.
Closes #11134
Fix a false positive for too-many-locals (R0914): PEP 695 type parameters, i.e. the T1 and T2 in a generic def f[T1, T2] signature, were counted as local variables. They are type-system constructs, not runtime locals, and are now excluded from the local-variable count.
Closes #11136
Fix literal-comparison (R0123) emitting a corrupted suggestion for identifiers
that contain is (e.g. axis is 5 was rendered ax== == 5). The suggestion
is now rebuilt from the operands and operator.
Closes #11146
Fix false positives in bad-string-format-type (E1307) for valid % formatting:
%i/%u applied to a float (both truncate like %d) and %a applied to any
non-int type (%a is type-agnostic like %s/%r).
Closes #11147
Fix a false positive for :ref:useless-parent-delegation when an override changes
the default value of a positional-only parameter.
Closes #11148
Fixed a crash in comparison-with-callable when comparing a lambda assigned as a class attribute.
Closes #11175
too-many-lines could be reported at the line of a # pylint: disable=too-many-lines
pragma found in a previously linted module. Pragma positions are now reset between
modules, so the message is reported at line 1 (or at the current module's own pragma)
regardless of which files were linted before.
Refs #11191
Fix a crash when a call unpacks a dictionary whose keys are not string
constants, e.g. copy.copy(**{-1: 1}).
Closes #11222
Fix a crash in the deprecated checker when __import__ is called with a non-string constant argument (for example __import__(1) ).
Release date: 2026-06-14
implicit-str-concat is no longer emitted for an implicit concatenation of
a raw string with a non-raw one (e.g. r"\d" "\n"). Such literals cannot be
merged into a single string, so the concatenation is intentional rather than a
forgotten comma.
Closes #6663
Fix a false positive for invalid-name (C0103) where the default
typevar-rgx rejected TypeVar names containing digits, such as
Ec2T.
Closes #8499
Fix a false positive for too-many-arguments in (non-static) methods and classmethods.
Closes #8675
Fix a false positive for no-member when a value is inferred to several
possible types and at least one of them defines a dynamic __getattr__.
Closes #9833
Fix a false positive for function-redefined (E0102) when reusing names that
match dummy-variables-rgx (such as _), which is common for
pytest-bdd step definitions. This restores the behavior from before pylint
4.0.0; as a consequence the false negative fixed in #9894 is reintroduced for
functions whose name matches dummy-variables-rgx.
Closes #10665
Fix undefined-variable false positive when a name used as a metaclass
argument in a nested class is referenced again later in the module.
Closes #10823
Fix a false positive for unused-variable where global variables matching
dummy-variables-rgx were still reported as unused when
allow-global-unused-variables was disabled.
Closes #10890
Fix a false positive for bad-dunder-name when there is a user-defined __suppress_context__ attribute on exception subclasses.
Closes #10960
Fix used-before-assignment false positive for names bound by from X import * in every branch of an if/elif/else chain.
Refs #10980
Check for metaclass call signature when evaluating arguments of a class call.
Closes #11032
Fix false positive method-hidden when cached_property is imported directly with from functools import cached_property.
Refs #11037
Fix the suggestion of unnecessary-comprehension for a dict comprehension
that iterates a dict directly, e.g. {a: b for a, b in d}. Iterating a dict
yields its keys, so the suggestion is now dict(d.keys()) instead of the
incorrect dict(d), which would simply copy d.
Closes #8256
Fix a crash in consider-using-enumerate when the for loop target is an attribute (e.g. for self.idx in range(len(x))) rather than a simple variable name.
Closes #10099
Fix crash when checking attribute-defined-outside-init on classes that inherit from a base class pylint cannot fully analyze.
Closes #10892
Fix add_message silently overwriting an explicit col_offset=0 (or any other zero-valued line/end_lineno/end_col_offset) with the AST node's value. The internal _add_one_message helper used a falsey check (if not col_offset:) to detect an omitted argument, which incorrectly treated a legitimate 0 the same as None. It now uses an identity check against None.
Refs #11020
Fix a crash in the name checker when a non-constant value is passed as the covariant or contravariant argument of a TypeVar.
Closes #11022
Fix a crash in the variable checker when a name resolves to a dataclass-synthesized __init__, which has no line number.
Closes #11023
Fix a crash in the variables checker when NotImplemented is used as the test of an if statement, which raised a TypeError in a boolean context on Python 3.14.
Closes #11025
Avoided a crash from the implicit booleaness checker for len() calls without arguments.
Closes #11028
Fix a crash in the variables checker when a class declares a metaclass whose
attribute-access chain does not bottom out at a name (e.g.
class C(metaclass=None._)).
Originally reported as pylint-dev/astroid#3066.
Refs #11031
Fix a crash in the name checker when a chained assignment of a TypeAlias
value has a non-name target such as a Subscript (for example
a[0] = b = TypeAlias).
Closes #11056
Fix a crash in the deprecated checker when __import__ is called with a
non-string constant argument (for example __import__(1)).
Closes #11059
Avoid crashing when enum member inference fails while checking enum subclasses.
Closes #11069
Prevent a crash in unexpected-keyword-arg analysis when
infer_call_result() raises InferenceError while inspecting
decorator return signatures.
Closes #11070
Fix a crash in the typecheck checker when a class uses a non-class object
(for example a function) as its metaclass= argument.
Closes #11071
Allow digits in ParamSpec and TypeVarTuple names for invalid-name check.
The default paramspec-rgx and typevartuple-rgx patterns rejected names
containing digits (e.g. Ec2P, S3Ts), emitting a false invalid-name
(C0103). Allow digits in the lowercase segments, consistent with the
typevar and typealias patterns.
Closes #11090
The duplicate-code checker no longer runs when its message (R0801) is disabled, even if reports=yes is set. Previously, the checker's report (RP0801) would cause the expensive similarity computation to run regardless.
Closes #3443
Fix possibly-used-before-assignment false positive when using self.fail() in tests.
Release date: 2026-02-20
Fix possibly-used-before-assignment false positive when using self.fail() in tests.
Closes #10743
Fixed false positive for logging-unsupported-format when no arguments are provided to logging functions.
According to Python's logging documentation, no formatting is performed when no arguments are supplied, so strings like logging.error("%test") are valid.
Closes #10752
Fix a false positive for invalid-name where a dataclass field typed with Final
was evaluated against the class_const regex instead of the class_attribute regex.
Closes #10790
Avoid emitting unspecified-encoding (W1514) when py-version is 3.15+.
Refs #10791
Fixed false positive for invalid-name where module-level constants were incorrectly classified as variables when a class-level attribute with the same
Release date: 2025-11-30
Add Enum dunder methods _generate_next_value_ , _missing_ , _numeric_repr_ , _add_alias_ , and _add_value_alias_ to the list passed to --good-dunder-n
Release date: 2025-11-13
Add Enum dunder methods _generate_next_value_, _missing_, _numeric_repr_, _add_alias_, and _add_value_alias_ to the list passed to --good-dunder-names.
Closes #10435
Fixed false positive for invalid-name with typing.Annotated.
Closes #10696
Fix false positive for f-string-without-interpolation with template strings
when using format spec.
Closes #10702
Fix a false positive when an UPPER_CASED class attribute was raising an
invalid-name when typed with Final.
Closes #10711
Fix a false positive for unbalanced-tuple-unpacking when a tuple is assigned to a function call and the structure of the function's return value is ambiguous.
Closes #10721
Make 'ignore' option work as expected again.
Closes #10669
Fix crash for consider-using-assignment-expr when a variable annotation without assignment
is used as the if test expression.
Closes #10707
Fix crash for prefer-typing-namedtuple and consider-math-not-float when
a slice object is called.
Closes #10708
Fix false positive for invalid-name on a partially uninferable module-level constant.
Fix false positive for invalid-name on a partially uninferable module-level constant.
Closes #10652
Fix a false positive for invalid-name on exclusive module-level assignments
composed of three or more branches. We won't raise disallowed-name on module-level names that can't be inferred
until a further refactor to remove this false negative is done.
Closes #10664
Fix false positive for invalid-name for TypedDict instances.
Closes #10672
Exclude __all__ and __future__.annotations from unused-variable .
Release date: 2025-10-14
Exclude __all__ and __future__.annotations from unused-variable.
Closes #10019
Fix false-positive for bare-name-capture-pattern if a case guard is used.
Closes #10647
Check enums created with the Enum() functional syntax to pass against the
--class-rgx for the invalid-name check, like other enums.
Closes #10660
The unused pylintrc argument to PyLinter.__init__() is deprecated and will be removed.
Pylint now supports Python 3.14.
Pylint's inference engine (astroid) is now much more precise,
understanding implicit booleanness and ternary expressions. (Thanks @zenlyj!)
Consider this example:
class Result:
errors: dict | None = None
result = Result()
if result.errors:
result.errors[field_key]
# inference engine understands result.errors cannot be None
# pylint no longer raises unsubscriptable-objectThe required astroid version is now 4.0.0. See the astroid changelog for additional fixes, features, and performance improvements applicable to pylint.
invalid-name at the module level was patchy. Now,--variable-rgx rather than --const-rgx. Module-level lists,Here, LIMIT is reassigned, so pylint only uses --variable-rgx:
LIMIT = 500 # [invalid-name]
if sometimes:
LIMIT = 1 # [invalid-name]If this is undesired, refactor using exclusive assignment so that it is
evident that this assignment happens only once:
if sometimes:
LIMIT = 1
else:
LIMIT = 500 # exclusive assignment: uses const regex, no warningLists, sets, and objects still pass against either const-rgx or variable-rgx
even if reassigned, but are no longer completely skipped:
MY_LIST = []
my_list = []
My_List = [] # [invalid-name]Remember to adjust the regexes and allow lists to your liking.
invalid-name now distinguishes module-level constants that are assigned only once
from those that are reassigned and now applies --variable-rgx to the latter. Values
other than literals (lists, sets, objects) can pass against either the constant or
variable regexes (e.g. "LOGGER" or "logger" but not "LoGgEr").
Remember that --good-names or --good-names-rgxs can be provided to explicitly
allow good names.
Closes #3585
The unused pylintrc argument to PyLinter.__init__() is deprecated
and will be removed.
Refs #6052
Commented out code blocks such as # bar() # TODO: remove dead code will no longer emit fixme.
Refs #9255
pyreverse Run was changed to no longer call sys.exit() in its __init__.
You should now call Run(args).run() which will return the exit code instead.
Having a class that always raised a SystemExit exception was considered a bug.
Normal usage of pyreverse through the CLI will not be affected by this change.
Refs #9689
The suggestion-mode option was removed, as pylint now always emits user-friendly hints instead
of false-positive error messages. You should remove it from your conf if it's defined.
Refs #9962
The async.py checker module has been renamed to async_checker.py since async is a Python keyword
and cannot be imported directly. This allows for better testing and extensibility of the async checker functionality.
Refs #10071
The message-id of continue-in-finally was changed from E0116 to W0136. The warning is
now emitted for every Python version since it will raise a syntax warning in Python 3.14.
See PEP 765 - Disallow return/break/continue that exit a finally block.
Refs #10480
Removed support for nmp.NaN alias for numpy.NaN being recognized in ':ref:nan-comparison'. Use np or numpy instead.
Refs #10583
Version requirement for isort has been bumped to >=5.0.0.
The internal compatibility for older isort versions exposed via pylint.utils.IsortDriver has
been removed.
Refs #10637
comparison-of-constants now uses the unicode from the ast instead of reformatting from
the node's values preventing some bad formatting due to utf-8 limitation. The message now uses
" instead of ' to better work with what the python ast returns.
Refs #8736
Enhanced pyreverse to properly distinguish between UML relationship types (association, aggregation, composition) based on object ownership semantics. Type annotations without assignment are now treated as associations, parameter assignments as aggregations, and object instantiation as compositions.
The fixme check can now search through docstrings as well as comments, by using
check-fixme-in-docstring = true in the [tool.pylint.miscellaneous] section.
Closes #9255
The use-implicit-booleaness-not-x checks now distinguish between comparisons
used in boolean contexts and those that are not, enabling them to provide more accurate refactoring suggestions.
Closes #9353
The verbose option now outputs the filenames of the files that have been checked.
Previously, it only included the number of checked and skipped files.
Closes #9357
colorized reporter now colorizes messages/categories that have been configured as fail-on in red inverse.
This makes it easier to quickly find the errors that are causing pylint CI job failures.
Closes #9898
Enhanced support for @Property decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams.
Closes #10057
Add --max-depth option to pyreverse to control diagram complexity. A depth of 0 shows only top-level packages, 1 shows one level of subpackages, etc.
This helps manage visualization of large codebases by limiting the depth of displayed packages and classes.
Refs #10077
Handle deferred evaluation of annotations in Python 3.14.
Closes #10149
Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator).
Closes #10236
pyreverse: add support for colorized output when using output format mmd (MermaidJS) and html.
Closes #10242
pypy 3.11 is now officially supported.
Refs #10287
Add support for Python 3.14.
Refs #10467
Add naming styles for ParamSpec and TypeVarTuple that align with the TypeVar style.
Refs #10541
Add match-statements checker and the following message:
bare-name-capture-pattern.
This will emit an error message when a name capture pattern is used in a match statement which would make the remaining patterns unreachable.
This code is a SyntaxError at runtime.
Closes #7128
Add new check async-context-manager-with-regular-with to detect async context managers used with regular with statements instead of async with.
Refs #10408
Add break-in-finally warning. Using break inside the finally clause
will raise a syntax warning in Python 3.14.
See PEP 765 - Disallow return/break/continue that exit a finally block <https://peps.python.org/pep-0765/>_.
Refs #10480
Add new checks for invalid uses of class patterns in :keyword:match.
invalid-match-args-definition is emitted if :py:data:object.__match_args__ isn't a tuple of strings.too-many-positional-sub-patterns if there are more positional sub-patterns than specified in :py:data:object.__match_args__.multiple-class-sub-patterns if there are multiple sub-patterns for the same attribute.Refs #10559
Add additional checks for suboptimal uses of class patterns in :keyword:match.
match-class-bind-self is emitted if a name is bound to self instead ofas pattern.match-class-positional-attributes is emitted if a class pattern has positionalRefs #10587
Add a consider-math-not-float message. float("nan") and float("inf") are slower
than their counterpart math.inf and math.nan by a factor of 4 (notwithstanding
the initial import of math) and they are also not well typed when using mypy.
This check also catches typos in float calls as a side effect.
The :ref:pylint.extensions.code_style need to be activated for this check to work.
Refs #10621
Fix a false positive for used-before-assignment when a variable defined under
an if and via a named expression (walrus operator) is used later when guarded
under the same if test.
Closes #10061
Fix :ref:no-name-in-module for members of concurrent.futures with Python 3.14.
Closes #10632
Fix false negative for used-before-assignment when a TYPE_CHECKING import is used as a type annotation prior to erroneous usage.
Refs #8893
Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly.
Refs #9667
Check module-level constants with type annotations for invalid-name.
Remember to adjust const-naming-style or const-rgx to your liking.
Closes #9770
Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore.
Closes #9894
We now raise a logging-too-few-args for format string with no
interpolation arguments at all (i.e. for something like logging.debug("Awaiting process %s")
or logging.debug("Awaiting process {pid}")). Previously we did not raise for such case.
Closes #9999
Fix false negative for used-before-assignment when a function is defined inside a TYPE_CHECKING guard block and used later.
Closes #10028
Fix a false negative for possibly-used-before-assignment when a variable is conditionally defined
and later assigned to a type-annotated variable.
Closes #10421
Fix false negative for deprecated-module when a __import__ method is used instead of import sentence.
Refs #10453
Count match cases for too-many-branches check.
Refs #10542
Fix false-negative where :ref:unused-import was not reported for names referenced in a preceding global statement.
Refs #10633
When displaying unicode with surrogates (or other potential UnicodeEncodeError),
pylint will now display a '?' character (using encode(encoding="utf-8", errors="replace"))
instead of crashing. The functional tests classes are also updated to handle this case.
Closes #8736
Fixed unidiomatic-typecheck only checking left-hand side.
Closes #10217
Fix a crash caused by malformed format strings when using .format with keyword arguments.
Closes #10282
Fix false positive inconsistent-return-statements when using quit() or exit() functions.
Closes #10508
Fix a crash in :ref:nested-min-max when using builtins.min or builtins.max
instead of min or max directly.
Closes #10626
Fixed a crash in :ref:unnecessary-dict-index-lookup when the index of an enumerated list
was deleted inside a for loop.
Closes #10627
Remove support for launching pylint with Python 3.9.
Code that supports Python 3.9 can still be linted with the --py-version=3.9 setting.
Refs #10405
Modified test framework to allow for different test output for different Python versions.
Refs #10382
No longer flag undeprecated functions in importlib.resources as deprecated.
Release date: 2025-10-05
Fix used-before-assignment for PEP 695 type aliases and parameters.
Closes #9815
No longer flag undeprecated functions in importlib.resources as deprecated.
Closes #10593
Fix false positive inconsistent-return-statements when using quit() or exit() functions.
Closes #10508
Fix false positive undefined-variable (E0602) for for-loop variable shadowing patterns like for item in item: when the variable was previously defined.
Closes #10562
Fixed crash in 'unnecessary-list-index-lookup' when starting an enumeration using
minus the length of an iterable inside a dict comprehension when the len call was only
made in this dict comprehension, and not elsewhere. Also changed the approach,
to use inference in all cases but the simple ones, so we don't have to fix crashes
one by one for arbitrarily complex expressions in enumerate.
Closes #10510
This patch release includes an exceptional fix for a false negative issue. For details, see: https://github.com/pylint-dev/pylint/pull/10482#issuecomm
Release date: 2025-08-09
This patch release includes an exceptional fix for a false negative issue. For details, see: https://github.com/pylint-dev/pylint/pull/10482#issuecomment-3164514082
Fix false positives for possibly-used-before-assignment when variables are exhaustively
assigned within a match block.
Closes #9668
Fix false positive for missing-raises-doc and missing-yield-doc when the method length is less than docstring-min-length.
Refs #10104
Fix a false positive for unused-variable when multiple except handlers bind the same name under a try block.
Closes #10426
Fix false-negative for used-before-assignment with from __future__ import annotations in function definitions.
Refs #10482
Fix a bug in Pyreverse where aggregations and associations were included in diagrams regardless of the selected --filter-mode (such as PUB_ONLY, ALL, etc.).
Closes #10373
Fix double underscores erroneously rendering as bold in pyreverse's Mermaid output.
Closes #10402
Comparisons between two calls to type() won't raise an unidiomatic-typecheck warning anymore, consistent with the behavior applied only for == previou
Release date: 2025-05-04
Comparisons between two calls to type() won't raise an unidiomatic-typecheck warning anymore, consistent with the behavior applied only for == previously.
Closes #10161
Fixed a crash when importing a class decorator that did not exist with the same name as a class attribute after the class definition.
Closes #10105
Fix a crash caused by malformed format strings when using .format with keyword arguments.
Closes #10282
Using a slice as a class decorator now raises a not-callable message instead of crashing. A lot of checks that dealt with decorators (too many to list) are now shortcut if the decorator can't immediately be inferred to a function or class definition.
Closes #10334
The algorithm used for no-member suggestions is now more efficient and cuts the
calculation when the distance score is already above the threshold.
Refs #10277
Fix a false positive for used-before-assignment when an inner function's return type annotation is a class defined at module scope.
Release date: 2025-03-20
Fix a false positive for used-before-assignment when an inner function's return type
annotation is a class defined at module scope.
Closes #9391
Remove getopt and optparse from the list of deprecated modules.
Release date: 2025-03-09
Fix false positives for use-implicit-booleaness-not-comparison, use-implicit-booleaness-not-comparison-to-string
and use-implicit-booleaness-not-comparison-to-zero when chained comparisons are checked.
Closes #10065
Fix a false positive for invalid-getnewargs-ex-returned when the tuple or dict has been assigned to a name.
Closes #10208
Remove getopt and optparse from the list of deprecated modules.
Closes #10211
Fixed conditional import x.y causing false positive possibly-used-before-assignment.
Closes #10081
Fix a crash when something besides a class is found in an except handler.
Closes #10106
Fixed raising invalid-name when using camelCase for private methods with two leading underscores.
Closes #10189
Upload release assets to PyPI via Trusted Publishing.
Closes #10256
Nothing published for this version
Fixes "skipped files" count calculation; the previous method was displaying an arbitrary number.
Fixes "skipped files" count calculation; the previous method was displaying an arbitrary number.
Closes #10073
Fixes a crash that occurred when pylint was run in a container on a host with cgroupsv2 and restrictions on CPU usage.
Closes #10103
Relaxed the requirements for isort so pylint can benefit from isort 6.
Closes #10203
Fix false positives for undefined-variable for classes using Python 3.12 generic type syntax.
Release date: 2024-12-23
Fix false positives for undefined-variable for classes using Python 3.12
generic type syntax.
Closes #9335
Fix a false positive for use-implicit-booleaness-not-len. No lint should be emitted for
generators (len is not defined for generators).
Refs #10100
Fix Unable to import 'collections.abc' (import-error) on Python 3.13.1.
Closes #10112
Fix a false positive for potential-index-error when an indexed iterable contains a starred element that evaluates to more than one item.
Fix a false positive for potential-index-error when an indexed iterable
contains a starred element that evaluates to more than one item.
Closes #10076
Fixes the issue with --source-root option not working when the source files are in a subdirectory of the source root (e.g. when using a /src layout).
Closes #10026
Fix regression causing some f-strings to not be inferred as strings.
Release date: 2024-09-24
Fix regression causing some f-strings to not be inferred as strings.
Closes #9947
We migrated symilar to argparse, from getopt, so the error and help output changed (for the better). We exit with 2 instead of sometime 1, sometime 2.
Release date: 2024-09-20
We migrated symilar to argparse, from getopt, so the error and help output changed
(for the better). We exit with 2 instead of sometime 1, sometime 2. The error output
is not captured by the runner anymore. It's not possible to use a value for the
boolean options anymore (--ignore-comments 1 should become --ignore-comments).
Refs #9731
Add new declare-non-slot error which reports when a class has a __slots__ member and a type hint on the class is not present in __slots__.
Refs #9499
Added too-many-positional-arguments to allow distinguishing the configuration for too many
total arguments (with keyword-only params specified after *) from the configuration
for too many positional-or-keyword or positional-only arguments.
As part of evaluating whether this check makes sense for your project, ensure you
adjust the value of --max-positional-arguments.
Closes #9099
Add using-exception-groups-in-unsupported-version and
using-generic-type-syntax-in-unsupported-version for uses of Python 3.11+ or
3.12+ features on lower supported versions provided with --py-version.
Closes #9791
Add using-assignment-expression-in-unsupported-version for uses of := (walrus operator)
on Python versions below 3.8 provided with --py-version.
Closes #9820
Add using-positional-only-args-in-unsupported-version for uses of positional-only args on
Python versions below 3.8 provided with --py-version.
Closes #9823
Add unnecessary-default-type-args to the typing extension to detect the use
of unnecessary default type args for typing.Generator and typing.AsyncGenerator.
Refs #9938
Fix computation of never-returning function: Never is handled in addition to NoReturn, and priority is given to the explicit --never-returning-functions option.
Closes #7565.
Fix a false negative for await-outside-async when await is inside Lambda.
Refs #9653
Fix a false negative for duplicate-argument-name by including positional-only, *args and **kwargs arguments in the check.
Closes #9669
Fix false negative for multiple-statements when multiple statements are present on else and finally lines of try.
Refs #9759
Fix false negatives when isinstance does not have exactly two arguments.
pylint now emits a too-many-function-args or no-value-for-parameter
appropriately for isinstance calls.
Closes #9847
--enable with --disable=all now produces an error, when an unknown msg code is used. Internal pylint messages are no longer affected by --disable=all.
Closes #9403
Impossible to compile regexes for paths in the configuration or argument given to pylint won't crash anymore but
raise an argparse error and display the error message from re.compile instead.
Closes #9680
Fix a bug where a tox.ini file with pylint configuration was ignored and it exists in the current directory.
.cfg and .ini files containing a Pylint configuration may now use a section named [pylint]. This enhancement impacts the scenario where these file types are used as defaults when they are present and have not been explicitly referred to, using the --rcfile option.
Closes #9727
Improve file discovery for directories that are not python packages.
Closes #9764
Remove support for launching pylint with Python 3.8.
Code that supports Python 3.8 can still be linted with the --py-version=3.8 setting.
Refs #9774
Add support for Python 3.13.
Refs #9852
All variables, classes, functions and file names containing the word 'similar', when it was, in fact, referring to 'symilar' (the standalone program for the duplicate-code check) were renamed to 'symilar'.
Closes #9734
Remove old-style classes (Python 2) code and remove check for new-style class since everything is new-style in Python 3. Updated doc for exception checker to remove reference to new style class.
Refs #9925
Fixed a false positive unreachable for NoReturn coroutine functions.
Release date: 2024-08-31
Fixed a false positive unreachable for NoReturn coroutine functions.
Closes #9840
Fix crash in refactoring checker when calling a lambda bound as a method.
Closes #9865
Fix a crash in undefined-loop-variable when providing the iterable argument to enumerate().
Closes #9875
Fix to address indeterminacy of error message in case a module name is same as another in a separate namespace.
Refs #9883
Quiet false positives for unexpected-keyword-arg when pylint cannot determine which of two or more dynamically defined classes is being instantiated.
Release date: 2024-07-21
Quiet false positives for unexpected-keyword-arg when pylint cannot
determine which of two or more dynamically defined classes is being instantiated.
Closes #9672
Fix a false positive for missing-param-doc where a method which is decorated with typing.overload was expected to have a docstring specifying its parameters.
Closes #9739
Fix a regression that raised invalid-name on class attributes merely
overriding invalid names from an ancestor.
Closes #9765
Treat assert_never() the same way when imported from typing_extensions.
Closes #9780
Fix a false positive for consider-using-min-max-builtin when the assignment target is an attribute.
Refs #9800
Fix an AssertionError arising from properties that return partial functions.
Closes #9214
Fix a crash when a subclass extends __slots__.
Closes #9814
Fixed a false positive unreachable-code when using typing.Any as return type in python 3.8, the typing.NoReturn are not taken into account anymore for
Release date: 2024-06-28
Fixed a false positive unreachable-code when using typing.Any as return type in python
3.8, the typing.NoReturn are not taken into account anymore for python 3.8 however.
Closes #9751
Prevent emitting possibly-used-before-assignment when relying on names only potentially not defined in conditional blocks guarded by functions annotat
Release date: 2024-06-26
Prevent emitting possibly-used-before-assignment when relying on names
only potentially not defined in conditional blocks guarded by functions
annotated with typing.Never or typing.NoReturn.
Closes #9674
Fixed a crash when the lineno of a variable used as an annotation wasn't available for undefined-variable.
Closes #8866
Fixed a crash when the start value in an enumerate was non-constant and impossible to infer
(like inenumerate(apples, start=int(random_apple_index)) for unnecessary-list-index-lookup.
Closes #9078
Fixed a crash in symilar when the -d or -i short option were not properly recognized.
It's still impossible to do -d=1 (you must do -d 1).
Closes #9343
Classes with only an Ellipsis (...) in their body do not trigger 'multiple-statements' anymore if they are inlined (in accordance with black's 2024 st
Classes with only an Ellipsis (...) in their body do not trigger 'multiple-statements'
anymore if they are inlined (in accordance with black's 2024 style).
Closes #9398
Fix a false positive for redefined-outer-name when there is a name defined in an exception-handling block which shares the same name as a local variable that has been defined in a function body.
Closes #9671
Fix a false positive for use-yield-from when using the return value from the yield atom.
Closes #9696
Fix multiple false positives for generic class syntax added in Python 3.12 (PEP 695).
Release date: 2024-05-20
Fix multiple false positives for generic class syntax added in Python 3.12 (PEP 695).
Closes #9406
Exclude context manager without cleanup from
contextmanager-generator-missing-cleanup checks.
Closes #9625
Exclude if/else branches containing terminating functions (e.g. sys.exit()) from possibly-used-before-assignment checks.
Release date: 2024-05-18
Exclude if/else branches containing terminating functions (e.g. sys.exit())
from possibly-used-before-assignment checks.
Closes #9627
Don't emit typevar-name-incorrect-variance warnings for PEP 695 style TypeVars.
The variance is inferred automatically by the type checker.
Adding _co or _contra suffix can help to reason about TypeVar.
Refs #9638
Fix a false positive for possibly-used-before-assignment when using
typing.assert_never() (3.11+) to indicate exhaustiveness.
Closes #9643
Fix a false negative for --ignore-patterns when the directory to be linted is specified using a dot(.) and all files are ignored instead of only the files whose name begin with a dot.
Closes #9273
Restore "errors / warnings by module" section to report output (with -ry).
Closes #9145
trailing-comma-tuple should now be correctly emitted when it was disabled globally
but enabled via local message control, after removal of an over-optimisation.
Refs #9608
Add --prefer-stubs=yes option to opt-in to the astroid 3.2 feature
that prefers .pyi stubs over same-named .py files. This has the
potential to reduce no-member errors but at the cost of more errors
such as not-an-iterable from function bodies appearing as ....
Defaults to no.
Closes #9626 Closes #9623
Update astroid version to 3.2.1. This solves some reports of RecursionError
and also makes the prefer .pyi stubs feature in astroid 3.2.0 opt-in
with the aforementioned --prefer-stubs=y option.
Refs #9139
Of note: a github reporter, two new checks (possibly-used-before-assignment and contextmanager-generator-missing-cleanup), performance improvements, a
Release date: 2024-05-14
Of note: a github reporter, two new checks (possibly-used-before-assignment and contextmanager-generator-missing-cleanup), performance improvements, and an astroid upgrade providing support for @overload and .pyi stubs.
Understand six.PY2 and six.PY3 for conditional imports.
Closes #3501
A new github reporter has been added. This reporter returns the output of pylint in a format that
Github can use to automatically annotate code. Use it with pylint --output-format=github on your Github Workflows.
Closes #9443.
Add check possibly-used-before-assignment when relying on names after an if/else
switch when one branch failed to define the name, raise, or return.
Closes #1727
Checks for generators that use contextmanagers that don't handle cleanup properly.
Is meant to raise visibilty on the case that a generator is not fully exhausted and the contextmanager is not cleaned up properly.
A contextmanager must yield a non-constant value and not handle cleanup for GeneratorExit.
The using generator must attempt to use the yielded context value with x() as y and not just with x().
Closes #2832
If and Try nodes are now checked for useless return statements as well.
Closes #9449.
Fix false negative for property-with-parameters in the case of parameters which are positional-only, keyword-only, variadic positional or variadic keyword.
Closes #9584
pylint now understands the @overload decorator return values better.
Closes #4696 Refs #9606
Ignored modules are now not checked at all, instead of being checked and then ignored. This should speed up the analysis of large codebases which have ignored modules.
Closes #9442
ImportChecker's logic has been modified to avoid context files when possible. This makes it possible to cache module searches on astroid and reduce execution times.
Refs #9310.
An internal check for trailing-comma-tuple being enabled for a file or not is now
done once per file instead of once for each token.
Refs #9608.
Treat attrs.define and attrs.frozen as dataclass decorators in too-few-public-methods check.
Release date: 2024-05-13
Treat attrs.define and attrs.frozen as dataclass decorators in
too-few-public-methods check.
Closes #9345
Fix a false positive with singledispatchmethod-function when a method is decorated with both functools.singledispatchmethod and staticmethod.
Closes #9531
Fix a false positive for consider-using-dict-items when iterating using keys() and then deleting an item using the key as a lookup.
Closes #9554
Two new checks--use-yield-from, deprecated-attribute-- and a smattering of bug fixes.
Two new checks--use-yield-from, deprecated-attribute-- and a smattering of bug fixes.
Skip consider-using-join check for non-empty separators if an suggest-join-with-non-empty-separator option is set to no.
Closes #8701
Discover .pyi files when linting.
These can be ignored with the ignore-patterns setting.
Closes #9097
Check TypeAlias and TypeVar (PEP 695) nodes for invalid-name.
Refs #9196
Support for resolving external toml files named pylintrc.toml and .pylintrc.toml.
Closes #9228
Check for .clear, .discard, .pop and remove methods being called on a set while it is being iterated over.
Closes #9334
New message use-yield-from added to the refactoring checker. This message is emitted when yielding from a loop can be replaced by yield from.
Closes #9229.
Added a deprecated-attribute message to check deprecated attributes in the stdlib.
Closes #8855
Fixed false positive for inherit-non-class for generic Protocols.
Closes #9106
Exempt TypedDict from typing_extensions from too-many-ancestor checks.
Refs #9167
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.
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
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
Update astroid version to 3.1.0.
Refs #9457
used-before-assignment is no longer emitted when using a name in a loop and depending on an earlier name assignment in an except block paired with els
used-before-assignment is no longer emitted when using a name in a loop and
depending on an earlier name assignment in an except block paired with
else: 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 a finally block
when assignments took place in both the try block and each exception handler.
Closes #9451
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
Fixed false positive for unnecessary-lambda when the call has keyword arguments but not the lambda.
Release date: 2023-12-11
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 and unused-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
Fix a bug where pylint was unable to walk recursively through a directory if the
directory has an __init__.py file.
Closes #9210
Fix used-before-assignment false positive for generic type syntax (PEP 695, Python 3.12).
Fix used-before-assignment false positive for generic type syntax (PEP 695, Python 3.12).
Closes #9110
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
Fixed false positive for inherit-non-class for generic Protocols.
Fixed false positive for inherit-non-class for generic Protocols.
Closes #9106
Fix a crash when an enum class which is also decorated with a dataclasses.dataclass decorator is defined.
Closes #9100
…improvements, along with enacting necessary breaking changes and long-announced deprecations. The documentation of each message with an example is ver…
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
}
}
Enabling or disabling individual messages will now take effect even if an
--enable=all or disable=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 the except block.
Previously, they only happened to do so in the presence of an else clause.
Refs #7767
pyreverse now uses a new default color palette that is more colorblind friendly.
The color scheme is taken from Paul 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 the pylint.config.find_default_config_files generator instead.
Closes #8862
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 of
invalid-name), then simply add the option bad-names-rgxs="^..?$",
which will fail 1-2 character-long names. (Ensure you enable
disallowed-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 described
here <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 the
pull 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 renamed use-implicit-booleaness-not-comparison-to-zero and
compare-to-empty-string was renamed use-implicit-booleaness-not-comparison-to-string
and they now need to be enabled explicitly.
The pylint.extensions.emptystring and pylint.extensions.compare-to-zero extensions
no longer exist and need to be removed from the load-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 not Exception). 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
or master as configuration section in setup.cfg or tox.ini. It's bad practice
to not start a section title with the tool name. Please use pylint.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
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 the
evaluation 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) to pyreverse.
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
Added DataclassChecker module and invalid-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 message 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
Add new prefer-typing-namedtuple message to the CodeStyleChecker to suggest
rewriting calls to collections.namedtuple as classes inheriting from typing.NamedTuple
on Python 3.6+.
Requires load-plugins=pylint.extensions.code_style and enable=prefer-typing-namedtuple to be raised.
Closes #8660
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 an enum.Enum class has no assigned value.
Refs #7402
Fix unused-import false positive for usage of six.with_metaclass.
Closes #7506
Fix false negatives and false positives for too-many-try-statements,
too-complex, and too-many-branches by correctly counting statements
under a try.
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 default defining-attr-methods list to silence
attribute-defined-outside-init warning when using
unittest.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 in typealias names:
Good2Name, GoodName2._1BadName.Closes #8485
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 the dummy-variables-rgx option.
Closes #8500
Union typed variables without assignment are no longer treated as
TypeAlias.
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
Emit used-before-assignment when calling module-level functions before definition.
Closes #1144
Apply infer_kwarg_from_call() to more checks
These 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 for invalid-name errors.
Closes #8536
Fix false negative for no-value-for-parameter when a function, whose signature contains both a positional-only parameter name and also *kwargs, is called with a keyword-argument for name.
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 like dict.update().
Calls to list.sort() now raise assignment-from-no-return
rather than assignment-from-none for consistency.
Closes #8714 Closes #8810
consider-using-augmented-assign is now applied to dicts and lists as well.
Closes #8959
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 for no-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 the TYPE_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 for min() calls with default 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 tomlkit v0.11.8.
Closes #8632
Fix a line break error in Pyreverse dot output.
Closes #8671
Fix a false positive for method-hidden when using cached_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 with None 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
Pylint now exposes its type annotations.
Closes #5488 and #2079
Search for pyproject.toml recursively in parent directories up to a project or file system root.
Refs #7163, Closes #3289
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
get_message_definition was removed from the base checker API. You can access
message definitions through the MessageStore.
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 in pylint.interfaces were removed.
Checker should only inherit BaseChecker or any of the other checker types
from pylint.checkers. Reporter should only inherit BaseReporter.
Refs #8404
modname and msg_store are now required to be given in FileState.
collect_block_lines has also been removed. Pylinter.current_name
cannot be null anymore.
Refs #8407
Reporter.set_output was removed in favor of reporter.out = stream.
Refs #8408
A number of old utility functions and classes have been removed:
MapReduceMixin: To make a checker reduce map data simply implement
get_map_data and reduce_map_data.
is_inside_lambda: Use utils.get_node_first_ancestor_of_type(x, nodes.Lambda)
check_messages: Use utils.only_required_for_messages
is_class_subscriptable_pep585_with_postponed_evaluation_enabled: Use
is_postponed_evaluation_enabled(node) and is_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. Use discover_package_path
and pass source root(s).
fix_import_path: Use augmented_sys_path and pass additional sys.path
entries as an argument obtained from discover_package_path.
get_global_option: Use checker.linter.config to get all global options.
Related private objects have been removed as well.
Refs #8409
colorize_ansi now only accepts a MessageStyle 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 accepts ColorMappingDict.
Refs #8464
Following a deprecation period, MessageTest's end_line and end_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 the Run class (and of the _Run
class in testutils) were removed.
Refs #8472
Following a deprecation period, the py_version argument of the
MessageDefinition.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 and
is_node_in_guarded_import_block from pylint.utils were removed: use a combination of
is_sys_guard and in_type_checking_block instead.
Refs #8475
Following a deprecation period, the location argument of the
Message class must now be a MessageLocationTuple.
Refs #8477
Following a deprecation period, the check_single_file function of the
Pylinter is replaced by Pylinter.check_single_file_item.
Refs #8478
pylint runs (at least) ~5% faster after improvements to astroid
that make better use of the inference cache.
Refs pylint-dev/astroid#529
is_trailing_comma().class_is_abstract().Refs #1954
Exit immediately if all messages are disabled.
Closes #8715
3.0.0b0 is a beta release using the new astroid 3.0.0. Expect no more breaking changes before the official 3.0.0 release, and almost no changes from 3…
3.0.0b0 is a beta release using the new astroid 3.0.0. Expect no more breaking changes before the official 3.0.0 release, and almost no changes from 3.0.0a7. We're aiming for a release for when python 3.12 is officially out (in 2 days, 2023-10-02).
3.0.0a7 is an alpha release, other breaking changes will be added before the official 3.0.0 release. Compared to 3.0.0a6, this alpha brings mainly pyt…
3.0.0a7 is an alpha release, other breaking changes will be added before the official 3.0.0 release. Compared to 3.0.0a6, this alpha brings mainly python 3.12 compatibility but also the changes you would usually expect with a minor of regular size. It will requires some changes to the configuration that should be automated when 3.0.0 is out, but aren't yet. Those changes can make the configuration incompatible or at least not equivalent if used with pylint 2.x.
3.0.0a6 is an alpha release, other breaking changes will be added before the official 3.0.0 release. We're including the new features and false negati…
3.0.0a6 is an alpha release, other breaking changes will be added before the official 3.0.0 release. We're including the new features and false negative fixes that will be in 3.0.0, so it's the latest current version of pylint.
pyreverse now uses a new default color palette that is more colorblind
friendly.
The color scheme is taken from Paul Tol's Notes.
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 (Visualaization 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.
Refs #8462
epylint was removed. It now lives at: https://github.com/emacsorphanage/pylint.
Refs #7737
The 'overgeneral-exceptions' option now only takes fully qualified name
into account (builtins.Exception not Exception). 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
or master as configuration section in setup.cfg or tox.ini. It's
bad practice
to not start sections titles with the tool name. Please use pylint.main
instead.
Refs #8465
Add new option (--show-stdlib, -L) to pyreverse.
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
Adds asyncSetUp to the default defining-attr-methods list to silence
attribute-defined-outside-init warning when using
unittest.IsolatedAsyncioTestCase.
Refs #8403
invalid-name now allows for integers in typealias names:
Good2Name, GoodName2._1BadName.Closes #8485
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
--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 the TYPE_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
Pylint now exposes its type annotations.
Closes #5488 and #2079
All code related to the optparse config parsing has been removed.
Refs #8405
get_message_definition was removed from the base checker API. You can
access
message definitions through the MessageStore.
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 in pylint.interfaces were
removed.
Checker should only inherit BaseChecker or any of the other checker
types
from pylint.checkers. Reporter should only inherit BaseReporter.
Refs #8404
modname and msg_store are now required to be given in FileState.
collect_block_lines has also been removed. Pylinter.current_name
cannot be null anymore.
Refs #8407
'Reporter.set_output' was removed in favor of 'reporter.out = stream'.
Refs #8408
A number of old utility functions and classes have been removed:
MapReduceMixin: To make a checker reduce map data simply implement
get_map_data and reduce_map_data.
is_inside_lambda: Use utils.get_node_first_ancestor_of_type(x, nodes.Lambda)
check_messages: Use utils.only_required_for_messages
is_class_subscriptable_pep585_with_postponed_evaluation_enabled: Use
is_postponed_evaluation_enabled(node) and
is_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. Use
discover_package_path
and pass source root(s).
fix_import_path: Use augmented_sys_path and pass additional
sys.path
entries as an argument obtained from discover_package_path.
get_global_option: Use checker.linter.config to get all global
options.
Related private objects have been removed as well.
Refs #8409
colorize_ansi now only accept a MessageStyle object.
Refs #8412
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_blockis_node_in_typing_guarded_import_blockis_typing_guardis_sys_guard is still available, which was part of
is_node_in_guarded_import_block.
Refs #8433
Following a deprecation period, Pylinter.check now only work with
sequences of strings, not strings.
Refs #8463
Following a deprecation period, ColorizedTextReporter only accepts
ColorMappingDict.
Refs #8464
Following a deprecation period, MessageTest's end_line and
end_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 the Run class
(and of the _Run
class in testutils) were removed.
Refs #8472
Following a deprecation period, the py_version argument of the
MessageDefinition.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 and
is_node_in_guarded_import_block: from pylint.utils were removed: use
a combination of
is_sys_guard and in_type_checking_block instead.
Refs #8475
Following a deprecation period, the location argument of the
Message class must now be a MessageLocationTuple.
Refs #8477
Following a deprecation period, the check_single_file function of the
Pylinter is replaced by Pylinter.check_single_file_item.
Refs #8478
This is 2.14.0 with breaking changes for 3.0 included. Released only so that the old alpha 4 release based on pylint 2.9.0 is not proposed by tools in…
This is 2.14.0 with breaking changes for 3.0 included. Released only so that the old alpha 4 release based on pylint 2.9.0 is not proposed by tools instead of 2.14.0. 2.14.0 is the stable version you should use that.
This is 2.9.0 with the breaking changes of the future version 3.0.
This is 2.9.0 with the breaking changes of the future version 3.0.
Fix the score option not being honored when exporting to JSON
The default setting was to have a score, but it did not work. Now it will give a score at the end of the json:
Close #3504
Nothing published for this version
Nothing published for this version
Nothing published for this version
2.17.7 is the last release before we only support pylint 3.0.0 or superior and python 3.8 or superior.
2.17.7 is the last release before we only support pylint 3.0.0 or superior and python 3.8 or superior.
Fix a regression in pylint 2.17.6 / astroid 2.15.7 causing various
messages for code involving TypeVar.
Closes #9069
Fix crash in refactoring checker when unary operand used with variable in for loop.
Closes #9074
When parsing comma-separated lists of regular expressions in the config, ignore commas that are inside braces since those indicate quantifiers, not de
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 with None in Pyreverse diagrams.
Closes #9014
Fix a false positive for unused-variable when there is an import in a if TYPE_CHECKING: block and allow-global-unused-variables is set to no in the co
Release date: 2023-07-26
Fix a false positive for unused-variable when there is an import in a
if TYPE_CHECKING: block and allow-global-unused-variables is set to
no 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 the inconsistent-return-statements check.
Closes #8747
Exempt parents with only type annotations from the invalid-enum-extension
message.
Closes #8830
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
Fix a crash when a nonlocal is defined at module-level.
Closes #8735
Fix a false positive for bad-dunder-name when there is a user-defined __index__ method.
Fix a false positive for bad-dunder-name when there is a user-defined
__index__ method.
Closes #8613
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 tomlkit v0.11.8.
Closes #8632
Fix unused-argument false positive when __new__ does not use all the arguments of __init__.
Release date: 2023-04-24
Fix unused-argument false positive when __new__ does not use all the
arguments of __init__.
Closes #3670
Fix unused-import false positive for usage of six.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 the dummy-variables-rgx option.
Closes #8500
Union typed variables without assignment are no longer treated as
TypeAlias.
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
Improve output of consider-using-generator message for min()` calls with default`` keyword.
Closes #8563
invalid-name now allows for integers in typealias names:
invalid-name now allows for integers in typealias names:
Good2Name, GoodName2._1BadName.Closes #8485
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
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
The following utilities are deprecated in favor of the more robust in_type_checking_block and will be removed in pylint 3.0:
Adds asyncSetUp to the default defining-attr-methods list to silence
attribute-defined-outside-init warning when using
unittest.IsolatedAsyncioTestCase.
Refs #8403
--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
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_blockis_node_in_typing_guarded_import_blockis_typing_guardis_sys_guard is still available, which was part of
is_node_in_guarded_import_block.
Refs #8433
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, befor…
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.
Release date: 2023-03-08
pyreverse now supports custom color palettes with the --color-palette
option.
Closes #6738
Add invalid-name check for TypeAlias names.
Closes #7081
Accept values of the form <class name>.<attribute name> for the
exclude-protected list.
Closes #7343
Add --version option to pyreverse.
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
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 from enum.IntFlag assigns distinct integer values that share
common bit positions.
Refs #8102
Fix various false positives for functions that return directly from structural pattern matching cases.
Closes #5288
Fix false positive for used-before-assignment when
typing.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
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
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 a global
statement is declared.
Closes #8307
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
Fix false positive for isinstance-second-argument-not-valid-type with union types.
Fix false positive for isinstance-second-argument-not-valid-type with union types.
Closes #8205
Fix false positive for wrong-spelling-in-comment with class names in a python 2 type comment.
Fix false positive for wrong-spelling-in-comment with class names in a
python 2 type comment.
Closes #8370
Prevent emitting invalid-name for the line on which a global
statement is declared.
Closes #8307
Add --version option to pyreverse.
Add --version option to pyreverse.
Refs #7851
Fix false positive for used-before-assignment when
typing.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
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
Fix a crash happening for python interpreter < 3.9 following a failed typing update.
Fix a crash happening for python interpreter < 3.9 following a failed typing update.
Closes #8161
Fix deprecated-method false positive when alias for method is similar to name of deprecated method. Closes #5886
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 !
The accept-no-raise-doc option related to missing-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
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 the
useless-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
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.
Added singledispatchmethod-function which informs that
@singledispatchmethod should decorate class/instance methods and not
functions.
Closes #6917
Rename broad-except to broad-exception-caught and add new checker
broad-exception-raised
which will warn if general exceptions BaseException or Exception are
raised.
Closes #7494
Added nested-min-max which flags min(1, min(2, 3)) to simplify to
min(1, 2, 3).
Closes #7546
Extended use-dict-literal to also warn about call to dict() 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 like if, for, while, or
a comprehension.
Refs #7760
Add invalid-slice-step check to warn about a slice step value of 0
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 immediate if
statement to check for break condition as a first statement.
Closes #8015
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 the good-dunder-names option to allow specific dunder names.
Closes #3038
Added consider-using-augmented-assign check for CodeStyle extension
which flags x = x + 1 to simplify to x += 1.
This check is disabled by default. To use it, load the code style extension
with load-plugins=pylint.extensions.code_style and add
consider-using-augmented-assign in the enable 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 for typing plugin for duplicate
assign typehints.
Enable the plugin to enable the message with:
--load-plugins=pylint.extensions.typing.
Closes #7636
Fix false positive for unused-variable and unused-import when a name
is only used in a string literal type annotation.
Closes #3299
Document a known false positive for useless-suppression when disabling
line-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 an ImportFrom 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 for dataclass.
Closes #7290, closes #6550, closes #5857
Fix false positive for undefined-loop-variable in for-else loops that
use a function
having a return type annotation of NoReturn or Never.
Closes #7311
Fix used-before-assignment for functions/classes defined in type checking
guard.
Closes #7368
Fix false positive for unhashable-member when subclassing dict 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 when py-version >= 3.10.
Closes #7529
Fix used-before-assignment false positive when else branch calls
sys.exit or similar terminating functions.
Closes #7563
Fix a false positive for used-before-assignment for imports guarded by
typing.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 if
enumerate is called with start.
Closes #7682
Don't warn about stop-iteration-return when using next() over
itertools.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
from Enum.
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 by
if 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 by if 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 for typing_extension.TypeVar.
Refs #8089
Fix no-kwoa false positive for context managers.
Closes #8100
Fix a false positive for redefined-variable-type when async methods
are present.
Closes #8120
Code following a call to quit, exit, sys.exit or os._exit
will be marked as unreachable.
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 by
TYPE_CHECKING
Previously, this message was only emitted for imports guarded directly under
TYPE_CHECKING, not guarded two if-branches deep, nor when
TYPE_CHECKING
was imported from typing under an alias.
Closes #7539
Fix a false negative for unused-import when a constant inside
typing.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 when enumerate is
called with iterable as a kwarg.
Closes #7770
no-else-return or no-else-raise will be emitted if except block
always returns or raises.
Closes #7788
Fix dangerous-default-value false negative when * is used.
Closes #7818
consider-using-with now triggers for pathlib.Path.open.
Closes #7964
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 and missing-yields-doc now
respect
the no-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 from unnecessary-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 changing
sys.path before
it can be imported, this will now emit a bad-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 with for loops on
empty list.
Closes #7380
Update wording for arguments-differ and arguments-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 a lambda 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 than no-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 aliasing typing
e.g. as t and guarding imports under t.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 with max-version or min-version.
Closes #7569
Improve bad-thread-instantiation check to warn if target 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 using
enumerate with start and a class attribute.
Closes #7821
Fixes a crash in stop-iteration-return when the next 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 the pylint_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
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 the missing-param-doc message.
Refs #7398
Relevant DeprecationWarnings are now raised with stacklevel=2, so
they have the callsite attached in the message.
Closes #7463
Add a minimal option to pylint-config and its toml generator.
Closes #7485
Add method name to the error messages of no-method-argument and
no-self-argument.
Closes #7507
Prevent leaving the pip install cache in the Docker image. Refs #7544
Add a keyword-only compare_constants argument to safe_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 the enable 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
sys.path during execution of an init-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 #7264Your coding agent can read these notes before it upgrades. Set up the MCP server →