Repository navigation
Add additional checks for match class patterns - #10587
Conversation
f6d8d9d to
42b289d
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #10587 +/- ##
=======================================
Coverage 95.95% 95.95%
=======================================
Files 176 176
Lines 19455 19469 +14
=======================================
+ Hits 18668 18682 +14
Misses 787 787
🚀 New features to boost your workflow:
|
This comment has been minimized.
This comment has been minimized.
| inferred = safe_infer(node.cls) | ||
| if not ( | ||
| isinstance(inferred, nodes.ClassDef) | ||
| and inferred.qname() in MATCH_CLASS_SELF_NAMES | ||
| ): | ||
| self.add_message( | ||
| "match-class-positional-attributes", | ||
| node=node, | ||
| confidence=HIGH, | ||
| ) |
There was a problem hiding this comment.
Looking at the sentry results, I do wonder if this is to strict and we'd end up emitting too many false positives. self matches also work for every subclass of the special builtin classes (as long as they don't implement __match_args__). Most notably NamedTuple.
There was a problem hiding this comment.
Added some special casing for tuple that should handle it.
This comment has been minimized.
This comment has been minimized.
3ff329c to
7c078e5
Compare
7c078e5 to
768c4c9
Compare
This comment has been minimized.
This comment has been minimized.
| "can be avoided.", | ||
| ), | ||
| "R1906": ( | ||
| "Use keyword attributes instead of positional ones", |
There was a problem hiding this comment.
| "Use keyword attributes instead of positional ones", | |
| "Use keyword attributes instead of positional ones ('%s')", |
I think we can construct the expected here too. (And one day use it to autofix?)
| case {"type": "user", "data": user_data}: | ||
| match user_data: # Nested match adds complexity | ||
| case {"name": str(name)}: | ||
| case {"name": str() as name}: |
There was a problem hiding this comment.
This check already making pylint better 😄
There was a problem hiding this comment.
Fixed most of the pylint code in #10580 already. That's why there are "only" two instances in a test case left here.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
18c133e to
f420f28
Compare
|
🤖 According to the primer, this change has no effect on the checked open source code. 🤖🎉 This comment was generated for commit f420f28 |
| "attribute in a class pattern.", | ||
| ), | ||
| "R1905": ( | ||
| "Use '%s() as %s' instead", |
There was a problem hiding this comment.
| "Use '%s() as %s' instead", | |
| "Use '%s() as %s' instead, if performance is a concern", |
(This is a suggestion, the message is short, there's room for explanation in it, maybe ?)
There was a problem hiding this comment.
Seems Daniel merged it before I saw your comment 😄
Anyway, not sure we need an extra comment here. I did think about moving these checks to an extension (e.g. CodeStyle. However, there are clear performance benefits which is why I decided to keep them always enabled.
If we get reports about them, we could still consider amending the message or moving the check.
There was a problem hiding this comment.
Oops, sorry! I saw Pierre's approval and thought it was a comment from his earlier review.
Will be more careful next time!
There was a problem hiding this comment.
No problem, it was good to merge which is why I approved in the first place 😄
Pierre-Sassoulas
left a comment
There was a problem hiding this comment.
LGTM, great checker !
|
Just got a The "What's New" page links to the wrong PR. |
Thanks for the hint @nickdrozd. Opened #10644 to fix it. Also changed the Github release docs. |
This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [pylint](https://github.com/pylint-dev/pylint) ([changelog](https://pylint.readthedocs.io/en/latest/whatsnew/3/)) | `<4.0.0,>=3.3.3` -> `<4.1.0,>=4.0.0` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>pylint-dev/pylint (pylint)</summary> ### [`v4.0.0`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.0) [Compare Source](pylint-dev/pylint@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 [@​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 [#​3585](pylint-dev/pylint#3585) - The unused `pylintrc` argument to `PyLinter.__init__()` is deprecated and will be removed. Refs [#​6052](pylint-dev/pylint#6052) - Commented out code blocks such as `# bar() # TODO: remove dead code` will no longer emit `fixme`. Refs [#​9255](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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 [#​10480](pylint-dev/pylint#10480) - Removed support for `nmp.NaN` alias for `numpy.NaN` being recognized in ':ref:`nan-comparison`'. Use `np` or `numpy` instead. Refs [#​10583](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9045) Closes [#​9267](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9898) - Enhanced support for [@​property](https://github.com/property) decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams. Closes [#​10057](pylint-dev/pylint#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](pylint-dev/pylint#10077) - Handle deferred evaluation of annotations in Python 3.14. Closes [#​10149](pylint-dev/pylint#10149) - Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator). Closes [#​10236](pylint-dev/pylint#10236) - `pyreverse`: add support for colorized output when using output format `mmd` (MermaidJS) and `html`. Closes [#​10242](pylint-dev/pylint#10242) - pypy 3.11 is now officially supported. Refs [#​10287](pylint-dev/pylint#10287) - Add support for Python 3.14. Refs [#​10467](pylint-dev/pylint#10467) - Add naming styles for `ParamSpec` and `TypeVarTuple` that align with the `TypeVar` style. Refs [#​10541](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10061) - Fix :ref:`no-name-in-module` for members of `concurrent.futures` with Python 3.14. Closes [#​10632](pylint-dev/pylint#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](pylint-dev/pylint#8893) - Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly. Refs [#​9667](pylint-dev/pylint#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](pylint-dev/pylint#9770) - Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore. Closes [#​9894](pylint-dev/pylint#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](pylint-dev/pylint#9999) - Fix false negative for `used-before-assignment` when a function is defined inside a `TYPE_CHECKING` guard block and used later. Closes [#​10028](pylint-dev/pylint#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](pylint-dev/pylint#10421) - Fix false negative for `deprecated-module` when a `__import__` method is used instead of `import` sentence. Refs [#​10453](pylint-dev/pylint#10453) - Count match cases for `too-many-branches` check. Refs [#​10542](pylint-dev/pylint#10542) - Fix false-negative where :ref:`unused-import` was not reported for names referenced in a preceding `global` statement. Refs [#​10633](pylint-dev/pylint#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](pylint-dev/pylint#8736) - Fixed unidiomatic-typecheck only checking left-hand side. Closes [#​10217](pylint-dev/pylint#10217) - Fix a crash caused by malformed format strings when using `.format` with keyword arguments. Closes [#​10282](pylint-dev/pylint#10282) - Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions. Closes [#​10508](pylint-dev/pylint#10508) - Fix a crash in :ref:`nested-min-max` when using `builtins.min` or `builtins.max` instead of `min` or `max` directly. Closes [#​10626](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10405) ## Internal Changes - Modified test framework to allow for different test output for different Python versions. Refs [#​10382](pylint-dev/pylint#10382) </details> --- ### 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 is behind base branch, 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 [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDYuMCIsInVwZGF0ZWRJblZlciI6IjQxLjE0Ni4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJ0eXBlL2RlcGVuZGVuY2llcyJdfQ==--> Reviewed-on: https://git.tainton.uk/repos/roboluke/pulls/384 Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk> Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [pylint](https://github.com/pylint-dev/pylint) ([changelog](https://pylint.readthedocs.io/en/latest/whatsnew/3/)) | `<4.0.0,>=3.3.3` -> `<4.1.0,>=4.0.0` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>pylint-dev/pylint (pylint)</summary> ### [`v4.0.0`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.0) [Compare Source](pylint-dev/pylint@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 [@​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 [#​3585](pylint-dev/pylint#3585) - The unused `pylintrc` argument to `PyLinter.__init__()` is deprecated and will be removed. Refs [#​6052](pylint-dev/pylint#6052) - Commented out code blocks such as `# bar() # TODO: remove dead code` will no longer emit `fixme`. Refs [#​9255](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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 [#​10480](pylint-dev/pylint#10480) - Removed support for `nmp.NaN` alias for `numpy.NaN` being recognized in ':ref:`nan-comparison`'. Use `np` or `numpy` instead. Refs [#​10583](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9045) Closes [#​9267](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9898) - Enhanced support for [@​property](https://github.com/property) decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams. Closes [#​10057](pylint-dev/pylint#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](pylint-dev/pylint#10077) - Handle deferred evaluation of annotations in Python 3.14. Closes [#​10149](pylint-dev/pylint#10149) - Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator). Closes [#​10236](pylint-dev/pylint#10236) - `pyreverse`: add support for colorized output when using output format `mmd` (MermaidJS) and `html`. Closes [#​10242](pylint-dev/pylint#10242) - pypy 3.11 is now officially supported. Refs [#​10287](pylint-dev/pylint#10287) - Add support for Python 3.14. Refs [#​10467](pylint-dev/pylint#10467) - Add naming styles for `ParamSpec` and `TypeVarTuple` that align with the `TypeVar` style. Refs [#​10541](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10061) - Fix :ref:`no-name-in-module` for members of `concurrent.futures` with Python 3.14. Closes [#​10632](pylint-dev/pylint#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](pylint-dev/pylint#8893) - Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly. Refs [#​9667](pylint-dev/pylint#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](pylint-dev/pylint#9770) - Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore. Closes [#​9894](pylint-dev/pylint#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](pylint-dev/pylint#9999) - Fix false negative for `used-before-assignment` when a function is defined inside a `TYPE_CHECKING` guard block and used later. Closes [#​10028](pylint-dev/pylint#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](pylint-dev/pylint#10421) - Fix false negative for `deprecated-module` when a `__import__` method is used instead of `import` sentence. Refs [#​10453](pylint-dev/pylint#10453) - Count match cases for `too-many-branches` check. Refs [#​10542](pylint-dev/pylint#10542) - Fix false-negative where :ref:`unused-import` was not reported for names referenced in a preceding `global` statement. Refs [#​10633](pylint-dev/pylint#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](pylint-dev/pylint#8736) - Fixed unidiomatic-typecheck only checking left-hand side. Closes [#​10217](pylint-dev/pylint#10217) - Fix a crash caused by malformed format strings when using `.format` with keyword arguments. Closes [#​10282](pylint-dev/pylint#10282) - Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions. Closes [#​10508](pylint-dev/pylint#10508) - Fix a crash in :ref:`nested-min-max` when using `builtins.min` or `builtins.max` instead of `min` or `max` directly. Closes [#​10626](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10405) ## Internal Changes - Modified test framework to allow for different test output for different Python versions. Refs [#​10382](pylint-dev/pylint#10382) </details> --- ### 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 is behind base branch, 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 [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDYuMCIsInVwZGF0ZWRJblZlciI6IjQxLjE0Ni4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJ0eXBlL2RlcGVuZGVuY2llcyJdfQ==--> Reviewed-on: https://git.tainton.uk/repos/epage/pulls/168 Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk> Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [pylint](https://github.com/pylint-dev/pylint) ([changelog](https://pylint.readthedocs.io/en/latest/whatsnew/3/)) | `<4.0.0,>=3.3.2` -> `<4.1.0,>=4.0.0` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>pylint-dev/pylint (pylint)</summary> ### [`v4.0.0`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.0) [Compare Source](pylint-dev/pylint@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 [@​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 [#​3585](pylint-dev/pylint#3585) - The unused `pylintrc` argument to `PyLinter.__init__()` is deprecated and will be removed. Refs [#​6052](pylint-dev/pylint#6052) - Commented out code blocks such as `# bar() # TODO: remove dead code` will no longer emit `fixme`. Refs [#​9255](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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 [#​10480](pylint-dev/pylint#10480) - Removed support for `nmp.NaN` alias for `numpy.NaN` being recognized in ':ref:`nan-comparison`'. Use `np` or `numpy` instead. Refs [#​10583](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9045) Closes [#​9267](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9898) - Enhanced support for [@​property](https://github.com/property) decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams. Closes [#​10057](pylint-dev/pylint#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](pylint-dev/pylint#10077) - Handle deferred evaluation of annotations in Python 3.14. Closes [#​10149](pylint-dev/pylint#10149) - Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator). Closes [#​10236](pylint-dev/pylint#10236) - `pyreverse`: add support for colorized output when using output format `mmd` (MermaidJS) and `html`. Closes [#​10242](pylint-dev/pylint#10242) - pypy 3.11 is now officially supported. Refs [#​10287](pylint-dev/pylint#10287) - Add support for Python 3.14. Refs [#​10467](pylint-dev/pylint#10467) - Add naming styles for `ParamSpec` and `TypeVarTuple` that align with the `TypeVar` style. Refs [#​10541](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10061) - Fix :ref:`no-name-in-module` for members of `concurrent.futures` with Python 3.14. Closes [#​10632](pylint-dev/pylint#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](pylint-dev/pylint#8893) - Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly. Refs [#​9667](pylint-dev/pylint#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](pylint-dev/pylint#9770) - Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore. Closes [#​9894](pylint-dev/pylint#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](pylint-dev/pylint#9999) - Fix false negative for `used-before-assignment` when a function is defined inside a `TYPE_CHECKING` guard block and used later. Closes [#​10028](pylint-dev/pylint#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](pylint-dev/pylint#10421) - Fix false negative for `deprecated-module` when a `__import__` method is used instead of `import` sentence. Refs [#​10453](pylint-dev/pylint#10453) - Count match cases for `too-many-branches` check. Refs [#​10542](pylint-dev/pylint#10542) - Fix false-negative where :ref:`unused-import` was not reported for names referenced in a preceding `global` statement. Refs [#​10633](pylint-dev/pylint#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](pylint-dev/pylint#8736) - Fixed unidiomatic-typecheck only checking left-hand side. Closes [#​10217](pylint-dev/pylint#10217) - Fix a crash caused by malformed format strings when using `.format` with keyword arguments. Closes [#​10282](pylint-dev/pylint#10282) - Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions. Closes [#​10508](pylint-dev/pylint#10508) - Fix a crash in :ref:`nested-min-max` when using `builtins.min` or `builtins.max` instead of `min` or `max` directly. Closes [#​10626](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10405) ## Internal Changes - Modified test framework to allow for different test output for different Python versions. Refs [#​10382](pylint-dev/pylint#10382) </details> --- ### 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 is behind base branch, 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 [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDYuMCIsInVwZGF0ZWRJblZlciI6IjQxLjE0Ni4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJ0eXBlL2RlcGVuZGVuY2llcyJdfQ==--> Reviewed-on: https://git.tainton.uk/repos/webexmemebot/pulls/516 Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk> Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [pylint](https://github.com/pylint-dev/pylint) ([changelog](https://pylint.readthedocs.io/en/latest/whatsnew/3/)) | `<4.0.0,>=3.3.4` -> `<4.1.0,>=4.0.0` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>pylint-dev/pylint (pylint)</summary> ### [`v4.0.0`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.0) [Compare Source](pylint-dev/pylint@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 [@​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 [#​3585](pylint-dev/pylint#3585) - The unused `pylintrc` argument to `PyLinter.__init__()` is deprecated and will be removed. Refs [#​6052](pylint-dev/pylint#6052) - Commented out code blocks such as `# bar() # TODO: remove dead code` will no longer emit `fixme`. Refs [#​9255](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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 [#​10480](pylint-dev/pylint#10480) - Removed support for `nmp.NaN` alias for `numpy.NaN` being recognized in ':ref:`nan-comparison`'. Use `np` or `numpy` instead. Refs [#​10583](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9045) Closes [#​9267](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9898) - Enhanced support for [@​property](https://github.com/property) decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams. Closes [#​10057](pylint-dev/pylint#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](pylint-dev/pylint#10077) - Handle deferred evaluation of annotations in Python 3.14. Closes [#​10149](pylint-dev/pylint#10149) - Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator). Closes [#​10236](pylint-dev/pylint#10236) - `pyreverse`: add support for colorized output when using output format `mmd` (MermaidJS) and `html`. Closes [#​10242](pylint-dev/pylint#10242) - pypy 3.11 is now officially supported. Refs [#​10287](pylint-dev/pylint#10287) - Add support for Python 3.14. Refs [#​10467](pylint-dev/pylint#10467) - Add naming styles for `ParamSpec` and `TypeVarTuple` that align with the `TypeVar` style. Refs [#​10541](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10061) - Fix :ref:`no-name-in-module` for members of `concurrent.futures` with Python 3.14. Closes [#​10632](pylint-dev/pylint#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](pylint-dev/pylint#8893) - Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly. Refs [#​9667](pylint-dev/pylint#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](pylint-dev/pylint#9770) - Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore. Closes [#​9894](pylint-dev/pylint#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](pylint-dev/pylint#9999) - Fix false negative for `used-before-assignment` when a function is defined inside a `TYPE_CHECKING` guard block and used later. Closes [#​10028](pylint-dev/pylint#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](pylint-dev/pylint#10421) - Fix false negative for `deprecated-module` when a `__import__` method is used instead of `import` sentence. Refs [#​10453](pylint-dev/pylint#10453) - Count match cases for `too-many-branches` check. Refs [#​10542](pylint-dev/pylint#10542) - Fix false-negative where :ref:`unused-import` was not reported for names referenced in a preceding `global` statement. Refs [#​10633](pylint-dev/pylint#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](pylint-dev/pylint#8736) - Fixed unidiomatic-typecheck only checking left-hand side. Closes [#​10217](pylint-dev/pylint#10217) - Fix a crash caused by malformed format strings when using `.format` with keyword arguments. Closes [#​10282](pylint-dev/pylint#10282) - Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions. Closes [#​10508](pylint-dev/pylint#10508) - Fix a crash in :ref:`nested-min-max` when using `builtins.min` or `builtins.max` instead of `min` or `max` directly. Closes [#​10626](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10405) ## Internal Changes - Modified test framework to allow for different test output for different Python versions. Refs [#​10382](pylint-dev/pylint#10382) </details> --- ### 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 is behind base branch, 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 [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDYuMCIsInVwZGF0ZWRJblZlciI6IjQxLjE0Ni4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJ0eXBlL2RlcGVuZGVuY2llcyJdfQ==--> Reviewed-on: https://git.tainton.uk/luke/instant-msg-api/pulls/213 Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk> Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [pylint](https://github.com/pylint-dev/pylint) ([changelog](https://pylint.readthedocs.io/en/latest/whatsnew/3/)) | `<4.0.0,>=3.1.0` -> `<4.1.0,>=4.0.4` |  |  | --- ### Release Notes <details> <summary>pylint-dev/pylint (pylint)</summary> ### [`v4.0.4`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.4) [Compare Source](pylint-dev/pylint@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 [#​10719](pylint-dev/pylint#10719) - Fix a false positive for `invalid-name` on an UPPER\_CASED name inside an `if` branch that assigns an object. Closes [#​10745](pylint-dev/pylint#10745) ### [`v4.0.3`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.3) [Compare Source](pylint-dev/pylint@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 [#​10435](pylint-dev/pylint#10435) - Fixed false positive for `invalid-name` with `typing.Annotated`. Closes [#​10696](pylint-dev/pylint#10696) - Fix false positive for `f-string-without-interpolation` with template strings when using format spec. Closes [#​10702](pylint-dev/pylint#10702) - Fix a false positive when an UPPER\_CASED class attribute was raising an `invalid-name` when typed with `Final`. Closes [#​10711](pylint-dev/pylint#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](pylint-dev/pylint#10721) ## Other Bug Fixes - Make 'ignore' option work as expected again. Closes [#​10669](pylint-dev/pylint#10669) - Fix crash for `consider-using-assignment-expr` when a variable annotation without assignment is used as the `if` test expression. Closes [#​10707](pylint-dev/pylint#10707) - Fix crash for `prefer-typing-namedtuple` and `consider-math-not-float` when a `slice` object is called. Closes [#​10708](pylint-dev/pylint#10708) ### [`v4.0.2`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.2) [Compare Source](pylint-dev/pylint@v4.0.1...v4.0.2) ## False Positives Fixed - Fix false positive for `invalid-name` on a partially uninferable module-level constant. Closes [#​10652](pylint-dev/pylint#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](pylint-dev/pylint#10664) - Fix false positive for `invalid-name` for `TypedDict` instances. Closes [#​10672](pylint-dev/pylint#10672) ### [`v4.0.1`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.1) [Compare Source](pylint-dev/pylint@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 [#​10019](pylint-dev/pylint#10019) - Fix false-positive for `bare-name-capture-pattern` if a case guard is used. Closes [#​10647](pylint-dev/pylint#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](pylint-dev/pylint#10660) ### [`v4.0.0`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.0) [Compare Source](pylint-dev/pylint@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 [@​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 [#​3585](pylint-dev/pylint#3585) - The unused `pylintrc` argument to `PyLinter.__init__()` is deprecated and will be removed. Refs [#​6052](pylint-dev/pylint#6052) - Commented out code blocks such as `# bar() # TODO: remove dead code` will no longer emit `fixme`. Refs [#​9255](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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 [#​10480](pylint-dev/pylint#10480) - Removed support for `nmp.NaN` alias for `numpy.NaN` being recognized in ':ref:`nan-comparison`'. Use `np` or `numpy` instead. Refs [#​10583](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9045) Closes [#​9267](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9898) - Enhanced support for [@​property](https://github.com/property) decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams. Closes [#​10057](pylint-dev/pylint#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](pylint-dev/pylint#10077) - Handle deferred evaluation of annotations in Python 3.14. Closes [#​10149](pylint-dev/pylint#10149) - Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator). Closes [#​10236](pylint-dev/pylint#10236) - `pyreverse`: add support for colorized output when using output format `mmd` (MermaidJS) and `html`. Closes [#​10242](pylint-dev/pylint#10242) - pypy 3.11 is now officially supported. Refs [#​10287](pylint-dev/pylint#10287) - Add support for Python 3.14. Refs [#​10467](pylint-dev/pylint#10467) - Add naming styles for `ParamSpec` and `TypeVarTuple` that align with the `TypeVar` style. Refs [#​10541](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10061) - Fix :ref:`no-name-in-module` for members of `concurrent.futures` with Python 3.14. Closes [#​10632](pylint-dev/pylint#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](pylint-dev/pylint#8893) - Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly. Refs [#​9667](pylint-dev/pylint#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](pylint-dev/pylint#9770) - Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore. Closes [#​9894](pylint-dev/pylint#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](pylint-dev/pylint#9999) - Fix false negative for `used-before-assignment` when a function is defined inside a `TYPE_CHECKING` guard block and used later. Closes [#​10028](pylint-dev/pylint#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](pylint-dev/pylint#10421) - Fix false negative for `deprecated-module` when a `__import__` method is used instead of `import` sentence. Refs [#​10453](pylint-dev/pylint#10453) - Count match cases for `too-many-branches` check. Refs [#​10542](pylint-dev/pylint#10542) - Fix false-negative where :ref:`unused-import` was not reported for names referenced in a preceding `global` statement. Refs [#​10633](pylint-dev/pylint#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](pylint-dev/pylint#8736) - Fixed unidiomatic-typecheck only checking left-hand side. Closes [#​10217](pylint-dev/pylint#10217) - Fix a crash caused by malformed format strings when using `.format` with keyword arguments. Closes [#​10282](pylint-dev/pylint#10282) - Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions. Closes [#​10508](pylint-dev/pylint#10508) - Fix a crash in :ref:`nested-min-max` when using `builtins.min` or `builtins.max` instead of `min` or `max` directly. Closes [#​10626](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10405) ## Internal Changes - Modified test framework to allow for different test output for different Python versions. Refs [#​10382](pylint-dev/pylint#10382) </details> --- ### 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 is behind base branch, 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 [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4zOS4yIiwidXBkYXRlZEluVmVyIjoiNDIuMzkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidHlwZS9kZXBlbmRlbmNpZXMiXX0=--> Reviewed-on: https://git.tainton.uk/repos/pypilot/pulls/399 Reviewed-by: Luke Tainton <luke@tainton.uk> Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk> Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [pylint](https://github.com/pylint-dev/pylint) ([changelog](https://pylint.readthedocs.io/en/latest/whatsnew/3/)) | `<4.0.0,>=3.3.3` -> `<4.1.0,>=4.0.0` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>pylint-dev/pylint (pylint)</summary> ### [`v4.0.0`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.0) [Compare Source](pylint-dev/pylint@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 [@​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 [#​3585](pylint-dev/pylint#3585) - The unused `pylintrc` argument to `PyLinter.__init__()` is deprecated and will be removed. Refs [#​6052](pylint-dev/pylint#6052) - Commented out code blocks such as `# bar() # TODO: remove dead code` will no longer emit `fixme`. Refs [#​9255](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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 [#​10480](pylint-dev/pylint#10480) - Removed support for `nmp.NaN` alias for `numpy.NaN` being recognized in ':ref:`nan-comparison`'. Use `np` or `numpy` instead. Refs [#​10583](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9045) Closes [#​9267](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9898) - Enhanced support for [@​property](https://github.com/property) decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams. Closes [#​10057](pylint-dev/pylint#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](pylint-dev/pylint#10077) - Handle deferred evaluation of annotations in Python 3.14. Closes [#​10149](pylint-dev/pylint#10149) - Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator). Closes [#​10236](pylint-dev/pylint#10236) - `pyreverse`: add support for colorized output when using output format `mmd` (MermaidJS) and `html`. Closes [#​10242](pylint-dev/pylint#10242) - pypy 3.11 is now officially supported. Refs [#​10287](pylint-dev/pylint#10287) - Add support for Python 3.14. Refs [#​10467](pylint-dev/pylint#10467) - Add naming styles for `ParamSpec` and `TypeVarTuple` that align with the `TypeVar` style. Refs [#​10541](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10061) - Fix :ref:`no-name-in-module` for members of `concurrent.futures` with Python 3.14. Closes [#​10632](pylint-dev/pylint#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](pylint-dev/pylint#8893) - Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly. Refs [#​9667](pylint-dev/pylint#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](pylint-dev/pylint#9770) - Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore. Closes [#​9894](pylint-dev/pylint#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](pylint-dev/pylint#9999) - Fix false negative for `used-before-assignment` when a function is defined inside a `TYPE_CHECKING` guard block and used later. Closes [#​10028](pylint-dev/pylint#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](pylint-dev/pylint#10421) - Fix false negative for `deprecated-module` when a `__import__` method is used instead of `import` sentence. Refs [#​10453](pylint-dev/pylint#10453) - Count match cases for `too-many-branches` check. Refs [#​10542](pylint-dev/pylint#10542) - Fix false-negative where :ref:`unused-import` was not reported for names referenced in a preceding `global` statement. Refs [#​10633](pylint-dev/pylint#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](pylint-dev/pylint#8736) - Fixed unidiomatic-typecheck only checking left-hand side. Closes [#​10217](pylint-dev/pylint#10217) - Fix a crash caused by malformed format strings when using `.format` with keyword arguments. Closes [#​10282](pylint-dev/pylint#10282) - Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions. Closes [#​10508](pylint-dev/pylint#10508) - Fix a crash in :ref:`nested-min-max` when using `builtins.min` or `builtins.max` instead of `min` or `max` directly. Closes [#​10626](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10405) ## Internal Changes - Modified test framework to allow for different test output for different Python versions. Refs [#​10382](pylint-dev/pylint#10382) ### [`v3.3.9`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.9) [Compare Source](pylint-dev/pylint@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 [#​9815](pylint-dev/pylint#9815) - No longer flag undeprecated functions in `importlib.resources` as deprecated. Closes [#​10593](pylint-dev/pylint#10593) - Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions. Closes [#​10508](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10510) ### [`v3.3.8`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.8) [Compare Source](pylint-dev/pylint@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: [#​10482 (comment)](pylint-dev/pylint#10482 (comment)) ## False Positives Fixed - Fix false positives for `possibly-used-before-assignment` when variables are exhaustively assigned within a `match` block. Closes [#​9668](pylint-dev/pylint#9668) - Fix false positive for `missing-raises-doc` and `missing-yield-doc` when the method length is less than docstring-min-length. Refs [#​10104](pylint-dev/pylint#10104) - Fix a false positive for `unused-variable` when multiple except handlers bind the same name under a try block. Closes [#​10426](pylint-dev/pylint#10426) ## False Negatives Fixed - Fix false-negative for `used-before-assignment` with `from __future__ import annotations` in function definitions. Refs [#​10482](pylint-dev/pylint#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](pylint-dev/pylint#10373) - Fix double underscores erroneously rendering as bold in pyreverse's Mermaid output. Closes [#​10402](pylint-dev/pylint#10402) ### [`v3.3.7`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.7) [Compare Source](pylint-dev/pylint@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 [#​10161](pylint-dev/pylint#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](pylint-dev/pylint#10105) - Fix a crash caused by malformed format strings when using `.format` with keyword arguments. Closes [#​10282](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10277) ### [`v3.3.6`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.6) [Compare Source](pylint-dev/pylint@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 [#​9391](pylint-dev/pylint#9391) ### [`v3.3.5`](https://github.com/pylint-dev/pylint/releases/tag/v3.3.5) [Compare Source](pylint-dev/pylint@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 [#​10065](pylint-dev/pylint#10065) - Fix a false positive for `invalid-getnewargs-ex-returned` when the tuple or dict has been assigned to a name. Closes [#​10208](pylint-dev/pylint#10208) - Remove `getopt` and `optparse` from the list of deprecated modules. Closes [#​10211](pylint-dev/pylint#10211) ## Other Bug Fixes - Fixed conditional import x.y causing false positive possibly-used-before-assignment. Closes [#​10081](pylint-dev/pylint#10081) - Fix a crash when something besides a class is found in an except handler. Closes [#​10106](pylint-dev/pylint#10106) - Fixed raising invalid-name when using camelCase for private methods with two leading underscores. Closes [#​10189](pylint-dev/pylint#10189) ## Other Changes - Upload release assets to PyPI via Trusted Publishing. Closes [#​10256](pylint-dev/pylint#10256) </details> --- ### 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 is behind base branch, 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 [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDYuMCIsInVwZGF0ZWRJblZlciI6IjQxLjE0Ni4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJsaW50aW5nIl19--> Reviewed-on: https://git.tainton.uk/repos/PwnedPW/pulls/302 Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk> Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
This MR contains the following updates: | Package | Type | Update | Change | OpenSSF | |---|---|---|---|---| | [pylint](https://github.com/pylint-dev/pylint) ([changelog](https://pylint.readthedocs.io/en/latest/whatsnew/3/)) | dev | major | `^3.2.0` → `^4.0.0` | [](https://securityscorecards.dev/viewer/?uri=github.com/pylint-dev/pylint) | --- ### Release Notes <details> <summary>pylint-dev/pylint (pylint)</summary> ### [`v4.0.4`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.4) [Compare Source](pylint-dev/pylint@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 [#​10719](pylint-dev/pylint#10719) - Fix a false positive for `invalid-name` on an UPPER\_CASED name inside an `if` branch that assigns an object. Closes [#​10745](pylint-dev/pylint#10745) ### [`v4.0.3`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.3) [Compare Source](pylint-dev/pylint@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 [#​10435](pylint-dev/pylint#10435) - Fixed false positive for `invalid-name` with `typing.Annotated`. Closes [#​10696](pylint-dev/pylint#10696) - Fix false positive for `f-string-without-interpolation` with template strings when using format spec. Closes [#​10702](pylint-dev/pylint#10702) - Fix a false positive when an UPPER\_CASED class attribute was raising an `invalid-name` when typed with `Final`. Closes [#​10711](pylint-dev/pylint#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](pylint-dev/pylint#10721) ## Other Bug Fixes - Make 'ignore' option work as expected again. Closes [#​10669](pylint-dev/pylint#10669) - Fix crash for `consider-using-assignment-expr` when a variable annotation without assignment is used as the `if` test expression. Closes [#​10707](pylint-dev/pylint#10707) - Fix crash for `prefer-typing-namedtuple` and `consider-math-not-float` when a `slice` object is called. Closes [#​10708](pylint-dev/pylint#10708) ### [`v4.0.2`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.2) [Compare Source](pylint-dev/pylint@v4.0.1...v4.0.2) ## False Positives Fixed - Fix false positive for `invalid-name` on a partially uninferable module-level constant. Closes [#​10652](pylint-dev/pylint#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](pylint-dev/pylint#10664) - Fix false positive for `invalid-name` for `TypedDict` instances. Closes [#​10672](pylint-dev/pylint#10672) ### [`v4.0.1`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.1) [Compare Source](pylint-dev/pylint@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 [#​10019](pylint-dev/pylint#10019) - Fix false-positive for `bare-name-capture-pattern` if a case guard is used. Closes [#​10647](pylint-dev/pylint#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](pylint-dev/pylint#10660) ### [`v4.0.0`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.0) [Compare Source](pylint-dev/pylint@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 [@​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 [#​3585](pylint-dev/pylint#3585) - The unused `pylintrc` argument to `PyLinter.__init__()` is deprecated and will be removed. Refs [#​6052](pylint-dev/pylint#6052) - Commented out code blocks such as `# bar() # TODO: remove dead code` will no longer emit `fixme`. Refs [#​9255](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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 [#​10480](pylint-dev/pylint#10480) - Removed support for `nmp.NaN` alias for `numpy.NaN` being recognized in ':ref:`nan-comparison`'. Use `np` or `numpy` instead. Refs [#​10583](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9045) Closes [#​9267](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9898) - Enhanced support for [@​property](https://github.com/property) decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams. Closes [#​10057](pylint-dev/pylint#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](pylint-dev/pylint#10077) - Handle deferred evaluation of annotations in Python 3.14. Closes [#​10149](pylint-dev/pylint#10149) - Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator). Closes [#​10236](pylint-dev/pylint#10236) - `pyreverse`: add support for colorized output when using output format `mmd` (MermaidJS) and `html`. Closes [#​10242](pylint-dev/pylint#10242) - pypy 3.11 is now officially supported. Refs [#​10287](pylint-dev/pylint#10287) - Add support for Python 3.14. Refs [#​10467](pylint-dev/pylint#10467) - Add naming styles for `ParamSpec` and `TypeVarTuple` that align with the `TypeVar` style. Refs [#​10541](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10061) - Fix :ref:`no-name-in-module` for members of `concurrent.futures` with Python 3.14. Closes [#​10632](pylint-dev/pylint#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](pylint-dev/pylint#8893) - Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly. Refs [#​9667](pylint-dev/pylint#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](pylint-dev/pylint#9770) - Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore. Closes [#​9894](pylint-dev/pylint#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](pylint-dev/pylint#9999) - Fix false negative for `used-before-assignment` when a function is defined inside a `TYPE_CHECKING` guard block and used later. Closes [#​10028](pylint-dev/pylint#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](pylint-dev/pylint#10421) - Fix false negative for `deprecated-module` when a `__import__` method is used instead of `import` sentence. Refs [#​10453](pylint-dev/pylint#10453) - Count match cases for `too-many-branches` check. Refs [#​10542](pylint-dev/pylint#10542) - Fix false-negative where :ref:`unused-import` was not reported for names referenced in a preceding `global` statement. Refs [#​10633](pylint-dev/pylint#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](pylint-dev/pylint#8736) - Fixed unidiomatic-typecheck only checking left-hand side. Closes [#​10217](pylint-dev/pylint#10217) - Fix a crash caused by malformed format strings when using `.format` with keyword arguments. Closes [#​10282](pylint-dev/pylint#10282) - Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions. Closes [#​10508](pylint-dev/pylint#10508) - Fix a crash in :ref:`nested-min-max` when using `builtins.min` or `builtins.max` instead of `min` or `max` directly. Closes [#​10626](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10405) ## Internal Changes - Modified test framework to allow for different test output for different Python versions. Refs [#​10382](pylint-dev/pylint#10382) </details> --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNS43IiwidXBkYXRlZEluVmVyIjoiNDMuMjUuOSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=--> See merge request swiss-armed-forces/cyber-command/cea/loom!315 Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com> Co-authored-by: shrewd-laidback palace <shrewd-laidback-palace-736-c41-2c1-e464fc974@swiss-armed-forces-open-source.ch>
chore(deps): update pylint (major) This MR contains the following updates: | Package | Type | Update | Change | OpenSSF | |---|---|---|---|---| | [pylint](https://github.com/pylint-dev/pylint) ([changelog](https://pylint.readthedocs.io/en/latest/whatsnew/3/)) | dev | major | `^3.2.0` → `^4.0.0` | [](https://securityscorecards.dev/viewer/?uri=github.com/pylint-dev/pylint) | --- ### Release Notes <details> <summary>pylint-dev/pylint (pylint)</summary> ### [`v4.0.4`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.4) [Compare Source](pylint-dev/pylint@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 [#​10719](pylint-dev/pylint#10719) - Fix a false positive for `invalid-name` on an UPPER\_CASED name inside an `if` branch that assigns an object. Closes [#​10745](pylint-dev/pylint#10745) ### [`v4.0.3`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.3) [Compare Source](pylint-dev/pylint@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 [#​10435](pylint-dev/pylint#10435) - Fixed false positive for `invalid-name` with `typing.Annotated`. Closes [#​10696](pylint-dev/pylint#10696) - Fix false positive for `f-string-without-interpolation` with template strings when using format spec. Closes [#​10702](pylint-dev/pylint#10702) - Fix a false positive when an UPPER\_CASED class attribute was raising an `invalid-name` when typed with `Final`. Closes [#​10711](pylint-dev/pylint#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](pylint-dev/pylint#10721) ## Other Bug Fixes - Make 'ignore' option work as expected again. Closes [#​10669](pylint-dev/pylint#10669) - Fix crash for `consider-using-assignment-expr` when a variable annotation without assignment is used as the `if` test expression. Closes [#​10707](pylint-dev/pylint#10707) - Fix crash for `prefer-typing-namedtuple` and `consider-math-not-float` when a `slice` object is called. Closes [#​10708](pylint-dev/pylint#10708) ### [`v4.0.2`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.2) [Compare Source](pylint-dev/pylint@v4.0.1...v4.0.2) ## False Positives Fixed - Fix false positive for `invalid-name` on a partially uninferable module-level constant. Closes [#​10652](pylint-dev/pylint#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](pylint-dev/pylint#10664) - Fix false positive for `invalid-name` for `TypedDict` instances. Closes [#​10672](pylint-dev/pylint#10672) ### [`v4.0.1`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.1) [Compare Source](pylint-dev/pylint@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 [#​10019](pylint-dev/pylint#10019) - Fix false-positive for `bare-name-capture-pattern` if a case guard is used. Closes [#​10647](pylint-dev/pylint#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](pylint-dev/pylint#10660) ### [`v4.0.0`](https://github.com/pylint-dev/pylint/releases/tag/v4.0.0) [Compare Source](pylint-dev/pylint@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 [@​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 [#​3585](pylint-dev/pylint#3585) - The unused `pylintrc` argument to `PyLinter.__init__()` is deprecated and will be removed. Refs [#​6052](pylint-dev/pylint#6052) - Commented out code blocks such as `# bar() # TODO: remove dead code` will no longer emit `fixme`. Refs [#​9255](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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 [#​10480](pylint-dev/pylint#10480) - Removed support for `nmp.NaN` alias for `numpy.NaN` being recognized in ':ref:`nan-comparison`'. Use `np` or `numpy` instead. Refs [#​10583](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9045) Closes [#​9267](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#9898) - Enhanced support for [@​property](https://github.com/property) decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams. Closes [#​10057](pylint-dev/pylint#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](pylint-dev/pylint#10077) - Handle deferred evaluation of annotations in Python 3.14. Closes [#​10149](pylint-dev/pylint#10149) - Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator). Closes [#​10236](pylint-dev/pylint#10236) - `pyreverse`: add support for colorized output when using output format `mmd` (MermaidJS) and `html`. Closes [#​10242](pylint-dev/pylint#10242) - pypy 3.11 is now officially supported. Refs [#​10287](pylint-dev/pylint#10287) - Add support for Python 3.14. Refs [#​10467](pylint-dev/pylint#10467) - Add naming styles for `ParamSpec` and `TypeVarTuple` that align with the `TypeVar` style. Refs [#​10541](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10061) - Fix :ref:`no-name-in-module` for members of `concurrent.futures` with Python 3.14. Closes [#​10632](pylint-dev/pylint#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](pylint-dev/pylint#8893) - Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly. Refs [#​9667](pylint-dev/pylint#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](pylint-dev/pylint#9770) - Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore. Closes [#​9894](pylint-dev/pylint#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](pylint-dev/pylint#9999) - Fix false negative for `used-before-assignment` when a function is defined inside a `TYPE_CHECKING` guard block and used later. Closes [#​10028](pylint-dev/pylint#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](pylint-dev/pylint#10421) - Fix false negative for `deprecated-module` when a `__import__` method is used instead of `import` sentence. Refs [#​10453](pylint-dev/pylint#10453) - Count match cases for `too-many-branches` check. Refs [#​10542](pylint-dev/pylint#10542) - Fix false-negative where :ref:`unused-import` was not reported for names referenced in a preceding `global` statement. Refs [#​10633](pylint-dev/pylint#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](pylint-dev/pylint#8736) - Fixed unidiomatic-typecheck only checking left-hand side. Closes [#​10217](pylint-dev/pylint#10217) - Fix a crash caused by malformed format strings when using `.format` with keyword arguments. Closes [#​10282](pylint-dev/pylint#10282) - Fix false positive `inconsistent-return-statements` when using `quit()` or `exit()` functions. Closes [#​10508](pylint-dev/pylint#10508) - Fix a crash in :ref:`nested-min-max` when using `builtins.min` or `builtins.max` instead of `min` or `max` directly. Closes [#​10626](pylint-dev/pylint#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](pylint-dev/pylint#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](pylint-dev/pylint#10405) ## Internal Changes - Modified test framework to allow for different test output for different Python versions. Refs [#​10382](pylint-dev/pylint#10382) </details> --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNS43IiwidXBkYXRlZEluVmVyIjoiNDMuMjUuOSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=--> See merge request swiss-armed-forces/cyber-command/cea/loom!315 Co-authored-by: Loom MR Pipeline Trigger <group_103951964_bot_9504bb8dead6d4e406ad817a607f24be@noreply.gitlab.com> Co-authored-by: open-source Pipeline <group_90701827_bot_ed04ae348bc5f40af9966fb8b6867e99@noreply.gitlab.com>
Description
Followup to #10559
Add additional checks for match class patterns.
match-class-bind-selfmatch-class-positional-attributes