What's new in Pylint 4.0.6?
Release date: 2026-06-14
False Positives Fixed
-
implicit-str-concatis 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-rgxrejectedTypeVarnames containing digits, such as
Ec2T.Closes #8499
-
Fix a false positive for
too-many-argumentsin (non-static) methods and classmethods.Closes #8675
-
Fix a false positive for
no-memberwhen 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
matchdummy-variables-rgx(such as_), which is common for
pytest-bddstep 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 matchesdummy-variables-rgx.Closes #10665
-
Fix
undefined-variablefalse positive when a name used as ametaclass
argument in a nested class is referenced again later in the module.Closes #10823
-
Fix a false positive for
unused-variablewhere global variables matching
dummy-variables-rgxwere still reported as unused when
allow-global-unused-variableswas disabled.Closes #10890
-
Fix a false positive for
bad-dunder-namewhen there is a user-defined__suppress_context__attribute on exception subclasses.Closes #10960
-
Fix
used-before-assignmentfalse positive for names bound byfrom X import *in every branch of anif/elif/elsechain.Refs #10980
-
Check for metaclass call signature when evaluating arguments of a class call.
Closes #11032
-
Fix false positive
method-hiddenwhencached_propertyis imported directly withfrom functools import cached_property.Refs #11037
Other Bug Fixes
-
Fix the suggestion of
unnecessary-comprehensionfor 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 nowdict(d.keys())instead of the
incorrectdict(d), which would simply copyd.Closes #8256
-
Fix a crash in
consider-using-enumeratewhen theforloop 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-initon classes that inherit from a base class pylint cannot fully analyze.Closes #10892
-
Fix
add_messagesilently overwriting an explicitcol_offset=0(or any other zero-valuedline/end_lineno/end_col_offset) with the AST node's value. The internal_add_one_messagehelper used a falsey check (if not col_offset:) to detect an omitted argument, which incorrectly treated a legitimate0the same asNone. It now uses an identity check againstNone.Refs #11020
-
Fix a crash in the name checker when a non-constant value is passed as the
covariantorcontravariantargument of aTypeVar.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
NotImplementedis used as the test of anifstatement, which raised aTypeErrorin 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 aspylint-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 aSubscript(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-arganalysis when
infer_call_result()raisesInferenceErrorwhile 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 itsmetaclass=argument.Closes #11071
-
Allow digits in ParamSpec and TypeVarTuple names for
invalid-namecheck.The default
paramspec-rgxandtypevartuple-rgxpatterns rejected names
containing digits (e.g.Ec2P,S3Ts), emitting a falseinvalid-name
(C0103). Allow digits in the lowercase segments, consistent with the
typevarandtypealiaspatterns.Closes #11090
Performance Improvements
-
The duplicate-code checker no longer runs when its message (R0801) is disabled, even if
reports=yesis set. Previously, the checker's report (RP0801) would cause the expensive similarity computation to run regardless.Closes #3443