Update dependency pylint to v4 #14

Merged
BlazingNeutron merged 2 commits from renovate/pylint-4.x into main 2026-10-30 08:40:47 -04:00
Collaborator

This PR contains the following updates:

Package Update Change
pylint (changelog) major ==2.17.7 → ==4.1.3

Release Notes

pylint-dev/pylint (pylint)

v4.1.3

Compare Source

What's new in Pylint 4.1.3?

Release date: 2026-10-11

False Positives Fixed

  • Fixed a false positive for attribute-defined-outside-init when an
    attribute is assigned inside the setter of an old-style, non-decorator
    property(fget, fset) call. The decorator form (@property /
    @x.setter) was already exempted by the fix for #​409; the classic
    call form was not.

    Closes #​3325

  • Fix a false positive for used-before-assignment when a name bound by an earlier
    target of the same assignment is used by a later target, as in a = b[a] = 0.

    Closes #​5955

  • Fix a no-member false positive in a comprehension inside a branch that
    cannot run, such as if sys.platform == "win32": on Linux. Like the rest of
    the branch, the comprehension is no longer checked for missing members.

    Closes #​7240

  • Fix a false positive for used-before-assignment when a name bound by a tuple
    or list target of a with item is used by a later item of the same with statement.

    Closes #​7545

  • Fix false positives such as not-callable, not-an-iterable,
    unpacking-non-sequence and no-member on the result of a function whose
    body is only ..., like @overload and .pyi stubs. Such calls were
    inferred as returning None. This affected sqlalchemy.func,
    pydantic.Field, and the torch functions wrapped by _add_docstr,
    such as torch.linalg.qr.

    Closes #​8138
    Closes #​9218
    Closes #​9354
    Closes #​10087

  • Fix a false positive for protected-access when a subclass of a subscripted
    generic base, such as class Child(Parent[T]), accesses a protected member
    through that base, such as Parent._foo(self).

    Closes #​8600

  • Avoid emitting unreachable for a yield immediately after raise or
    sys.exit() that marks a function as a generator, matching the existing
    handling of return.

    Closes #​8909

  • Fix a false positive for super-init-not-called in .pyi stub files, where
    every __init__ body is ... and cannot call the parent's __init__.

    Closes #​9096

  • Fix a false positive for possibly-used-before-assignment when a lambda
    uses its parameters, including from a nested lambda, and that name is assigned
    later in the module.

    Closes #​9126

  • Fix a false positive for useless-parent-delegation when a keyword-only
    parameter is passed to the parent under the same keyword but with a different value.

    Closes #​9226

  • Fix a false positive for unused-argument in .pyi stub files, where
    function bodies are ... and cannot use their arguments.

    Closes #​9417

  • Fix a false positive for used-before-assignment when a name assigned with an
    assignment expression in the condition of a comprehension is used in its element,
    for example [y for x in data if (y := f(x))].

    Closes #​9460

  • Fixed false positive arguments-differ and signature-differs for
    typing.overload stubs. Overload stubs in a subclass are no longer compared
    to the overridden method, and an overridden method with overloads is compared
    through its implementation instead of its first stub.

    Closes #​10186
    Closes #​5264

  • Stop emitting redefined-variable-type when the bare _ variable is
    reused to discard values of different types.

    Closes #​10374

  • Allow the __main__ module name in the camelCase, PascalCase and
    UPPER_CASE naming styles without reporting invalid-name.

    Closes #​10442

  • Fixed a false positive for unexpected-keyword-arg when a decorator that
    returns its argument unchanged is stacked above a decorator accepting **kwargs.

    Closes #​10831

  • Fix invalid-name false positives for module-level all-caps aliases that
    preserve the name of an external callable.

    Closes #​11012

  • redefined-builtin no longer warns for method parameters that retain a
    built-in name from an overridden method.

    Closes #​11438

  • Fixed a false positive for useless-suppression of line-too-long when a # inside a string literal comes before the # pylint: disable=line-too-long comment.

    Closes #​11440

  • Fix a false positive for unnecessary-ellipsis when an ellipsis is the
    sole body statement of a Protocol method defined inside a conditional block
    such as if TYPE_CHECKING:.

    Closes #​11459

  • Fix a false positive for unnecessary-negation when negating a comparison
    between instances of a set or frozenset subclass.

    Refs #​11513

Other Bug Fixes

  • Fix pyreverse hanging or crashing with a RecursionError when
    --all-associated (-S) follows an attribute whose inferred class is rebuilt by
    astroid on every inference, such as a numpy array.

    Closes #​3602

  • Fix a crash in pyreverse when a diagram includes a class created by
    namedtuple, or an argparse.Namespace.

    Closes #​10767

  • The "difference" column of the "Messages by category" and "Duplication" reports
    (--reports=y) now shows the change since the previous run instead of repeating
    the previous count.

    Closes #​11520

  • Fixed nested-min-max suggesting a non-equivalent rewrite when an inner
    min/max call had multiple arguments.

    Refs #​11593

  • Using several output formats that all write to stdout (for example --output-format=colorized,no-header)
    now raises an error instead of printing every message more than once.

    Closes #​11597

  • Fixed an IndexError crash in the typecheck checker when an Enum class defines an __init__ method without arguments.

    Closes #​11608

  • Fix a crash in the duplicate-code checker when min-similarity-lines is set to 0.
    The checker is now disabled in that case, as documented.

    Closes #​11625

v4.1.2

Compare Source

What's new in Pylint 4.1.2?

Release date: 2026-10-03

False Positives Fixed

  • 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

Other Bug Fixes

  • 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

v4.1.1

Compare Source

What's new in Pylint 4.1.1?

Release date: 2026-09-29

Other Changes

  • 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

v4.0.10

Compare Source

What's new in Pylint 4.0.10?

Release date: 2026-09-29

False Positives Fixed

  • 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

Other Bug Fixes

  • 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

v4.0.9

Compare Source

What's new in Pylint 4.0.9?

Release date: 2026-09-23

Security Fixes

  • 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 no
    longer write a crafted pickle that will runs arbitrary code when pylint access its
    stat cache. The result cache is now stored as JSON instead of pickle,
    preventing code-execution. The workaround is upgrading or not pointing PYLINT_HOME
    to an untrusted, shared, or group-writable directory. The default value, ~/.cache/pylint,
    is writable only by the user running pylint. (CVE with the same information pending)

False Positives Fixed

  • 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

False Negatives Fixed

  • 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

Other Bug Fixes

  • 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.

    Closes #​11361
    Closes #​8079

v4.0.8

Compare Source

What's new in Pylint 4.0.8?

Release date: 2026-08-29

False Positives Fixed

  • 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

False Negatives Fixed

  • redundant-unittest-assert now also flags assertEqual and assertNotEqual
    when both compared values are constants, e.g. self.assertEqual(5, 5).

    Closes #​11321

Other Bug Fixes

  • 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

Other Changes

  • Upgrade the isort upper bound so isort 9 can be installed alongside pylint.

    Closes #​11351

v4.0.7

Compare Source

What's new in Pylint 4.0.7?

Release date: 2026-08-09

False Positives Fixed

  • 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

Other Bug Fixes

  • 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

v4.0.6

Compare Source

What's new in Pylint 4.0.6?

Release date: 2026-06-14

False Positives Fixed

  • 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

Other Bug Fixes

  • 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

Performance Improvements

  • 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

v4.0.5

Compare Source

What's new in Pylint 4.0.5?

Release date: 2026-02-20

False Positives Fixed

  • 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

Other Bug Fixes

  • Fix --known_third_party config being ignored.

    Closes #​10801

  • Fixed dynamic color mapping for "fail-on" messages when using multiple reporter/output formats.

    Closes #​10825

  • dependency on isort is now set to <9, permitting to use isort 8.

    Closes #​10857

v4.0.4

Compare Source

What's new in Pylint 4.0.4?

Release date: 2025-11-30

False Positives Fixed

  • Fixed false positive for invalid-name where module-level constants were incorrectly classified as variables when a class-level attribute with the same name exists.

    Closes #​10719

  • Fix a false positive for invalid-name on an UPPER_CASED name inside an if branch that assigns an object.

    Closes #​10745

v4.0.3

Compare Source

What's new in Pylint 4.0.3?

Release date: 2025-11-13

False Positives Fixed

  • 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

Other Bug Fixes

  • 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

v4.0.2

Compare Source

False Positives Fixed

  • 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

v4.0.1

Compare Source

What's new in Pylint 4.0.1?

Release date: 2025-10-14

False Positives Fixed

  • 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

v4.0.0

Compare Source

  • 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-object

The required astroid version is now 4.0.0. See the astroid changelog for additional fixes, features, and performance improvements applicable to pylint.

  • Handling of invalid-name at the module level was patchy. Now,
    module-level constants that are reassigned are treated as variables and checked
    against --variable-rgx rather than --const-rgx. Module-level lists,
    sets, and objects can pass against either regex.

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 warning

Lists, 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.

Breaking Changes

  • 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

New Features

  • 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.

    Closes #​9045
    Closes #​9267

  • 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

New Checks

  • 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.

    • :ref:invalid-match-args-definition is emitted if :py:data:object.__match_args__ isn't a tuple of strings.
    • :ref:too-many-positional-sub-patterns if there are more positional sub-patterns than specified in :py:data:object.__match_args__.
    • :ref: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.

    • :ref:match-class-bind-self is emitted if a name is bound to self instead of
      using an as pattern.
    • :ref:match-class-positional-attributes is emitted if a class pattern has positional
      attributes when keywords could be used.

    Refs #​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

False Positives Fixed

  • 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

False Negatives Fixed

  • 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

Other Bug Fixes

  • 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

Other Changes

  • 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

Internal Changes

  • Modified test framework to allow for different test output for different Python versions.

    Refs #​10382

v3.3.9

Compare Source

What's new in Pylint 3.3.9?

Release date: 2025-10-05

False Positives Fixed

  • 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

Other Bug Fixes

  • 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

v3.3.8

Compare Source

What's new in Pylint 3.3.8?

Release date: 2025-08-09

This patch release includes an exceptional fix for a false negative issue. For details, see: #​10482 (comment)

False Positives Fixed

  • 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

False Negatives Fixed

  • Fix false-negative for used-before-assignment with from __future__ import annotations in function definitions.

    Refs #​10482

Other Bug Fixes

  • 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

v3.3.7

Compare Source

What's new in Pylint 3.3.7?

Release date: 2025-05-04

False Positives Fixed

  • Comparisons between two calls to type() won't raise an unidiomatic-typecheck warning anymore, consistent with the behavior applied only for == previously.

    Closes #​10161

Other Bug Fixes

  • 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

Other Changes

  • 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

v3.3.6

Compare Source

What's new in Pylint 3.3.6?

Release date: 2025-03-20

False Positives Fixed

  • 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

v3.3.5

Compare Source

What's new in Pylint 3.3.5?

Release date: 2025-03-09

False Positives Fixed

  • 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

Other Bug Fixes

  • 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

Other Changes

  • Upload release assets to PyPI via Trusted Publishing.

    Closes #​10256

v3.3.4

Compare Source

Other Bug Fixes

  • 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

v3.3.3

Compare Source

What's new in Pylint 3.3.3?

Release date: 2024-12-23

False Positives Fixed

  • 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

Other Bug Fixes

  • Fix Unable to import 'collections.abc' (import-error) on Python 3.13.1.

    Closes #​10112

v3.3.2

Compare Source

False Positives Fixed

  • 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

Other Bug Fixes

  • 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

v3.3.1

Compare Source

What's new in Pylint 3.3.1?

Release date: 2024-09-24

False Positives Fixed

  • Fix regression causing some f-strings to not be inferred as strings.

    Closes #​9947

v3.3.0

Compare Source

Release date: 2024-09-20

Changes requiring user actions

  • 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

New Features

  • 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

New Checks

  • 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

False Negatives Fixed

  • 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

Other Bug Fixes

  • --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

Other Changes

  • 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

Internal Changes

  • 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

v3.2.7

Compare Source

What's new in Pylint 3.2.7?

Release date: 2024-08-31

False Positives Fixed

  • Fixed a false positive unreachable for NoReturn coroutine functions.

    Closes #​9840

Other Bug Fixes

  • 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

v3.2.6

Compare Source

What's new in Pylint 3.2.6?

Release date: 2024-07-21

False Positives Fixed

  • 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

Other Bug Fixes

  • Fix an AssertionError arising from properties that return partial functions.

    Closes #​9214

  • Fix a crash when a subclass extends __slots__.

    Closes #​9814

v3.2.5

Compare Source

What's new in Pylint 3.2.5 ?

Release date: 2024-06-28

Other Bug Fixes

  • 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

v3.2.4

Compare Source

What's new in Pylint 3.2.4?

Release date: 2024-06-26

False Positives Fixed

  • 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

Other Bug Fixes

  • 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

v3.2.3

Compare Source

False Positives Fixed

  • 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

v3.2.2

Compare Source

What's new in Pylint 3.2.2?

Release date: 2024-05-20

False Positives Fixed

  • 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

v3.2.1

Compare Source

What's new in Pylint 3.2.1?

Release date: 2024-05-18

False Positives Fixed

  • 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

Other Bug Fixes

  • 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

Internal Changes

  • 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

v3.2.0

Compare Source

What's new in Pylint 3.2.0?

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.

New Features

  • 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.

New Checks

  • 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

False Negatives Fixed

  • 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

False Positives Fixed

  • pylint now understands the @overload decorator return values better.

    Closes #​4696
    Refs #​9606

Performance Improvements

  • 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.

v3.1.1

Compare Source

What's new in Pylint 3.1.1?

Release date: 2024-05-13

False Positives Fixed

  • 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

v3.1.0

Compare Source

Two new checks--use-yield-from, deprecated-attribute-- and a smattering of bug fixes.

New Features

  • Skip consider-using-join check for non-empty separators if 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 Checks

  • 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

False Positives Fixed

  • Fixed false positive for inherit-non-class for generic Protocols.

    Closes #​9106

  • Exempt TypedDict from typing_extensions from too-many-ancestor checks.

    Refs #​9167

False Negatives Fixed

  • Extend broad-exception-raised and broad-exception-caught to except*.

    Closes #​8827

  • Fix a false-negative for unnecessary if blocks using a different than expected ordering of arguments.

    Closes #​8947.

Other Bug Fixes

  • Improve the message provided for wrong-import-order check. Instead of the import statement ("import x"), the message now specifies the import that is out of order and which imports should come after it. As reported in the issue, this is particularly helpful if there are multiple imports on a single line that do not follow the PEP8 convention.

    The message will report imports as follows:
    For "import X", it will report "(standard/third party/first party/local) import X"
    For "import X.Y" and "from X import Y", it will report "(standard/third party/first party/local) import X.Y"
    The import category is specified to provide explanation as to why pylint has issued the message and guidence to the developer on how to fix the problem.

    Closes #​8808

Other Changes

  • Print how many files were checked in verbose mode.

    Closes #​8935

  • Fix a crash when an enum class which is also decorated with a dataclasses.dataclass decorator is defined.

    Closes #​9100

Internal Changes

  • Update astroid version to 3.1.0.

    Refs #​9457

v3.0.4

Compare Source

False Positives Fixed

  • used-before-assignment is no longer emitted when using a name in a loop and
    depending on an earlier name assignment in 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

Other Bug Fixes

  • Catch incorrect ValueError "generator already executing" for Python 3.12.0 - 3.12.2.
    This is fixed upstream in Python 3.12.3.

    Closes #​9138

v3.0.3

Compare Source

What's new in Pylint 3.0.3?

Release date: 2023-12-11

False Positives Fixed

  • Fixed false positive for unnecessary-lambda when the call has keyword arguments but not the lambda.

    Closes #​9148

  • Fixed incorrect suggestion for shallow copy in unnecessary-comprehension

    Example of the suggestion:
    #pylint: disable=missing-module-docstring
    a = [1, 2, 3]
    b = [x for x in a]
    b[0] = 0
    print(a) # [1, 2, 3]

    After changing b = [x for x in a] to b = a based on the suggestion, the script now prints [0, 2, 3]. The correct suggestion should be use list(a) to preserve the original behavior.

    Closes #​9172

  • Fix false positives for undefined-variable 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

Other Bug Fixes

  • Fix a bug where pylint was unable to walk recursively through a directory if the
    directory has an __init__.py file.

    Closes #​9210

v3.0.2

Compare Source

False Positives Fixed

  • Fix used-before-assignment false positive for generic type syntax (PEP 695, Python 3.12).

    Closes #​9110

Other Bug Fixes

  • Escape special symbols and newlines in messages.

    Closes #​7874

  • Fixes suggestion for nested-min-max for expressions with additive operators, list and dict comprehensions.

    Closes #​8524

  • Fixes ignoring conditional imports with ignore-imports=y.

    Closes #​8914

  • Emit inconsistent-quotes for f-strings with 3.12 interpreter only if targeting pre-3.12 versions.

    Closes #​9113

v3.0.1

False Positives Fixed

  • Fixed false positive for inherit-non-class for generic Protocols.

    Closes #​9106

Other Changes

  • Fix a crash when an enum class which is also decorated with a dataclasses.dataclass decorator is defined.

    Closes #​9100

v3.0.0

Pylint now support python 3.12 officially.

This long anticipated major version also provides some important usability and performance improvements, along with enacting necessary breaking changes and long-announced deprecations. The documentation of each message with an example is very close too.

The required astroid version is now 3.0.0. See the astroid changelog for additional fixes, features, and performance improvements applicable to pylint.

Our code is now fully typed. The invalid-name message no longer checks for a minimum length of 3 characters by default. Dependencies like wrapt or setuptools were removed.

A new json2 reporter has been added. It features an enriched output that is easier to parse and provides more info, here's a sample output.

{
    "messages": [
        {
            "type": "convention",
            "symbol": "line-too-long",
            "message": "Line too long (1/2)",
            "messageId": "C0301",
            "confidence": "HIGH",
            "module": "0123",
            "obj": "",
            "line": 1,
            "column": 0,
            "endLine": 1,
            "endColumn": 4,
            "path": "0123",
            "absolutePath": "0123"
        }
    ],
    "statistics": {
        "messageTypeCount": {
            "fatal": 0,
            "error": 0,
            "warning": 0,
            "refactor": 0,
            "convention": 1,
            "info": 0
        },
        "modulesLinted": 1,
        "score": 5.0
    }
}

Breaking Changes

  • Enabling or disabling individual messages will now take effect even if an
    --enable=all 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

Changes requiring user actions

  • The invalid-name message no longer checks for a minimum length of 3 characters by default.
    (This was an unadvertised commingling of concerns between casing
    and name length, and users regularly reported this to be surprising.)

    If checking for a minimum length is still desired, it can be regained in two ways:

    • If you are content with a disallowed-name message (instead 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

New Features

  • A new json2 reporter has been added. It features a more enriched output that is
    easier to parse and provides more info.

    Compared to json the only changes are that messages are now under the "messages"
    key and that "message-id" now follows the camelCase convention and is renamed to
    "messageId".
    The new reporter also reports the "score" of the modules you linted as defined by 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

New Checks

  • 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

Extensions

  • 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

False Positives Fixed

  • Extend concept of "function ambiguity" in safe_infer() from
    differing number of function arguments to differing set of argument names.

    Solves false positives in tensorflow.

    Closes #​3613

  • Fix unused-argument false positive when __new__ does not use all the arguments of __init__.

    Closes #​3670

  • Fix a false positive for invalid-name when a type-annotated class variable in 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:

    • now valid: Good2Name, GoodName2.
    • still invalid: _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

False Negatives Fixed

  • 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

Other Bug Fixes

  • Support duplicate-code message when parallelizing with --jobs.

    Closes #​374

  • Support cyclic-import message when parallelizing with --jobs.

    Closes #​4171

  • --jobs can now be used with --load-plugins.

    This had regressed in astroid 2.5.0.

    Closes #​4874

  • docparams extension considers type comments as type documentation.

    Closes #​6287

  • When parsing comma-separated lists of regular expressions in the config, ignore
    commas that are inside braces since those indicate quantifiers, not delineation
    between expressions.

    Closes #​7229

  • The ignored-modules option will now be correctly taken into account 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

Other Changes

  • 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

Internal Changes

  • 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

Performance Improvements

  • pylint runs (at least) ~5% faster after improvements to astroid
    that make better use of the inference cache.

    Refs pylint-dev/astroid#529

    • Optimize is_trailing_comma().
    • Cache class_is_abstract().

    Refs #​1954

  • Exit immediately if all messages are disabled.

    Closes #​8715


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate CLI.

This PR contains the following updates: | Package | Update | Change | |---|---|---| | [pylint](https://github.com/pylint-dev/pylint) ([changelog](https://pylint.readthedocs.io/en/latest/whatsnew/4/)) | major | `==2.17.7` → `==4.1.3` | --- ### Release Notes <details> <summary>pylint-dev/pylint (pylint)</summary> ### [`v4.1.3`](https://github.com/pylint-dev/pylint/releases/tag/v4.1.3) [Compare Source](https://github.com/pylint-dev/pylint/compare/v4.1.2...v4.1.3) ## What's new in Pylint 4.1.3? Release date: 2026-10-11 ## False Positives Fixed - Fixed a false positive for `attribute-defined-outside-init` when an attribute is assigned inside the setter of an old-style, non-decorator `property(fget, fset)` call. The decorator form (`@property` / `@x.setter`) was already exempted by the fix for [#&#8203;409](https://github.com/pylint-dev/pylint/issues/409); the classic call form was not. Closes [#&#8203;3325](https://github.com/pylint-dev/pylint/issues/3325) - Fix a false positive for `used-before-assignment` when a name bound by an earlier target of the same assignment is used by a later target, as in `a = b[a] = 0`. Closes [#&#8203;5955](https://github.com/pylint-dev/pylint/issues/5955) - Fix a `no-member` false positive in a comprehension inside a branch that cannot run, such as `if sys.platform == "win32":` on Linux. Like the rest of the branch, the comprehension is no longer checked for missing members. Closes [#&#8203;7240](https://github.com/pylint-dev/pylint/issues/7240) - Fix a false positive for `used-before-assignment` when a name bound by a tuple or list target of a `with` item is used by a later item of the same `with` statement. Closes [#&#8203;7545](https://github.com/pylint-dev/pylint/issues/7545) - Fix false positives such as `not-callable`, `not-an-iterable`, `unpacking-non-sequence` and `no-member` on the result of a function whose body is only `...`, like `@overload` and `.pyi` stubs. Such calls were inferred as returning `None`. This affected `sqlalchemy.func`, `pydantic.Field`, and the `torch` functions wrapped by `_add_docstr`, such as `torch.linalg.qr`. Closes [#&#8203;8138](https://github.com/pylint-dev/pylint/issues/8138) Closes [#&#8203;9218](https://github.com/pylint-dev/pylint/issues/9218) Closes [#&#8203;9354](https://github.com/pylint-dev/pylint/issues/9354) Closes [#&#8203;10087](https://github.com/pylint-dev/pylint/issues/10087) - Fix a false positive for `protected-access` when a subclass of a subscripted generic base, such as `class Child(Parent[T])`, accesses a protected member through that base, such as `Parent._foo(self)`. Closes [#&#8203;8600](https://github.com/pylint-dev/pylint/issues/8600) - Avoid emitting `unreachable` for a `yield` immediately after `raise` or `sys.exit()` that marks a function as a generator, matching the existing handling of `return`. Closes [#&#8203;8909](https://github.com/pylint-dev/pylint/issues/8909) - Fix a false positive for `super-init-not-called` in `.pyi` stub files, where every `__init__` body is `...` and cannot call the parent's `__init__`. Closes [#&#8203;9096](https://github.com/pylint-dev/pylint/issues/9096) - Fix a false positive for `possibly-used-before-assignment` when a lambda uses its parameters, including from a nested lambda, and that name is assigned later in the module. Closes [#&#8203;9126](https://github.com/pylint-dev/pylint/issues/9126) - Fix a false positive for `useless-parent-delegation` when a keyword-only parameter is passed to the parent under the same keyword but with a different value. Closes [#&#8203;9226](https://github.com/pylint-dev/pylint/issues/9226) - Fix a false positive for `unused-argument` in `.pyi` stub files, where function bodies are `...` and cannot use their arguments. Closes [#&#8203;9417](https://github.com/pylint-dev/pylint/issues/9417) - Fix a false positive for `used-before-assignment` when a name assigned with an assignment expression in the condition of a comprehension is used in its element, for example `[y for x in data if (y := f(x))]`. Closes [#&#8203;9460](https://github.com/pylint-dev/pylint/issues/9460) - Fixed false positive `arguments-differ` and `signature-differs` for `typing.overload` stubs. Overload stubs in a subclass are no longer compared to the overridden method, and an overridden method with overloads is compared through its implementation instead of its first stub. Closes [#&#8203;10186](https://github.com/pylint-dev/pylint/issues/10186) Closes [#&#8203;5264](https://github.com/pylint-dev/pylint/issues/5264) - Stop emitting `redefined-variable-type` when the bare `_` variable is reused to discard values of different types. Closes [#&#8203;10374](https://github.com/pylint-dev/pylint/issues/10374) - Allow the `__main__` module name in the `camelCase`, `PascalCase` and `UPPER_CASE` naming styles without reporting `invalid-name`. Closes [#&#8203;10442](https://github.com/pylint-dev/pylint/issues/10442) - Fixed a false positive for `unexpected-keyword-arg` when a decorator that returns its argument unchanged is stacked above a decorator accepting `**kwargs`. Closes [#&#8203;10831](https://github.com/pylint-dev/pylint/issues/10831) - Fix `invalid-name` false positives for module-level all-caps aliases that preserve the name of an external callable. Closes [#&#8203;11012](https://github.com/pylint-dev/pylint/issues/11012) - `redefined-builtin` no longer warns for method parameters that retain a built-in name from an overridden method. Closes [#&#8203;11438](https://github.com/pylint-dev/pylint/issues/11438) - Fixed a false positive for `useless-suppression` of `line-too-long` when a `#` inside a string literal comes before the `# pylint: disable=line-too-long` comment. Closes [#&#8203;11440](https://github.com/pylint-dev/pylint/issues/11440) - Fix a false positive for `unnecessary-ellipsis` when an ellipsis is the sole body statement of a `Protocol` method defined inside a conditional block such as `if TYPE_CHECKING:`. Closes [#&#8203;11459](https://github.com/pylint-dev/pylint/issues/11459) - Fix a false positive for `unnecessary-negation` when negating a comparison between instances of a `set` or `frozenset` subclass. Refs [#&#8203;11513](https://github.com/pylint-dev/pylint/issues/11513) ## Other Bug Fixes - Fix `pyreverse` hanging or crashing with a `RecursionError` when `--all-associated` (`-S`) follows an attribute whose inferred class is rebuilt by astroid on every inference, such as a `numpy` array. Closes [#&#8203;3602](https://github.com/pylint-dev/pylint/issues/3602) - Fix a crash in `pyreverse` when a diagram includes a class created by `namedtuple`, or an `argparse.Namespace`. Closes [#&#8203;10767](https://github.com/pylint-dev/pylint/issues/10767) - The "difference" column of the "Messages by category" and "Duplication" reports (`--reports=y`) now shows the change since the previous run instead of repeating the previous count. Closes [#&#8203;11520](https://github.com/pylint-dev/pylint/issues/11520) - Fixed `nested-min-max` suggesting a non-equivalent rewrite when an inner `min`/`max` call had multiple arguments. Refs [#&#8203;11593](https://github.com/pylint-dev/pylint/issues/11593) - Using several output formats that all write to stdout (for example `--output-format=colorized,no-header`) now raises an error instead of printing every message more than once. Closes [#&#8203;11597](https://github.com/pylint-dev/pylint/issues/11597) - Fixed an `IndexError` crash in the typecheck checker when an `Enum` class defines an `__init__` method without arguments. Closes [#&#8203;11608](https://github.com/pylint-dev/pylint/issues/11608) - Fix a crash in the `duplicate-code` checker when `min-similarity-lines` is set to `0`. The checker is now disabled in that case, as documented. Closes [#&#8203;11625](https://github.com/pylint-dev/pylint/issues/11625) ### [`v4.1.2`](https://github.com/pylint-dev/pylint/releases/tag/v4.1.2) [Compare Source](https://github.com/pylint-dev/pylint/compare/v4.1.1...v4.1.2) ## What's new in Pylint 4.1.2? Release date: 2026-10-03 ## False Positives Fixed - 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 [#&#8203;2621](https://github.com/pylint-dev/pylint/issues/2621) ## Other Bug Fixes - Fixed a crash when calling `__bases__` on a class. Fixed by upgrading astroid to 4.3.3. Closes [#&#8203;11491](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11492](https://github.com/pylint-dev/pylint/issues/11492) - Fix a crash when a name bound by a `type` statement (a TypeVar) is used in a `with` statement. Closes [#&#8203;11510](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11511](https://github.com/pylint-dev/pylint/issues/11511) - Fix a crash in the `using-final-decorator-in-unsupported-version` check when `import final` is used. Closes [#&#8203;11521](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11530](https://github.com/pylint-dev/pylint/issues/11530) ### [`v4.1.1`](https://github.com/pylint-dev/pylint/releases/tag/v4.1.1) [Compare Source](https://github.com/pylint-dev/pylint/compare/v4.0.10...v4.1.1) ## What's new in Pylint 4.1.1? Release date: 2026-09-29 ## Other Changes - 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 [#&#8203;11495](https://github.com/pylint-dev/pylint/issues/11495) ### [`v4.0.10`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.10) [Compare Source](https://github.com/pylint-dev/pylint/compare/v4.0.9...v4.0.10) ## What's new in Pylint 4.0.10? Release date: 2026-09-29 ## False Positives Fixed - 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 [#&#8203;8192](https://github.com/pylint-dev/pylint/issues/8192) - Fix a false positive for `unused-argument` in dataclass `__new__` methods when the arguments are consumed by a generated `__init__` method. Closes [#&#8203;9843](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10029](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10460](https://github.com/pylint-dev/pylint/issues/10460) ## Other Bug Fixes - 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 [#&#8203;11472](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11479](https://github.com/pylint-dev/pylint/issues/11479) ### [`v4.0.9`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.9) [Compare Source](https://github.com/pylint-dev/pylint/compare/v4.0.8...v4.0.9) ## What's new in Pylint 4.0.9? Release date: 2026-09-23 ## Security Fixes - 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 no longer write a crafted pickle that will runs arbitrary code when pylint access its stat cache. The result cache is now stored as JSON instead of pickle, preventing code-execution. The workaround is upgrading or not pointing `PYLINT_HOME` to an untrusted, shared, or group-writable directory. The default value, `~/.cache/pylint`, is writable only by the user running pylint. (CVE with the same information pending) ## False Positives Fixed - 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 [#&#8203;3705](https://github.com/pylint-dev/pylint/issues/3705) - Fix a false positive for :ref:`not-callable` when calling functions constructed with `types.FunctionType` or `types.LambdaType`. Closes [#&#8203;7500](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9294](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9319](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11399](https://github.com/pylint-dev/pylint/issues/11399) ## False Negatives Fixed - `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 [#&#8203;11361](https://github.com/pylint-dev/pylint/issues/11361) ## Other Bug Fixes - 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 [#&#8203;3136](https://github.com/pylint-dev/pylint/issues/3136) - Fix a false positive for `declare-non-slot` when a class variable is annotated with `ClassVar` without an initial value. Closes [#&#8203;9950](https://github.com/pylint-dev/pylint/issues/9950) - Fix a crash in the `no-member` checker when attribute lookup raises an `InferenceError`. Closes [#&#8203;11356](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11357](https://github.com/pylint-dev/pylint/issues/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. Closes [#&#8203;11361](https://github.com/pylint-dev/pylint/issues/11361) Closes [#&#8203;8079](https://github.com/pylint-dev/pylint/issues/8079) ### [`v4.0.8`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.8) [Compare Source](https://github.com/pylint-dev/pylint/compare/v4.0.7...v4.0.8) ## What's new in Pylint 4.0.8? Release date: 2026-08-29 ## False Positives Fixed - Fix a false positive for :ref:`unspecified-encoding` when an `open` call uses a mode argument that cannot be inferred. Closes [#&#8203;10201](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10766](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11306](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11315](https://github.com/pylint-dev/pylint/issues/11315) ## False Negatives Fixed - `redundant-unittest-assert` now also flags `assertEqual` and `assertNotEqual` when both compared values are constants, e.g. `self.assertEqual(5, 5)`. Closes [#&#8203;11321](https://github.com/pylint-dev/pylint/issues/11321) ## Other Bug Fixes - 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 [#&#8203;11228](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11286](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11287](https://github.com/pylint-dev/pylint/issues/11287) ## Other Changes - Upgrade the `isort` upper bound so `isort` 9 can be installed alongside pylint. Closes [#&#8203;11351](https://github.com/pylint-dev/pylint/issues/11351) ### [`v4.0.7`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.7) [Compare Source](https://github.com/pylint-dev/pylint/compare/v4.0.6...v4.0.7) ## What's new in Pylint 4.0.7? Release date: 2026-08-09 ## False Positives Fixed - 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 [#&#8203;11231](https://github.com/pylint-dev/pylint/issues/11231) ## Other Bug Fixes - Fix a crash in the `bad-open-mode` check when the `mode` argument of `open` is the `NotImplemented` constant (Python >= 3.14). Closes [#&#8203;11099](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11102](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11130](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11134](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11136](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11146](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11147](https://github.com/pylint-dev/pylint/issues/11147) - Fix a false positive for :ref:`useless-parent-delegation` when an override changes the default value of a positional-only parameter. Closes [#&#8203;11148](https://github.com/pylint-dev/pylint/issues/11148) - Fixed a crash in `comparison-with-callable` when comparing a lambda assigned as a class attribute. Closes [#&#8203;11175](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11191](https://github.com/pylint-dev/pylint/issues/11191) - Fix a crash when a call unpacks a dictionary whose keys are not string constants, e.g. `copy.copy(**{-1: 1})`. Closes [#&#8203;11222](https://github.com/pylint-dev/pylint/issues/11222) ### [`v4.0.6`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.6) [Compare Source](https://github.com/pylint-dev/pylint/compare/v4.0.5...v4.0.6) ## What's new in Pylint 4.0.6? Release date: 2026-06-14 ## False Positives Fixed - `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 [#&#8203;6663](https://github.com/pylint-dev/pylint/issues/6663) - Fix a false positive for `invalid-name` (C0103) where the default `typevar-rgx` rejected `TypeVar` names containing digits, such as `Ec2T`. Closes [#&#8203;8499](https://github.com/pylint-dev/pylint/issues/8499) - Fix a false positive for `too-many-arguments` in (non-static) methods and classmethods. Closes [#&#8203;8675](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9833](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9894](https://github.com/pylint-dev/pylint/issues/9894) is reintroduced for functions whose name matches `dummy-variables-rgx`. Closes [#&#8203;10665](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10823](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10890](https://github.com/pylint-dev/pylint/issues/10890) - Fix a false positive for `bad-dunder-name` when there is a user-defined `__suppress_context__` attribute on exception subclasses. Closes [#&#8203;10960](https://github.com/pylint-dev/pylint/issues/10960) - Fix `used-before-assignment` false positive for names bound by `from X import *` in every branch of an `if`/`elif`/`else` chain. Refs [#&#8203;10980](https://github.com/pylint-dev/pylint/issues/10980) - Check for metaclass **call** signature when evaluating arguments of a class call. Closes [#&#8203;11032](https://github.com/pylint-dev/pylint/issues/11032) - Fix false positive `method-hidden` when `cached_property` is imported directly with `from functools import cached_property`. Refs [#&#8203;11037](https://github.com/pylint-dev/pylint/issues/11037) ## Other Bug Fixes - 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 [#&#8203;8256](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10099](https://github.com/pylint-dev/pylint/issues/10099) - Fix crash when checking `attribute-defined-outside-init` on classes that inherit from a base class pylint cannot fully analyze. Closes [#&#8203;10892](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11020](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11022](https://github.com/pylint-dev/pylint/issues/11022) - Fix a crash in the variable checker when a name resolves to a dataclass-synthesized `__init__`, which has no line number. Closes [#&#8203;11023](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11025](https://github.com/pylint-dev/pylint/issues/11025) - Avoided a crash from the implicit booleaness checker for `len()` calls without arguments. Closes [#&#8203;11028](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11031](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11056](https://github.com/pylint-dev/pylint/issues/11056) - Fix a crash in the deprecated checker when `__import__` is called with a non-string constant argument (for example `__import__(1)`). Closes [#&#8203;11059](https://github.com/pylint-dev/pylint/issues/11059) - Avoid crashing when enum member inference fails while checking enum subclasses. Closes [#&#8203;11069](https://github.com/pylint-dev/pylint/issues/11069) - Prevent a crash in `unexpected-keyword-arg` analysis when `infer_call_result()` raises `InferenceError` while inspecting decorator return signatures. Closes [#&#8203;11070](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11071](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;11090](https://github.com/pylint-dev/pylint/issues/11090) ## Performance Improvements - 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 [#&#8203;3443](https://github.com/pylint-dev/pylint/issues/3443) ### [`v4.0.5`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.5) [Compare Source](https://github.com/pylint-dev/pylint/compare/v4.0.4...v4.0.5) ## What's new in Pylint 4.0.5? Release date: 2026-02-20 ## False Positives Fixed - Fix possibly-used-before-assignment false positive when using self.fail() in tests. Closes [#&#8203;10743](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10752](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10790](https://github.com/pylint-dev/pylint/issues/10790) - Avoid emitting `unspecified-encoding` (W1514) when `py-version` is 3.15+. Refs [#&#8203;10791](https://github.com/pylint-dev/pylint/issues/10791) ## Other Bug Fixes - Fix `--known_third_party` config being ignored. Closes [#&#8203;10801](https://github.com/pylint-dev/pylint/issues/10801) - Fixed dynamic color mapping for "fail-on" messages when using multiple reporter/output formats. Closes [#&#8203;10825](https://github.com/pylint-dev/pylint/issues/10825) - dependency on isort is now set to <9, permitting to use isort 8. Closes [#&#8203;10857](https://github.com/pylint-dev/pylint/issues/10857) ### [`v4.0.4`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.4) [Compare Source](https://github.com/pylint-dev/pylint/compare/v4.0.3...v4.0.4) ## What's new in Pylint 4.0.4? Release date: 2025-11-30 ## False Positives Fixed - Fixed false positive for `invalid-name` where module-level constants were incorrectly classified as variables when a class-level attribute with the same name exists. Closes [#&#8203;10719](https://github.com/pylint-dev/pylint/issues/10719) - Fix a false positive for `invalid-name` on an UPPER_CASED name inside an `if` branch that assigns an object. Closes [#&#8203;10745](https://github.com/pylint-dev/pylint/issues/10745) ### [`v4.0.3`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.3) [Compare Source](https://github.com/pylint-dev/pylint/compare/v4.0.2...v4.0.3) ## What's new in Pylint 4.0.3? Release date: 2025-11-13 ## False Positives Fixed - 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 [#&#8203;10435](https://github.com/pylint-dev/pylint/issues/10435) - Fixed false positive for `invalid-name` with `typing.Annotated`. Closes [#&#8203;10696](https://github.com/pylint-dev/pylint/issues/10696) - Fix false positive for `f-string-without-interpolation` with template strings when using format spec. Closes [#&#8203;10702](https://github.com/pylint-dev/pylint/issues/10702) - Fix a false positive when an UPPER_CASED class attribute was raising an `invalid-name` when typed with `Final`. Closes [#&#8203;10711](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10721](https://github.com/pylint-dev/pylint/issues/10721) ## Other Bug Fixes - Make 'ignore' option work as expected again. Closes [#&#8203;10669](https://github.com/pylint-dev/pylint/issues/10669) - Fix crash for `consider-using-assignment-expr` when a variable annotation without assignment is used as the `if` test expression. Closes [#&#8203;10707](https://github.com/pylint-dev/pylint/issues/10707) - Fix crash for `prefer-typing-namedtuple` and `consider-math-not-float` when a `slice` object is called. Closes [#&#8203;10708](https://github.com/pylint-dev/pylint/issues/10708) ### [`v4.0.2`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.2) [Compare Source](https://github.com/pylint-dev/pylint/compare/v4.0.1...v4.0.2) ## False Positives Fixed - Fix false positive for `invalid-name` on a partially uninferable module-level constant. Closes [#&#8203;10652](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10664](https://github.com/pylint-dev/pylint/issues/10664) - Fix false positive for `invalid-name` for `TypedDict` instances. Closes [#&#8203;10672](https://github.com/pylint-dev/pylint/issues/10672) ### [`v4.0.1`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.1) [Compare Source](https://github.com/pylint-dev/pylint/compare/v4.0.0...v4.0.1) ## What's new in Pylint 4.0.1? Release date: 2025-10-14 ## False Positives Fixed - Exclude `__all__` and `__future__.annotations` from `unused-variable`. Closes [#&#8203;10019](https://github.com/pylint-dev/pylint/issues/10019) - Fix false-positive for `bare-name-capture-pattern` if a case guard is used. Closes [#&#8203;10647](https://github.com/pylint-dev/pylint/issues/10647) - Check enums created with the `Enum()` functional syntax to pass against the `--class-rgx` for the `invalid-name` check, like other enums. Closes [#&#8203;10660](https://github.com/pylint-dev/pylint/issues/10660) ### [`v4.0.0`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.0) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.9...v4.0.0) - Pylint now supports Python 3.14. - Pylint's inference engine (`astroid`) is now much more precise, understanding implicit booleanness and ternary expressions. (Thanks [@&#8203;zenlyj](https://github.com/zenlyj)!) Consider this example: ```python 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-object ``` The required `astroid` version is now 4.0.0. See the [astroid changelog](https://pylint.readthedocs.io/projects/astroid/en/latest/changelog.html#what-s-new-in-astroid-4-0-0) for additional fixes, features, and performance improvements applicable to pylint. - Handling of `invalid-name` at the module level was patchy. Now, module-level constants that are reassigned are treated as variables and checked against `--variable-rgx` rather than `--const-rgx`. Module-level lists, sets, and objects can pass against either regex. Here, `LIMIT` is reassigned, so pylint only uses `--variable-rgx`: ```python 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: ```python if sometimes: LIMIT = 1 else: LIMIT = 500 # exclusive assignment: uses const regex, no warning ``` Lists, sets, and objects still pass against either `const-rgx` or `variable-rgx` even if reassigned, but are no longer completely skipped: ```python MY_LIST = [] my_list = [] My_List = [] # [invalid-name] ``` Remember to adjust the [regexes](https://pylint.readthedocs.io/en/latest/user_guide/messages/convention/invalid-name.html) and [allow lists](https://pylint.readthedocs.io/en/latest/user_guide/configuration/all-options.html#good-names) to your liking. ## Breaking Changes - `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 [#&#8203;3585](https://github.com/pylint-dev/pylint/issues/3585) - The unused `pylintrc` argument to `PyLinter.__init__()` is deprecated and will be removed. Refs [#&#8203;6052](https://github.com/pylint-dev/pylint/issues/6052) - Commented out code blocks such as `# bar() # TODO: remove dead code` will no longer emit `fixme`. Refs [#&#8203;9255](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9689](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9962](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10071](https://github.com/pylint-dev/pylint/issues/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](https://peps.python.org/pep-0765/). Refs [#&#8203;10480](https://github.com/pylint-dev/pylint/issues/10480) - Removed support for `nmp.NaN` alias for `numpy.NaN` being recognized in ':ref:`nan-comparison`'. Use `np` or `numpy` instead. Refs [#&#8203;10583](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10637](https://github.com/pylint-dev/pylint/issues/10637) ## New Features - `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 [#&#8203;8736](https://github.com/pylint-dev/pylint/issues/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. Closes [#&#8203;9045](https://github.com/pylint-dev/pylint/issues/9045) Closes [#&#8203;9267](https://github.com/pylint-dev/pylint/issues/9267) - 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 [#&#8203;9255](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9353](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9357](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9898](https://github.com/pylint-dev/pylint/issues/9898) - Enhanced support for [@&#8203;property](https://github.com/property) decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams. Closes [#&#8203;10057](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10077](https://github.com/pylint-dev/pylint/issues/10077) - Handle deferred evaluation of annotations in Python 3.14. Closes [#&#8203;10149](https://github.com/pylint-dev/pylint/issues/10149) - Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator). Closes [#&#8203;10236](https://github.com/pylint-dev/pylint/issues/10236) - `pyreverse`: add support for colorized output when using output format `mmd` (MermaidJS) and `html`. Closes [#&#8203;10242](https://github.com/pylint-dev/pylint/issues/10242) - pypy 3.11 is now officially supported. Refs [#&#8203;10287](https://github.com/pylint-dev/pylint/issues/10287) - Add support for Python 3.14. Refs [#&#8203;10467](https://github.com/pylint-dev/pylint/issues/10467) - Add naming styles for `ParamSpec` and `TypeVarTuple` that align with the `TypeVar` style. Refs [#&#8203;10541](https://github.com/pylint-dev/pylint/issues/10541) ## New Checks - 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 [#&#8203;7128](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10408](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10480](https://github.com/pylint-dev/pylint/issues/10480) - Add new checks for invalid uses of class patterns in :keyword:`match`. - :ref:`invalid-match-args-definition` is emitted if :py:data:`object.__match_args__` isn't a tuple of strings. - :ref:`too-many-positional-sub-patterns` if there are more positional sub-patterns than specified in :py:data:`object.__match_args__`. - :ref:`multiple-class-sub-patterns` if there are multiple sub-patterns for the same attribute. Refs [#&#8203;10559](https://github.com/pylint-dev/pylint/issues/10559) - Add additional checks for suboptimal uses of class patterns in :keyword:`match`. - :ref:`match-class-bind-self` is emitted if a name is bound to `self` instead of using an `as` pattern. - :ref:`match-class-positional-attributes` is emitted if a class pattern has positional attributes when keywords could be used. Refs [#&#8203;10587](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10621](https://github.com/pylint-dev/pylint/issues/10621) ## False Positives Fixed - 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 [#&#8203;10061](https://github.com/pylint-dev/pylint/issues/10061) - Fix :ref:`no-name-in-module` for members of `concurrent.futures` with Python 3.14. Closes [#&#8203;10632](https://github.com/pylint-dev/pylint/issues/10632) ## False Negatives Fixed - Fix false negative for `used-before-assignment` when a `TYPE_CHECKING` import is used as a type annotation prior to erroneous usage. Refs [#&#8203;8893](https://github.com/pylint-dev/pylint/issues/8893) - Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly. Refs [#&#8203;9667](https://github.com/pylint-dev/pylint/issues/9667) - Check module-level constants with type annotations for `invalid-name`. Remember to adjust `const-naming-style` or `const-rgx` to your liking. Closes [#&#8203;9770](https://github.com/pylint-dev/pylint/issues/9770) - Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore. Closes [#&#8203;9894](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9999](https://github.com/pylint-dev/pylint/issues/9999) - Fix false negative for `used-before-assignment` when a function is defined inside a `TYPE_CHECKING` guard block and used later. Closes [#&#8203;10028](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10421](https://github.com/pylint-dev/pylint/issues/10421) - Fix false negative for `deprecated-module` when a `__import__` method is used instead of `import` sentence. Refs [#&#8203;10453](https://github.com/pylint-dev/pylint/issues/10453) - Count match cases for `too-many-branches` check. Refs [#&#8203;10542](https://github.com/pylint-dev/pylint/issues/10542) - Fix false-negative where :ref:`unused-import` was not reported for names referenced in a preceding `global` statement. Refs [#&#8203;10633](https://github.com/pylint-dev/pylint/issues/10633) ## Other Bug Fixes - 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 [#&#8203;8736](https://github.com/pylint-dev/pylint/issues/8736) - Fixed unidiomatic-typecheck only checking left-hand side. Closes [#&#8203;10217](https://github.com/pylint-dev/pylint/issues/10217) - Fix a crash caused by malformed format strings when using `.format` with keyword arguments. Closes [#&#8203;10282](https://github.com/pylint-dev/pylint/issues/10282) - Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions. Closes [#&#8203;10508](https://github.com/pylint-dev/pylint/issues/10508) - Fix a crash in :ref:`nested-min-max` when using `builtins.min` or `builtins.max` instead of `min` or `max` directly. Closes [#&#8203;10626](https://github.com/pylint-dev/pylint/issues/10626) - Fixed a crash in :ref:`unnecessary-dict-index-lookup` when the index of an enumerated list was deleted inside a for loop. Closes [#&#8203;10627](https://github.com/pylint-dev/pylint/issues/10627) ## Other Changes - 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 [#&#8203;10405](https://github.com/pylint-dev/pylint/issues/10405) ## Internal Changes - Modified test framework to allow for different test output for different Python versions. Refs [#&#8203;10382](https://github.com/pylint-dev/pylint/issues/10382) ### [`v3.3.9`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.9) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.8...v3.3.9) ## What's new in Pylint 3.3.9? Release date: 2025-10-05 ## False Positives Fixed - Fix used-before-assignment for PEP 695 type aliases and parameters. Closes [#&#8203;9815](https://github.com/pylint-dev/pylint/issues/9815) - No longer flag undeprecated functions in `importlib.resources` as deprecated. Closes [#&#8203;10593](https://github.com/pylint-dev/pylint/issues/10593) - Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions. Closes [#&#8203;10508](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10562](https://github.com/pylint-dev/pylint/issues/10562) ## Other Bug Fixes - 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 [#&#8203;10510](https://github.com/pylint-dev/pylint/issues/10510) ### [`v3.3.8`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.8) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.7...v3.3.8) ## What's new in Pylint 3.3.8? Release date: 2025-08-09 This patch release includes an exceptional fix for a false negative issue. For details, see: [#&#8203;10482 (comment)](https://github.com/pylint-dev/pylint/pull/10482#issuecomment-3164514082) ## False Positives Fixed - Fix false positives for `possibly-used-before-assignment` when variables are exhaustively assigned within a `match` block. Closes [#&#8203;9668](https://github.com/pylint-dev/pylint/issues/9668) - Fix false positive for `missing-raises-doc` and `missing-yield-doc` when the method length is less than docstring-min-length. Refs [#&#8203;10104](https://github.com/pylint-dev/pylint/issues/10104) - Fix a false positive for `unused-variable` when multiple except handlers bind the same name under a try block. Closes [#&#8203;10426](https://github.com/pylint-dev/pylint/issues/10426) ## False Negatives Fixed - Fix false-negative for `used-before-assignment` with `from __future__ import annotations` in function definitions. Refs [#&#8203;10482](https://github.com/pylint-dev/pylint/issues/10482) ## Other Bug Fixes - 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 [#&#8203;10373](https://github.com/pylint-dev/pylint/issues/10373) - Fix double underscores erroneously rendering as bold in pyreverse's Mermaid output. Closes [#&#8203;10402](https://github.com/pylint-dev/pylint/issues/10402) ### [`v3.3.7`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.7) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.6...v3.3.7) ## What's new in Pylint 3.3.7? Release date: 2025-05-04 ## False Positives Fixed - Comparisons between two calls to `type()` won't raise an `unidiomatic-typecheck` warning anymore, consistent with the behavior applied only for `==` previously. Closes [#&#8203;10161](https://github.com/pylint-dev/pylint/issues/10161) ## Other Bug Fixes - 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 [#&#8203;10105](https://github.com/pylint-dev/pylint/issues/10105) - Fix a crash caused by malformed format strings when using `.format` with keyword arguments. Closes [#&#8203;10282](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10334](https://github.com/pylint-dev/pylint/issues/10334) ## Other Changes - 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 [#&#8203;10277](https://github.com/pylint-dev/pylint/issues/10277) ### [`v3.3.6`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.6) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.5...v3.3.6) ## What's new in Pylint 3.3.6? Release date: 2025-03-20 ## False Positives Fixed - Fix a false positive for `used-before-assignment` when an inner function's return type annotation is a class defined at module scope. Closes [#&#8203;9391](https://github.com/pylint-dev/pylint/issues/9391) ### [`v3.3.5`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.5) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.4...v3.3.5) ## What's new in Pylint 3.3.5? Release date: 2025-03-09 ## False Positives Fixed - 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 [#&#8203;10065](https://github.com/pylint-dev/pylint/issues/10065) - Fix a false positive for `invalid-getnewargs-ex-returned` when the tuple or dict has been assigned to a name. Closes [#&#8203;10208](https://github.com/pylint-dev/pylint/issues/10208) - Remove `getopt` and `optparse` from the list of deprecated modules. Closes [#&#8203;10211](https://github.com/pylint-dev/pylint/issues/10211) ## Other Bug Fixes - Fixed conditional import x.y causing false positive possibly-used-before-assignment. Closes [#&#8203;10081](https://github.com/pylint-dev/pylint/issues/10081) - Fix a crash when something besides a class is found in an except handler. Closes [#&#8203;10106](https://github.com/pylint-dev/pylint/issues/10106) - Fixed raising invalid-name when using camelCase for private methods with two leading underscores. Closes [#&#8203;10189](https://github.com/pylint-dev/pylint/issues/10189) ## Other Changes - Upload release assets to PyPI via Trusted Publishing. Closes [#&#8203;10256](https://github.com/pylint-dev/pylint/issues/10256) ### [`v3.3.4`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.4) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.3...v3.3.4) ## Other Bug Fixes - Fixes "skipped files" count calculation; the previous method was displaying an arbitrary number. Closes [#&#8203;10073](https://github.com/pylint-dev/pylint/issues/10073) - Fixes a crash that occurred when pylint was run in a container on a host with cgroupsv2 and restrictions on CPU usage. Closes [#&#8203;10103](https://github.com/pylint-dev/pylint/issues/10103) - Relaxed the requirements for isort so pylint can benefit from isort 6. Closes [#&#8203;10203](https://github.com/pylint-dev/pylint/issues/10203) ### [`v3.3.3`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.3) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.2...v3.3.3) ## What's new in Pylint 3.3.3? Release date: 2024-12-23 ## False Positives Fixed - Fix false positives for `undefined-variable` for classes using Python 3.12 generic type syntax. Closes [#&#8203;9335](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;10100](https://github.com/pylint-dev/pylint/issues/10100) ## Other Bug Fixes - Fix `Unable to import 'collections.abc' (import-error)` on Python 3.13.1. Closes [#&#8203;10112](https://github.com/pylint-dev/pylint/issues/10112) ### [`v3.3.2`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.2) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.1...v3.3.2) ## False Positives Fixed - Fix a false positive for `potential-index-error` when an indexed iterable contains a starred element that evaluates to more than one item. Closes [#&#8203;10076](https://github.com/pylint-dev/pylint/issues/10076) ## Other Bug Fixes - 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 [#&#8203;10026](https://github.com/pylint-dev/pylint/issues/10026) ### [`v3.3.1`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.1) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.3.0...v3.3.1) ## What's new in Pylint 3.3.1? Release date: 2024-09-24 ## False Positives Fixed - Fix regression causing some f-strings to not be inferred as strings. Closes [#&#8203;9947](https://github.com/pylint-dev/pylint/issues/9947) ### [`v3.3.0`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.0) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.7...v3.3.0) Release date: 2024-09-20 ## Changes requiring user actions - 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 [#&#8203;9731](https://github.com/pylint-dev/pylint/issues/9731) ## New Features - 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 [#&#8203;9499](https://github.com/pylint-dev/pylint/issues/9499) ## New Checks - 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 [#&#8203;9099](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9791](https://github.com/pylint-dev/pylint/issues/9791) - Add `using-assignment-expression-in-unsupported-version` for uses of `:=` (walrus operator) on Python versions below 3.8 provided with `--py-version`. Closes [#&#8203;9820](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9823](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9938](https://github.com/pylint-dev/pylint/issues/9938) ## False Negatives Fixed - 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 [#&#8203;7565](https://github.com/pylint-dev/pylint/issues/7565). - Fix a false negative for `await-outside-async` when await is inside Lambda. Refs [#&#8203;9653](https://github.com/pylint-dev/pylint/issues/9653) - Fix a false negative for `duplicate-argument-name` by including `positional-only`, `*args` and `**kwargs` arguments in the check. Closes [#&#8203;9669](https://github.com/pylint-dev/pylint/issues/9669) - Fix false negative for `multiple-statements` when multiple statements are present on `else` and `finally` lines of `try`. Refs [#&#8203;9759](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9847](https://github.com/pylint-dev/pylint/issues/9847) ## Other Bug Fixes - `--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 [#&#8203;9403](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9680](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9727](https://github.com/pylint-dev/pylint/issues/9727) - Improve file discovery for directories that are not python packages. Closes [#&#8203;9764](https://github.com/pylint-dev/pylint/issues/9764) ## Other Changes - 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 [#&#8203;9774](https://github.com/pylint-dev/pylint/issues/9774) - Add support for Python 3.13. Refs [#&#8203;9852](https://github.com/pylint-dev/pylint/issues/9852) ## Internal Changes - 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 [#&#8203;9734](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9925](https://github.com/pylint-dev/pylint/issues/9925) ### [`v3.2.7`](https://github.com/pylint-dev/pylint/releases/tag/v3.2.7) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.6...v3.2.7) ## What's new in Pylint 3.2.7? Release date: 2024-08-31 ## False Positives Fixed - Fixed a false positive `unreachable` for `NoReturn` coroutine functions. Closes [#&#8203;9840](https://github.com/pylint-dev/pylint/issues/9840) ## Other Bug Fixes - Fix crash in refactoring checker when calling a lambda bound as a method. Closes [#&#8203;9865](https://github.com/pylint-dev/pylint/issues/9865) - Fix a crash in `undefined-loop-variable` when providing the `iterable` argument to `enumerate()`. Closes [#&#8203;9875](https://github.com/pylint-dev/pylint/issues/9875) - Fix to address indeterminacy of error message in case a module name is same as another in a separate namespace. Refs [#&#8203;9883](https://github.com/pylint-dev/pylint/issues/9883) ### [`v3.2.6`](https://github.com/pylint-dev/pylint/releases/tag/v3.2.6) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.5...v3.2.6) ## What's new in Pylint 3.2.6? Release date: 2024-07-21 ## False Positives Fixed - Quiet false positives for `unexpected-keyword-arg` when pylint cannot determine which of two or more dynamically defined classes is being instantiated. Closes [#&#8203;9672](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9739](https://github.com/pylint-dev/pylint/issues/9739) - Fix a regression that raised `invalid-name` on class attributes merely overriding invalid names from an ancestor. Closes [#&#8203;9765](https://github.com/pylint-dev/pylint/issues/9765) - Treat `assert_never()` the same way when imported from `typing_extensions`. Closes [#&#8203;9780](https://github.com/pylint-dev/pylint/issues/9780) - Fix a false positive for `consider-using-min-max-builtin` when the assignment target is an attribute. Refs [#&#8203;9800](https://github.com/pylint-dev/pylint/issues/9800) ## Other Bug Fixes - Fix an `AssertionError` arising from properties that return partial functions. Closes [#&#8203;9214](https://github.com/pylint-dev/pylint/issues/9214) - Fix a crash when a subclass extends `__slots__`. Closes [#&#8203;9814](https://github.com/pylint-dev/pylint/issues/9814) ### [`v3.2.5`](https://github.com/pylint-dev/pylint/releases/tag/v3.2.5) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.4...v3.2.5) ## What's new in Pylint 3.2.5 ? Release date: 2024-06-28 ## Other Bug Fixes - 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 [#&#8203;9751](https://github.com/pylint-dev/pylint/issues/9751) ### [`v3.2.4`](https://github.com/pylint-dev/pylint/releases/tag/v3.2.4) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.3...v3.2.4) ## What's new in Pylint 3.2.4? Release date: 2024-06-26 ## False Positives Fixed - 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 [#&#8203;9674](https://github.com/pylint-dev/pylint/issues/9674) ## Other Bug Fixes - Fixed a crash when the lineno of a variable used as an annotation wasn't available for `undefined-variable`. Closes [#&#8203;8866](https://github.com/pylint-dev/pylint/issues/8866) - Fixed a crash when the `start` value in an `enumerate` was non-constant and impossible to infer (like in`enumerate(apples, start=int(random_apple_index)`) for `unnecessary-list-index-lookup`. Closes [#&#8203;9078](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9343](https://github.com/pylint-dev/pylint/issues/9343) ### [`v3.2.3`](https://github.com/pylint-dev/pylint/releases/tag/v3.2.3) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.2...v3.2.3) ## False Positives Fixed - 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 [#&#8203;9398](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9671](https://github.com/pylint-dev/pylint/issues/9671) - Fix a false positive for `use-yield-from` when using the return value from the `yield` atom. Closes [#&#8203;9696](https://github.com/pylint-dev/pylint/issues/9696) ### [`v3.2.2`](https://github.com/pylint-dev/pylint/releases/tag/v3.2.2) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.1...v3.2.2) ## What's new in Pylint 3.2.2? Release date: 2024-05-20 ## False Positives Fixed - Fix multiple false positives for generic class syntax added in Python 3.12 (PEP 695). Closes [#&#8203;9406](https://github.com/pylint-dev/pylint/issues/9406) - Exclude context manager without cleanup from `contextmanager-generator-missing-cleanup` checks. Closes [#&#8203;9625](https://github.com/pylint-dev/pylint/issues/9625) ### [`v3.2.1`](https://github.com/pylint-dev/pylint/releases/tag/v3.2.1) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.2.0...v3.2.1) ## What's new in Pylint 3.2.1? Release date: 2024-05-18 ## False Positives Fixed - Exclude if/else branches containing terminating functions (e.g. `sys.exit()`) from `possibly-used-before-assignment` checks. Closes [#&#8203;9627](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9638](https://github.com/pylint-dev/pylint/issues/9638) - Fix a false positive for `possibly-used-before-assignment` when using `typing.assert_never()` (3.11+) to indicate exhaustiveness. Closes [#&#8203;9643](https://github.com/pylint-dev/pylint/issues/9643) ## Other Bug Fixes - 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 [#&#8203;9273](https://github.com/pylint-dev/pylint/issues/9273) - Restore "errors / warnings by module" section to report output (with `-ry`). Closes [#&#8203;9145](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9608](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9626](https://github.com/pylint-dev/pylint/issues/9626) Closes [#&#8203;9623](https://github.com/pylint-dev/pylint/issues/9623) ## Internal Changes - 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 [#&#8203;9139](https://github.com/pylint-dev/pylint/issues/9139) ### [`v3.2.0`](https://github.com/pylint-dev/pylint/releases/tag/v3.2.0) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.1.1...v3.2.0) ## What's new in Pylint 3.2.0? 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. ## New Features - Understand `six.PY2` and `six.PY3` for conditional imports. Closes [#&#8203;3501](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9443](https://github.com/pylint-dev/pylint/issues/9443). ## New Checks - 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 [#&#8203;1727](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;2832](https://github.com/pylint-dev/pylint/issues/2832) ## False Negatives Fixed - If and Try nodes are now checked for useless return statements as well. Closes [#&#8203;9449](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9584](https://github.com/pylint-dev/pylint/issues/9584) ## False Positives Fixed - pylint now understands the `@overload` decorator return values better. Closes [#&#8203;4696](https://github.com/pylint-dev/pylint/issues/4696) Refs [#&#8203;9606](https://github.com/pylint-dev/pylint/issues/9606) ## Performance Improvements - 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 [#&#8203;9442](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9310](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9608](https://github.com/pylint-dev/pylint/issues/9608). ### [`v3.1.1`](https://github.com/pylint-dev/pylint/releases/tag/v3.1.1) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.1.0...v3.1.1) ## What's new in Pylint 3.1.1? Release date: 2024-05-13 ## False Positives Fixed - Treat `attrs.define` and `attrs.frozen` as dataclass decorators in `too-few-public-methods` check. Closes [#&#8203;9345](https://github.com/pylint-dev/pylint/issues/9345) - Fix a false positive with `singledispatchmethod-function` when a method is decorated with both `functools.singledispatchmethod` and `staticmethod`. Closes [#&#8203;9531](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9554](https://github.com/pylint-dev/pylint/issues/9554) ### [`v3.1.0`](https://github.com/pylint-dev/pylint/releases/tag/v3.1.0) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.0.4...v3.1.0) Two new checks--`use-yield-from`, `deprecated-attribute`-- and a smattering of bug fixes. ## New Features - Skip `consider-using-join` check for non-empty separators if an `suggest-join-with-non-empty-separator` option is set to `no`. Closes [#&#8203;8701](https://github.com/pylint-dev/pylint/issues/8701) - Discover `.pyi` files when linting. These can be ignored with the `ignore-patterns` setting. Closes [#&#8203;9097](https://github.com/pylint-dev/pylint/issues/9097) - Check `TypeAlias` and `TypeVar` (PEP 695) nodes for `invalid-name`. Refs [#&#8203;9196](https://github.com/pylint-dev/pylint/issues/9196) - Support for resolving external toml files named pylintrc.toml and .pylintrc.toml. Closes [#&#8203;9228](https://github.com/pylint-dev/pylint/issues/9228) - Check for `.clear`, `.discard`, `.pop` and `remove` methods being called on a set while it is being iterated over. Closes [#&#8203;9334](https://github.com/pylint-dev/pylint/issues/9334) ## New Checks - New message `use-yield-from` added to the refactoring checker. This message is emitted when yielding from a loop can be replaced by `yield from`. Closes [#&#8203;9229](https://github.com/pylint-dev/pylint/issues/9229). - Added a `deprecated-attribute` message to check deprecated attributes in the stdlib. Closes [#&#8203;8855](https://github.com/pylint-dev/pylint/issues/8855) ## False Positives Fixed - Fixed false positive for `inherit-non-class` for generic Protocols. Closes [#&#8203;9106](https://github.com/pylint-dev/pylint/issues/9106) - Exempt `TypedDict` from `typing_extensions` from `too-many-ancestor` checks. Refs [#&#8203;9167](https://github.com/pylint-dev/pylint/issues/9167) ## False Negatives Fixed - Extend broad-exception-raised and broad-exception-caught to except\*. Closes [#&#8203;8827](https://github.com/pylint-dev/pylint/issues/8827) - Fix a false-negative for unnecessary if blocks using a different than expected ordering of arguments. Closes [#&#8203;8947](https://github.com/pylint-dev/pylint/issues/8947). ## Other Bug Fixes - Improve the message provided for wrong-import-order check. Instead of the import statement ("import x"), the message now specifies the import that is out of order and which imports should come after it. As reported in the issue, this is particularly helpful if there are multiple imports on a single line that do not follow the PEP8 convention. The message will report imports as follows: For "import X", it will report "(standard/third party/first party/local) import X" For "import X.Y" and "from X import Y", it will report "(standard/third party/first party/local) import X.Y" The import category is specified to provide explanation as to why pylint has issued the message and guidence to the developer on how to fix the problem. Closes [#&#8203;8808](https://github.com/pylint-dev/pylint/issues/8808) ## Other Changes - Print how many files were checked in verbose mode. Closes [#&#8203;8935](https://github.com/pylint-dev/pylint/issues/8935) - Fix a crash when an enum class which is also decorated with a `dataclasses.dataclass` decorator is defined. Closes [#&#8203;9100](https://github.com/pylint-dev/pylint/issues/9100) ## Internal Changes - Update astroid version to 3.1.0. Refs [#&#8203;9457](https://github.com/pylint-dev/pylint/issues/9457) ### [`v3.0.4`](https://github.com/pylint-dev/pylint/releases/tag/v3.0.4) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.0.3...v3.0.4) ## False Positives Fixed - `used-before-assignment` is no longer emitted when using a name in a loop and depending on an earlier name assignment in an `except` block paired with `else: continue`. Closes [#&#8203;6804](https://github.com/pylint-dev/pylint/issues/6804) - Avoid false positives for `no-member` involving function attributes supplied by decorators. Closes [#&#8203;9246](https://github.com/pylint-dev/pylint/issues/9246) - Fixed false positive nested-min-max for nested lists. Closes [#&#8203;9307](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9451](https://github.com/pylint-dev/pylint/issues/9451) ## Other Bug Fixes - Catch incorrect ValueError `"generator already executing"` for Python 3.12.0 - 3.12.2. This is fixed upstream in Python 3.12.3. Closes [#&#8203;9138](https://github.com/pylint-dev/pylint/issues/9138) ### [`v3.0.3`](https://github.com/pylint-dev/pylint/releases/tag/v3.0.3) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.0.2...v3.0.3) ## What's new in Pylint 3.0.3? Release date: 2023-12-11 ## False Positives Fixed - Fixed false positive for `unnecessary-lambda` when the call has keyword arguments but not the lambda. Closes [#&#8203;9148](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9172](https://github.com/pylint-dev/pylint/issues/9172) - Fix false positives for `undefined-variable` and `unused-argument` for classes and functions using Python 3.12 generic type syntax. Closes [#&#8203;9193](https://github.com/pylint-dev/pylint/issues/9193) - Fixed `pointless-string-statement` false positive for docstrings on Python 3.12 type aliases. Closes [#&#8203;9268](https://github.com/pylint-dev/pylint/issues/9268) - Fix false positive for `invalid-exception-operation` when concatenating tuples of exception types. Closes [#&#8203;9288](https://github.com/pylint-dev/pylint/issues/9288) ## Other Bug Fixes - Fix a bug where pylint was unable to walk recursively through a directory if the directory has an `__init__.py` file. Closes [#&#8203;9210](https://github.com/pylint-dev/pylint/issues/9210) ### [`v3.0.2`](https://github.com/pylint-dev/pylint/releases/tag/v3.0.2) [Compare Source](https://github.com/pylint-dev/pylint/compare/v3.0.1...v3.0.2) ## False Positives Fixed - Fix `used-before-assignment` false positive for generic type syntax (PEP 695, Python 3.12). Closes [#&#8203;9110](https://github.com/pylint-dev/pylint/issues/9110) ## Other Bug Fixes - Escape special symbols and newlines in messages. Closes [#&#8203;7874](https://github.com/pylint-dev/pylint/issues/7874) - Fixes suggestion for `nested-min-max` for expressions with additive operators, list and dict comprehensions. Closes [#&#8203;8524](https://github.com/pylint-dev/pylint/issues/8524) - Fixes ignoring conditional imports with `ignore-imports=y`. Closes [#&#8203;8914](https://github.com/pylint-dev/pylint/issues/8914) - Emit `inconsistent-quotes` for f-strings with 3.12 interpreter only if targeting pre-3.12 versions. Closes [#&#8203;9113](https://github.com/pylint-dev/pylint/issues/9113) ### [`v3.0.1`](https://github.com/pylint-dev/pylint/releases/tag/v3.0.1) ## False Positives Fixed - Fixed false positive for `inherit-non-class` for generic Protocols. Closes [#&#8203;9106](https://github.com/pylint-dev/pylint/issues/9106) ## Other Changes - Fix a crash when an enum class which is also decorated with a `dataclasses.dataclass` decorator is defined. Closes [#&#8203;9100](https://github.com/pylint-dev/pylint/issues/9100) ### [`v3.0.0`](https://github.com/pylint-dev/pylint/releases/tag/v3.0.0) Pylint now support python 3.12 officially. This long anticipated major version also provides some important usability and performance improvements, along with enacting necessary breaking changes and long-announced deprecations. The documentation of each message with an example is very close too. The required astroid version is now 3.0.0. See the [astroid changelog](https://pylint.readthedocs.io/projects/astroid/en/latest/changelog.html#what-s-new-in-astroid-3-0-0) 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. ```json { "messages": [ { "type": "convention", "symbol": "line-too-long", "message": "Line too long (1/2)", "messageId": "C0301", "confidence": "HIGH", "module": "0123", "obj": "", "line": 1, "column": 0, "endLine": 1, "endColumn": 4, "path": "0123", "absolutePath": "0123" } ], "statistics": { "messageTypeCount": { "fatal": 0, "error": 0, "warning": 0, "refactor": 0, "convention": 1, "info": 0 }, "modulesLinted": 1, "score": 5.0 } } ``` ## Breaking Changes - Enabling or disabling individual messages will now take effect even if an `--enable=all` 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: ```bash pylint my_module --enable=fixme --disable=all ``` To regain the prior behavior, remove the superfluous earlier option. Closes [#&#8203;3696](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;6306](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;7767](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8251](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8404](https://github.com/pylint-dev/pylint/issues/8404) - `pyreverse`: Support for the `.vcg` output format (Visualization of Compiler Graphs) has been dropped. Closes [#&#8203;8416](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8462](https://github.com/pylint-dev/pylint/issues/8462) - Following a deprecation period, `pylint.config.PYLINTRC` was removed. Use the `pylint.config.find_default_config_files` generator instead. Closes [#&#8203;8862](https://github.com/pylint-dev/pylint/issues/8862) ## Changes requiring user actions - The `invalid-name` message no longer checks for a minimum length of 3 characters by default. (This was an unadvertised commingling of concerns between casing and name length, and users regularly reported this to be surprising.) If checking for a minimum length is still desired, it can be regained in two ways: - If you are content with a `disallowed-name` message (instead 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 [#&#8203;2018](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;6871](https://github.com/pylint-dev/pylint/issues/6871) - epylint was removed. It now lives at: <https://github.com/emacsorphanage/pylint>. Refs [#&#8203;7737](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8411](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8465](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8973](https://github.com/pylint-dev/pylint/issues/8973) ## New Features - A new `json2` reporter has been added. It features a more enriched output that is easier to parse and provides more info. Compared to `json` the only changes are that messages are now under the `"messages"` key and that `"message-id"` now follows the camelCase convention and is renamed to `"messageId"`. The new reporter also reports the "score" of the modules you linted as defined by 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 [#&#8203;4741](https://github.com/pylint-dev/pylint/issues/4741) - In Pyreverse package dependency diagrams, show when a module imports another only for type-checking. Closes [#&#8203;8112](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8181](https://github.com/pylint-dev/pylint/issues/8181) - Add Pyreverse option to exclude standalone nodes from diagrams with `--no-standalone`. Closes [#&#8203;8476](https://github.com/pylint-dev/pylint/issues/8476) ## New Checks - Added `DataclassChecker` module and `invalid-field-call` checker to check for invalid dataclasses.field() usage. Refs [#&#8203;5159](https://github.com/pylint-dev/pylint/issues/5159) - Add `return-in-finally` to emit a message if a return statement was found in a finally clause. Closes [#&#8203;8260](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8558](https://github.com/pylint-dev/pylint/issues/8558) ## Extensions - 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 [#&#8203;8660](https://github.com/pylint-dev/pylint/issues/8660) ## False Positives Fixed - Extend concept of "function ambiguity" in `safe_infer()` from differing number of function arguments to differing set of argument names. Solves false positives in `tensorflow`. Closes [#&#8203;3613](https://github.com/pylint-dev/pylint/issues/3613) - Fix `unused-argument` false positive when `__new__` does not use all the arguments of `__init__`. Closes [#&#8203;3670](https://github.com/pylint-dev/pylint/issues/3670) - Fix a false positive for `invalid-name` when a type-annotated class variable in an `enum.Enum` class has no assigned value. Refs [#&#8203;7402](https://github.com/pylint-dev/pylint/issues/7402) - Fix `unused-import` false positive for usage of `six.with_metaclass`. Closes [#&#8203;7506](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;7767](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8156](https://github.com/pylint-dev/pylint/issues/8156) - Fix false positive for `used-before-assignment` when usage and assignment are guarded by the same test in different statements. Closes [#&#8203;8167](https://github.com/pylint-dev/pylint/issues/8167) - Adds `asyncSetUp` to the default `defining-attr-methods` list to silence `attribute-defined-outside-init` warning when using `unittest.IsolatedAsyncioTestCase`. Refs [#&#8203;8403](https://github.com/pylint-dev/pylint/issues/8403) - `logging-not-lazy` is not longer emitted for explicitly concatenated string arguments. Closes [#&#8203;8410](https://github.com/pylint-dev/pylint/issues/8410) - Fix false positive for isinstance-second-argument-not-valid-type when union types contains None. Closes [#&#8203;8424](https://github.com/pylint-dev/pylint/issues/8424) - `invalid-name` now allows for integers in `typealias` names: - now valid: `Good2Name`, `GoodName2`. - still invalid: `_1BadName`. Closes [#&#8203;8485](https://github.com/pylint-dev/pylint/issues/8485) - No longer consider `Union` as type annotation as type alias for naming checks. Closes [#&#8203;8487](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8496](https://github.com/pylint-dev/pylint/issues/8496) - Fixed `unused-import` so that it observes the `dummy-variables-rgx` option. Closes [#&#8203;8500](https://github.com/pylint-dev/pylint/issues/8500) - `Union` typed variables without assignment are no longer treated as `TypeAlias`. Closes [#&#8203;8540](https://github.com/pylint-dev/pylint/issues/8540) - Allow parenthesized implicitly concatenated strings when `check-str-concat-over-line-jumps` is enabled. Closes [#&#8203;8552](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8555](https://github.com/pylint-dev/pylint/issues/8555) - Fix false positive for `keyword-arg-before-vararg` when a positional-only parameter with a default value precedes `*args`. Closes [#&#8203;8570](https://github.com/pylint-dev/pylint/issues/8570) - Fix false positive for `arguments-differ` when overriding `__init_subclass__`. Closes [#&#8203;8919](https://github.com/pylint-dev/pylint/issues/8919) - Fix a false positive for `no-value-for-parameter` when a staticmethod is called in a class body. Closes [#&#8203;9036](https://github.com/pylint-dev/pylint/issues/9036) ## False Negatives Fixed - Emit `used-before-assignment` when calling module-level functions before definition. Closes [#&#8203;1144](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;7761](https://github.com/pylint-dev/pylint/issues/7761) - `TypeAlias` variables defined in functions are now checked for `invalid-name` errors. Closes [#&#8203;8536](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8559](https://github.com/pylint-dev/pylint/issues/8559) - Fix a false negative for `too-many-arguments` by considering positional-only and keyword-only parameters. Closes [#&#8203;8667](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8714](https://github.com/pylint-dev/pylint/issues/8714) Closes [#&#8203;8810](https://github.com/pylint-dev/pylint/issues/8810) - `consider-using-augmented-assign` is now applied to dicts and lists as well. Closes [#&#8203;8959](https://github.com/pylint-dev/pylint/issues/8959) ## Other Bug Fixes - Support `duplicate-code` message when parallelizing with `--jobs`. Closes [#&#8203;374](https://github.com/pylint-dev/pylint/issues/374) - Support `cyclic-import` message when parallelizing with `--jobs`. Closes [#&#8203;4171](https://github.com/pylint-dev/pylint/issues/4171) - `--jobs` can now be used with `--load-plugins`. This had regressed in astroid 2.5.0. Closes [#&#8203;4874](https://github.com/pylint-dev/pylint/issues/4874) - docparams extension considers type comments as type documentation. Closes [#&#8203;6287](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;7229](https://github.com/pylint-dev/pylint/issues/7229) - The `ignored-modules` option will now be correctly taken into account for `no-name-in-module`. Closes [#&#8203;7578](https://github.com/pylint-dev/pylint/issues/7578) - `sys.argv` is now always correctly considered as impossible to infer (instead of using the actual values given to pylint). Closes [#&#8203;7710](https://github.com/pylint-dev/pylint/issues/7710) - Avoid duplicative warnings for unqualified exception names in the `overgeneral-exceptions` setting when running with `--jobs`. Closes [#&#8203;7774](https://github.com/pylint-dev/pylint/issues/7774) - Don't show class fields more than once in Pyreverse diagrams. Closes [#&#8203;8189](https://github.com/pylint-dev/pylint/issues/8189) - Fix `used-before-assignment` false negative when TYPE_CHECKING imports are used in multiple scopes. Closes [#&#8203;8198](https://github.com/pylint-dev/pylint/issues/8198) - `--clear-cache-post-run` now also clears LRU caches for pylint utilities holding references to AST nodes. Closes [#&#8203;8361](https://github.com/pylint-dev/pylint/issues/8361) - Fix a crash when `TYPE_CHECKING` is used without importing it. Closes [#&#8203;8434](https://github.com/pylint-dev/pylint/issues/8434) - Fix a `used-before-assignment` false positive when imports are made under the `TYPE_CHECKING` else if branch. Closes [#&#8203;8437](https://github.com/pylint-dev/pylint/issues/8437) - Fix a regression of `preferred-modules` where a partial match was used instead of the required full match. Closes [#&#8203;8453](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8504](https://github.com/pylint-dev/pylint/issues/8504) - Don't show arrows more than once in Pyreverse diagrams. Closes [#&#8203;8522](https://github.com/pylint-dev/pylint/issues/8522) - Improve output of `consider-using-generator` message for `min()` calls with `default` keyword. Closes [#&#8203;8563](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8632](https://github.com/pylint-dev/pylint/issues/8632) - Fix a line break error in Pyreverse dot output. Closes [#&#8203;8671](https://github.com/pylint-dev/pylint/issues/8671) - Fix a false positive for `method-hidden` when using `cached_property` decorator. Closes [#&#8203;8753](https://github.com/pylint-dev/pylint/issues/8753) - Dunder methods defined in lambda do not trigger `unnecessary-dunder-call` anymore, if they cannot be replaced by the non-dunder call. Closes [#&#8203;8769](https://github.com/pylint-dev/pylint/issues/8769) - Don't show duplicate type annotations in Pyreverse diagrams. Closes [#&#8203;8888](https://github.com/pylint-dev/pylint/issues/8888) - Fixing inconsistent hashing issue in `BaseChecker` causing some reports not being exported. Closes [#&#8203;9001](https://github.com/pylint-dev/pylint/issues/9001) - Don't add `Optional` to `|` annotations with `None` in Pyreverse diagrams. Closes [#&#8203;9014](https://github.com/pylint-dev/pylint/issues/9014) - Pyreverse doesn't show multiple class association arrows anymore, but only the strongest one. Refs [#&#8203;9045](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;9059](https://github.com/pylint-dev/pylint/issues/9059) - Fix crash in refactoring checker when unary operand used with variable in for loop. Closes [#&#8203;9074](https://github.com/pylint-dev/pylint/issues/9074) ## Other Changes - Pylint now exposes its type annotations. Closes [#&#8203;5488](https://github.com/pylint-dev/pylint/issues/5488) and [#&#8203;2079](https://github.com/pylint-dev/pylint/issues/2079) - Search for `pyproject.toml` recursively in parent directories up to a project or file system root. Refs [#&#8203;7163](https://github.com/pylint-dev/pylint/issues/7163), Closes [#&#8203;3289](https://github.com/pylint-dev/pylint/issues/3289) - All code related to the optparse config parsing has been removed. Refs [#&#8203;8405](https://github.com/pylint-dev/pylint/issues/8405) - Pylint now supports python 3.12. Refs [#&#8203;8718](https://github.com/pylint-dev/pylint/issues/8718) - Add a CITATION.cff file to the root of the repository containing the necessary metadata to cite Pylint. Closes [#&#8203;8760](https://github.com/pylint-dev/pylint/issues/8760) - Renamed the "unneeded-not" error into "unnecessary_negation" to be clearer. Closes [#&#8203;8789](https://github.com/pylint-dev/pylint/issues/8789) ## Internal Changes - `get_message_definition` was removed from the base checker API. You can access message definitions through the `MessageStore`. Refs [#&#8203;8401](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8404](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8407](https://github.com/pylint-dev/pylint/issues/8407) - `Reporter.set_output` was removed in favor of `reporter.out = stream`. Refs [#&#8203;8408](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8409](https://github.com/pylint-dev/pylint/issues/8409) - `colorize_ansi` now only accepts a `MessageStyle` object. Refs [#&#8203;8412](https://github.com/pylint-dev/pylint/issues/8412) - Following a deprecation period, `Pylinter.check` now only works with sequences of strings, not strings. Refs [#&#8203;8463](https://github.com/pylint-dev/pylint/issues/8463) - Following a deprecation period, `ColorizedTextReporter` only accepts `ColorMappingDict`. Refs [#&#8203;8464](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8466](https://github.com/pylint-dev/pylint/issues/8466) - Following a deprecation period, the `do_exit` argument of the `Run` class (and of the `_Run` class in testutils) were removed. Refs [#&#8203;8472](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8473](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8474](https://github.com/pylint-dev/pylint/issues/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 [#&#8203;8475](https://github.com/pylint-dev/pylint/issues/8475) - Following a deprecation period, the `location` argument of the `Message` class must now be a `MessageLocationTuple`. Refs [#&#8203;8477](https://github.com/pylint-dev/pylint/issues/8477) - Following a deprecation period, the `check_single_file` function of the `Pylinter` is replaced by `Pylinter.check_single_file_item`. Refs [#&#8203;8478](https://github.com/pylint-dev/pylint/issues/8478) ## Performance Improvements - `pylint` runs (at least) \~5% faster after improvements to `astroid` that make better use of the inference cache. Refs [pylint-dev/astroid#529](https://github.com/pylint-dev/astroid/issues/529) - - Optimize `is_trailing_comma()`. - Cache `class_is_abstract()`. Refs [#&#8203;1954](https://github.com/pylint-dev/pylint/issues/1954) - Exit immediately if all messages are disabled. Closes [#&#8203;8715](https://github.com/pylint-dev/pylint/issues/8715) </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xOTIuMiIsInVwZGF0ZWRJblZlciI6IjQ0LjE5Mi4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
BlazingNeutron deleted branch renovate/pylint-4.x 2026-10-30 08:40:47 -04:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
BlazingNeutron/wyoming-whisper-api-client!14
No description provided.