pdm-bump
pdm-bump copied to clipboard
chore(deps): Update dependency pylint to v4 Automatically created by mend renovate bot.
This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| pylint (changelog) | >=3.3.9 -> >=4.0.3 |
Release Notes
pylint-dev/pylint (pylint)
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
-
Fixed false positive for
invalid-namewithtyping.Annotated.Closes #10696
-
Fix false positive for
f-string-without-interpolationwith template strings when using format spec.Closes #10702
-
Fix a false positive when an UPPER_CASED class attribute was raising an
invalid-namewhen typed withFinal.Closes #10711
-
Fix a false positive for
unbalanced-tuple-unpackingwhen a tuple is assigned to a function call and the structure of the function's return value is ambiguous.Closes #10721
Other Bug Fixes
-
Make 'ignore' option work as expected again.
Closes #10669
-
Fix crash for
consider-using-assignment-exprwhen a variable annotation without assignment is used as theiftest expression.Closes #10707
-
Fix crash for
prefer-typing-namedtupleandconsider-math-not-floatwhen asliceobject is called.Closes #10708
v4.0.2
False Positives Fixed
-
Fix false positive for
invalid-nameon a partially uninferable module-level constant.Closes #10652
-
Fix a false positive for
invalid-nameon exclusive module-level assignments composed of three or more branches. We won't raisedisallowed-nameon module-level names that can't be inferred until a further refactor to remove this false negative is done.Closes #10664
-
Fix false positive for
invalid-nameforTypedDictinstances.Closes #10672
v4.0.1
What's new in Pylint 4.0.1?
Release date: 2025-10-14
False Positives Fixed
-
Exclude
__all__and__future__.annotationsfromunused-variable.Closes #10019
-
Fix false-positive for
bare-name-capture-patternif a case guard is used.Closes #10647
-
Check enums created with the
Enum()functional syntax to pass against the--class-rgxfor theinvalid-namecheck, like other enums.Closes #10660
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!)
Consider this example:
class Result:
errors: dict | None = None
result = Result()
if result.errors:
result.errors[field_key]
##### inference engine understands result.errors cannot be None
##### pylint no longer raises unsubscriptable-object
The required astroid version is now 4.0.0. See the astroid changelog for additional fixes, features, and performance improvements applicable to pylint.
- Handling of
invalid-nameat the module level was patchy. Now, module-level constants that are reassigned are treated as variables and checked against--variable-rgxrather than--const-rgx. Module-level lists, sets, and objects can pass against either regex.
Here, LIMIT is reassigned, so pylint only uses --variable-rgx:
LIMIT = 500 # [invalid-name]
if sometimes:
LIMIT = 1 # [invalid-name]
If this is undesired, refactor using exclusive assignment so that it is evident that this assignment happens only once:
if sometimes:
LIMIT = 1
else:
LIMIT = 500 # exclusive assignment: uses const regex, no warning
Lists, sets, and objects still pass against either const-rgx or variable-rgx
even if reassigned, but are no longer completely skipped:
MY_LIST = []
my_list = []
My_List = [] # [invalid-name]
Remember to adjust the regexes and allow lists to your liking.
Breaking Changes
-
invalid-namenow distinguishes module-level constants that are assigned only once from those that are reassigned and now applies--variable-rgxto 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-namesor--good-names-rgxscan be provided to explicitly allow good names.Closes #3585
-
The unused
pylintrcargument toPyLinter.__init__()is deprecated and will be removed.Refs #6052
-
Commented out code blocks such as
# bar() # TODO: remove dead codewill no longer emitfixme.Refs #9255
-
pyreverseRunwas changed to no longer callsys.exit()in its__init__. You should now callRun(args).run()which will return the exit code instead. Having a class that always raised aSystemExitexception was considered a bug.Normal usage of pyreverse through the CLI will not be affected by this change.
Refs #9689
-
The
suggestion-modeoption was removed, as pylint now always emits user-friendly hints instead of false-positive error messages. You should remove it from your conf if it's defined.Refs #9962
-
The
async.pychecker module has been renamed toasync_checker.pysinceasyncis a Python keyword and cannot be imported directly. This allows for better testing and extensibility of the async checker functionality.Refs #10071
-
The message-id of
continue-in-finallywas changed fromE0116toW0136. The warning is now emitted for every Python version since it will raise a syntax warning in Python 3.14. See PEP 765 - Disallow return/break/continue that exit a finally block.Refs #10480
-
Removed support for
nmp.NaNalias fornumpy.NaNbeing recognized in ':ref:nan-comparison'. Usenpornumpyinstead.Refs #10583
-
Version requirement for
isorthas been bumped to >=5.0.0. The internal compatibility for olderisortversions exposed viapylint.utils.IsortDriverhas been removed.Refs #10637
New Features
-
comparison-of-constantsnow uses the unicode from the ast instead of reformatting from the node's values preventing some bad formatting due toutf-8limitation. The message now uses"instead of'to better work with what the python ast returns.Refs #8736
-
Enhanced pyreverse to properly distinguish between UML relationship types (association, aggregation, composition) based on object ownership semantics. Type annotations without assignment are now treated as associations, parameter assignments as aggregations, and object instantiation as compositions.
-
The
fixmecheck can now search through docstrings as well as comments, by usingcheck-fixme-in-docstring = truein the[tool.pylint.miscellaneous]section.Closes #9255
-
The
use-implicit-booleaness-not-xchecks now distinguish between comparisons used in boolean contexts and those that are not, enabling them to provide more accurate refactoring suggestions.Closes #9353
-
The verbose option now outputs the filenames of the files that have been checked. Previously, it only included the number of checked and skipped files.
Closes #9357
-
colorized reporter now colorizes messages/categories that have been configured as
fail-onin red inverse. This makes it easier to quickly find the errors that are causing pylint CI job failures.Closes #9898
-
Enhanced support for @property decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams.
Closes #10057
-
Add --max-depth option to pyreverse to control diagram complexity. A depth of 0 shows only top-level packages, 1 shows one level of subpackages, etc. This helps manage visualization of large codebases by limiting the depth of displayed packages and classes.
Refs #10077
-
Handle deferred evaluation of annotations in Python 3.14.
Closes #10149
-
Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator).
Closes #10236
-
pyreverse: add support for colorized output when using output formatmmd(MermaidJS) andhtml.Closes #10242
-
pypy 3.11 is now officially supported.
Refs #10287
-
Add support for Python 3.14.
Refs #10467
-
Add naming styles for
ParamSpecandTypeVarTuplethat align with theTypeVarstyle.Refs #10541
New Checks
-
Add
match-statementschecker and the following message:bare-name-capture-pattern. This will emit an error message when a name capture pattern is used in a match statement which would make the remaining patterns unreachable. This code is a SyntaxError at runtime.Closes #7128
-
Add new check
async-context-manager-with-regular-withto detect async context managers used with regularwithstatements instead ofasync with.Refs #10408
-
Add
break-in-finallywarning. Usingbreakinside thefinallyclause will raise a syntax warning in Python 3.14. SeePEP 765 - Disallow return/break/continue that exit a finally block <https://peps.python.org/pep-0765/>_.Refs #10480
-
Add new checks for invalid uses of class patterns in :keyword:
match.- :ref:
invalid-match-args-definitionis emitted if :py:data:object.__match_args__isn't a tuple of strings. - :ref:
too-many-positional-sub-patternsif there are more positional sub-patterns than specified in :py:data:object.__match_args__. - :ref:
multiple-class-sub-patternsif there are multiple sub-patterns for the same attribute.
Refs #10559
- :ref:
-
Add additional checks for suboptimal uses of class patterns in :keyword:
match.- :ref:
match-class-bind-selfis emitted if a name is bound toselfinstead of using anaspattern. - :ref:
match-class-positional-attributesis emitted if a class pattern has positional attributes when keywords could be used.
Refs #10587
- :ref:
-
Add a
consider-math-not-floatmessage.float("nan")andfloat("inf")are slower than their counterpartmath.infandmath.nanby 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_styleneed to be activated for this check to work.Refs #10621
False Positives Fixed
-
Fix a false positive for
used-before-assignmentwhen a variable defined under anifand via a named expression (walrus operator) is used later when guarded under the sameiftest.Closes #10061
-
Fix :ref:
no-name-in-modulefor members ofconcurrent.futureswith Python 3.14.Closes #10632
False Negatives Fixed
-
Fix false negative for
used-before-assignmentwhen aTYPE_CHECKINGimport is used as a type annotation prior to erroneous usage.Refs #8893
-
Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly.
Refs #9667
-
Check module-level constants with type annotations for
invalid-name. Remember to adjustconst-naming-styleorconst-rgxto your liking.Closes #9770
-
Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore.
Closes #9894
-
We now raise a
logging-too-few-argsfor format string with no interpolation arguments at all (i.e. for something likelogging.debug("Awaiting process %s")orlogging.debug("Awaiting process {pid}")). Previously we did not raise for such case.Closes #9999
-
Fix false negative for
used-before-assignmentwhen a function is defined inside aTYPE_CHECKINGguard block and used later.Closes #10028
-
Fix a false negative for
possibly-used-before-assignmentwhen a variable is conditionally defined and later assigned to a type-annotated variable.Closes #10421
-
Fix false negative for
deprecated-modulewhen a__import__method is used instead ofimportsentence.Refs #10453
-
Count match cases for
too-many-branchescheck.Refs #10542
-
Fix false-negative where :ref:
unused-importwas not reported for names referenced in a precedingglobalstatement.Refs #10633
Other Bug Fixes
-
When displaying unicode with surrogates (or other potential
UnicodeEncodeError), pylint will now display a '?' character (usingencode(encoding="utf-8", errors="replace")) instead of crashing. The functional tests classes are also updated to handle this case.Closes #8736
-
Fixed unidiomatic-typecheck only checking left-hand side.
Closes #10217
-
Fix a crash caused by malformed format strings when using
.formatwith keyword arguments.Closes #10282
-
Fix false positive
inconsistent-return-statementswhen usingquit()orexit()functions.Closes #10508
-
Fix a crash in :ref:
nested-min-maxwhen usingbuiltins.minorbuiltins.maxinstead ofminormaxdirectly.Closes #10626
-
Fixed a crash in :ref:
unnecessary-dict-index-lookupwhen the index of an enumerated list was deleted inside a for loop.Closes #10627
Other Changes
-
Remove support for launching pylint with Python 3.9. Code that supports Python 3.9 can still be linted with the
--py-version=3.9setting.Refs #10405
Internal Changes
-
Modified test framework to allow for different test output for different Python versions.
Refs #10382
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Enabled.
♻ 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.
- [ ] If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
⚠️ Artifact update problem
Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is.
♻ Renovate will retry this branch, including artifacts, only when one of the following happens:
- any of the package files in this branch needs updating, or
- the branch becomes conflicted, or
- you click the rebase/retry checkbox if found above, or
- you rename this PR's title to start with "rebase!" to trigger it manually
The artifact failure details are included below:
File name: pdm.lock
Command failed: pdm update --no-sync --update-eager -dG checkstyle pylint
/opt/containerbase/tools/pdm/2.26.2/3.14.0/lib/python3.14/site-packages/pdm/resolver/providers.py:195: PackageWarning: Skipping [email protected] because it requires Python>=3.10.0 but the lock targets to work with Python>=3.9. Instead, another version of pylint that supports Python>=3.9 will be used.
If you want to install [email protected], narrow down the `requires-python` range to include this version. For example, ">=3.10.0" should work.
found = self.repository.find_candidates(
/opt/containerbase/tools/pdm/2.26.2/3.14.0/lib/python3.14/site-packages/pdm/resolver/providers.py:195: PackageWarning: Skipping [email protected] because it requires Python>=3.10.0 but the lock targets to work with Python>=3.9. Instead, another version of astroid that supports Python>=3.9 will be used.
If you want to install [email protected], narrow down the `requires-python` range to include this version. For example, ">=3.10.0" should work.
found = self.repository.find_candidates(
/opt/containerbase/tools/pdm/2.26.2/3.14.0/lib/python3.14/site-packages/pdm/resolver/providers.py:195: PackageWarning: Skipping [email protected] because it requires Python>=3.10.0 but the lock targets to work with Python>=3.9. Instead, another version of isort that supports Python>=3.9 will be used.
If you want to install [email protected], narrow down the `requires-python` range to include this version. For example, ">=3.10.0" should work.
found = self.repository.find_candidates(
/opt/containerbase/tools/pdm/2.26.2/3.14.0/lib/python3.14/site-packages/pdm/resolver/providers.py:195: PackageWarning: Skipping [email protected] because it requires Python>=3.10 but the lock targets to work with Python>=3.9. Instead, another version of platformdirs that supports Python>=3.9 will be used.
If you want to install [email protected], narrow down the `requires-python` range to include this version. For example, ">=3.10" should work.
found = self.repository.find_candidates(
ERROR: Unable to find a resolution because the following dependencies don't work on all Python versions in the range of the project's `requires-python`: >=3.9.
python>=3.10.0 (from <Candidate [email protected] from https://pypi.org/simple/pylint/>)
A possible solution is to change the value of `requires-python` in pyproject.toml to >=3.10.0.
See /home/ubuntu/.local/state/pdm/log/pdm-lock-uv082scw.log for detailed debug log.
[ResolutionError]: Unable to find a resolution
WARNING: Add '-v' to see the detailed traceback