All Versions
24
Latest Version
Avg Release Cycle
137 days
Latest Release
108 days ago

Changelog History
Page 1

  • v4.0.5 Changes

    February 20, 2026

    ๐Ÿ‘• 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.

    • ๐Ÿ›  Fixed false positive for logging-unsupported-format when no arguments are provided to logging functions.

    • ๐Ÿ›  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.

    • Avoid emitting unspecified-encoding (W1514) when py-version is 3.15+.

    ๐Ÿ›  Other Bug Fixes

    • Fix --known_third_party config being ignored.

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

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

  • v4.0.4 Changes

    November 30, 2025

    ๐Ÿ‘• 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.

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

  • v4.0.3 Changes

    November 13, 2025

    ๐Ÿ‘• 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.

    • ๐Ÿ›  Fixed false positive for invalid-name with typing.Annotated.

    • ๐Ÿ›  Fix false positive for f-string-without-interpolation with template strings
      when using format spec.

    • ๐Ÿ›  Fix a false positive when an UPPER_CASED class attribute was raising an
      invalid-name when typed with Final.

    • ๐Ÿ›  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.

    ๐Ÿ›  Other Bug Fixes

    • ๐Ÿ‘‰ Make 'ignore' option work as expected again.

    • ๐Ÿ›  Fix crash for consider-using-assignment-expr when a variable annotation without assignment
      โœ… is used as the if test expression.

    • ๐Ÿ›  Fix crash for prefer-typing-namedtuple and consider-math-not-float when
      a slice object is called.

  • v4.0.2 Changes

    October 20, 2025

    ๐Ÿ›  False Positives Fixed

    • ๐Ÿ›  Fix false positive for invalid-name on a partially uninferable module-level constant.

    • ๐Ÿ›  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.

    • ๐Ÿ›  Fix false positive for invalid-name for TypedDict instances.

  • v4.0.1 Changes

    October 15, 2025

    ๐Ÿ‘• What's new in Pylint 4.0.1?

    ๐Ÿš€ Release date: 2025-10-14

    ๐Ÿ›  False Positives Fixed

    • Exclude __all__ and __future__.annotations from unused-variable.

    • ๐Ÿ›  Fix false-positive for bare-name-capture-pattern if a case guard is used.

    • Check enums created with the Enum() functional syntax to pass against the
      --class-rgx for the invalid-name check, like other enums.

  • v4.0.0 Changes

    October 12, 2025
    • ๐Ÿ‘• 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:

    classResult:errors:dict|None=Noneresult=Result()ifresult.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]ifsometimes:LIMIT=1# [invalid-name]
    

    If this is undesired, refactor using exclusive assignment so that it is
    evident that this assignment happens only once:

    ifsometimes:LIMIT=1else: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").

    • The unused pylintrc argument to PyLinter. __init__ () is deprecated
      ๐Ÿšš and will be removed.

    • ๐Ÿšš Commented out code blocks such as # bar() # TODO: remove dead code will no longer emit fixme.

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

    • ๐Ÿ‘• 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.

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

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

    • โœ‚ Removed support for nmp.NaN alias for numpy.NaN being recognized in ':ref:nan-comparison'. Use np or numpy instead.

    • ๐Ÿ”– 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.

    ๐Ÿ†• 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.

    • โœจ Enhanced pyreverse to properly distinguish between UML relationship types (association, aggregation, composition) based on object ownership semantics. Type annotations without assignment are now treated as associations, parameter assignments as aggregations, and object instantiation as compositions.

    • ๐Ÿ“„ The fixme check can now search through docstrings as well as comments, by using
      ๐Ÿ‘• check-fixme-in-docstring = true in the [tool.pylint.miscellaneous] section.

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

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

    • ๐Ÿ”ง 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.

    • โœจ Enhanced support for @Property decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams.

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

    • ๐Ÿ– Handle deferred evaluation of annotations in Python 3.14.

    • โœจ Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator).

    • ๐Ÿ‘ pyreverse: add support for colorized output when using output format mmd (MermaidJS) and html.

    • ๐Ÿ‘ pypy 3.11 is now officially supported.

    • โž• Add support for Python 3.14.

    • โž• Add naming styles for ParamSpec and TypeVarTuple that align with the TypeVar style.

    ๐Ÿ†• 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.

    • โž• Add new check async-context-manager-with-regular-with to detect async context managers used with regular with statements instead of async with.

    • โž• 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/>_.

    • โž• Add new checks for invalid uses of class patterns in :keyword:match.

    • โž• Add additional checks for suboptimal uses of class patterns in :keyword:match.

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

    ๐Ÿ›  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.

    • ๐Ÿ›  Fix :ref:no-name-in-module for members of concurrent.futures with Python 3.14.

    ๐Ÿ›  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.

    • Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly.

    • Check module-level constants with type annotations for invalid-name.
      ๐Ÿ’… Remember to adjust const-naming-style or const-rgx to your liking.

    • ๐Ÿ›  Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore.

    • ๐ŸŒฒ 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 rais...

  • v3.3.9 Changes

    October 05, 2025

    ๐Ÿ‘• 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.

    • ๐Ÿ—„ No longer flag undeprecated functions in importlib.resources as deprecated.

    • ๐Ÿ›  Fix false positive inconsistent-return-statements when using quit() or exit() functions.

    • ๐Ÿ›  Fix false positive undefined-variable (E0602) for for-loop variable shadowing patterns like for item in item: when the variable was previously defined.

    ๐Ÿ›  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.
  • v3.3.8 Changes

    August 09, 2025

    ๐Ÿ‘• 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.

    • ๐Ÿ›  Fix false positive for missing-raises-doc and missing-yield-doc when the method length is less than docstring-min-length.

    • ๐Ÿ›  Fix a false positive for unused-variable when multiple except handlers bind the same name under a try block.

    ๐Ÿ›  False Negatives Fixed

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

    ๐Ÿ›  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.).

    • ๐Ÿ›  Fix double underscores erroneously rendering as bold in pyreverse's Mermaid output.

  • v3.3.7 Changes

    May 04, 2025

    ๐Ÿ‘• 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.

    ๐Ÿ›  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.

    • ๐Ÿ›  Fix a crash caused by malformed format strings when using .format with keyword arguments.

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

    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.
  • v3.3.6 Changes

    March 20, 2025

    ๐Ÿ‘• 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.