Skip to content

Conversation

renovate[bot]
Copy link
Contributor

@renovate renovate bot commented Oct 13, 2025

This PR contains the following updates:

Package Change Age Confidence
pylint (changelog) ^3.2.6 -> ^4.0.0 age confidence

Release Notes

pylint-dev/pylint (pylint)

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


Configuration

📅 Schedule: 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 was generated by Mend Renovate. View the repository job log.

Copy link
Contributor Author

renovate bot commented Oct 13, 2025

⚠️ Artifact update problem

Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is.

♻ Renovate will retry this branch, including artifacts, only when one of the following happens:

  • any of the package files in this branch needs updating, or
  • the branch becomes conflicted, or
  • you click the rebase/retry checkbox if found above, or
  • you rename this PR's title to start with "rebase!" to trigger it manually

The artifact failure details are included below:

File name: poetry.lock
Updating dependencies
Resolving dependencies...


The current project's supported Python range (>=3.8,<4.0) is not compatible with some of the required packages Python requirement:
  - pylint requires Python >=3.10.0, so it will not be satisfied for Python >=3.8,<3.10.0
  - pylint requires Python >=3.10.0, so it will not be satisfied for Python >=3.8,<3.10.0

Because no versions of pylint match >4.0.0,<4.0.1 || >4.0.1,<5.0.0
 and pylint (4.0.0) requires Python >=3.10.0, pylint is forbidden.
So, because pylint (4.0.1) requires Python >=3.10.0
 and encryption-helper depends on pylint (^4.0.0), version solving failed.

  • Check your dependencies Python requirement: The Python requirement can be specified via the `python` or `markers` properties
    
    For pylint, a possible solution would be to set the `python` property to ">=3.10.0,<4.0"
    For pylint, a possible solution would be to set the `python` property to ">=3.10.0,<4.0"

    https://python-poetry.org/docs/dependency-specification/#python-restricted-dependencies,
    https://python-poetry.org/docs/dependency-specification/#using-environment-markers

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants