-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Release branch for 4.0.0
#10639
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Release branch for 4.0.0
#10639
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #10639 +/- ##
=======================================
Coverage 95.96% 95.96%
=======================================
Files 176 176
Lines 19502 19502
=======================================
Hits 18715 18715
Misses 787 787
🚀 New features to boost your workflow:
|
This comment has been minimized.
This comment has been minimized.
I'm working on some last minute multithreading fixes. It would address #10037 and remove the duplicate messages for dynamic plugins with |
|
Would be nice to merge #10641 as well as it technically contains a breaking change to our API and version constraints. User impact should be minimal though and a net positive as there won't be issues with installing |
08abbec to
d59a815
Compare
Co-authored-by: Jacob Walls <[email protected]>
e8500ef to
3f80100
Compare
|
@Pierre-Sassoulas Could you run pylint/doc/user_guide/checkers/features.rst Lines 691 to 696 in ea25969
|
I just did for 4.1.0-dev0, no changes using python 3.12 / ubuntu 24.04 / the enchant system lib I have currently installed. I have those small changes too when it was generated by someone else though. |
bd7e07d to
8729244
Compare
|
I'm not that good at reading and following the release documentation. (And will need a new approval 😄) |
|
I get these errors: |
@jacobtylerwalls Try removing the docs cache. I just deleted the whole |
The data message directory keeps old generated messages, after a |
|
🤖 According to the primer, this change has no effect on the checked open source code. 🤖🎉 This comment was generated for commit 8729244 |
|
It's done : https://pypi.org/project/pylint/4.0.0/ 🎉 ! Congratulation everyone involved ! |
Thanks @Pierre-Sassoulas for doing the actual release 🚀 |
What's new in Pylint 4.0.0?
Release date: 2025-10-12
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:
The required
astroidversion is now 4.0.0. See the astroid changelog for additional fixes, features, and performance improvements applicable to pylint.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,
LIMITis reassigned, so pylint only uses--variable-rgx:If this is undesired, refactor using exclusive assignment so that it is
evident that this assignment happens only once:
Lists, sets, and objects still pass against either
const-rgxorvariable-rgxeven if reassigned, but are no longer completely skipped:
Remember to adjust the regexes and allow lists to your liking.
Breaking Changes
invalid-namenow distinguishes module-level constants that are assigned only oncefrom those that are reassigned and now applies
--variable-rgxto the latter. Valuesother 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 explicitlyallow good names.
Closes Make
invalid-namedistinguish between module constants and module variables #3585The unused
pylintrcargument toPyLinter.__init__()is deprecatedand will be removed.
Refs Some refactors of configuration file discovery #6052
Commented out code blocks such as
# bar() # TODO: remove dead codewill no longer emitfixme.Refs W0511: Doesn't detect TODO in docstrings #9255
pyreverseRunwas changed to no longer callsys.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
SystemExitexception was considered a bug.Normal usage of pyreverse through the CLI will not be affected by this change.
Refs False positive E0601: used-before-assignment in try and while block #9689
The
suggestion-modeoption was removed, as pylint now always emits user-friendly hints insteadof false-positive error messages. You should remove it from your conf if it's defined.
Refs Always use the suggestion mode for
no-member/c-extension-no-member#9962The
async.pychecker module has been renamed toasync_checker.pysinceasyncis a Python keywordand cannot be imported directly. This allows for better testing and extensibility of the async checker functionality.
Refs Checker
async.pycouldn't be imported anywhere because it uses reserved word. #10071The message-id of
continue-in-finallywas changed fromE0116toW0136. The warning isnow 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 Update checks for PEP 765 - return/break/continue in finally block #10480
Removed support for
nmp.NaNalias fornumpy.NaNbeing recognized in ':ref:nan-comparison'. Usenpornumpyinstead.Refs Remove support for nmp as import alias for numpy #10583
Version requirement for
isorthas been bumped to >=5.0.0.The internal compatibility for older
isortversions exposed viapylint.utils.IsortDriverhasbeen removed.
Refs Removal of mandatory isort dependency for import position check #10637
New Features
comparison-of-constantsnow uses the unicode from the ast instead of reformatting fromthe node's values preventing some bad formatting due to
utf-8limitation. The message now uses"instead of'to better work with what the python ast returns.Refs Pylint crashes with "'\U00010000' == '\ud800\udc00'" #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 Pyreverse: composition / aggregation arrow strange behavior (and field annotation bug) #9045
Closes Pyreverse: Duplicate arrows when class attribute is assigned more than once #9267
The
fixmecheck can now search through docstrings as well as comments, by usingcheck-fixme-in-docstring = truein the[tool.pylint.miscellaneous]section.Closes W0511: Doesn't detect TODO in docstrings #9255
The
use-implicit-booleaness-not-xchecks now distinguish between comparisonsused in boolean contexts and those that are not, enabling them to provide more accurate refactoring suggestions.
Closes Suggested change for
use-implicit-booleaness-not-comparisondoesn't seem right #9353The 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 Print the filepaths of checked files when the verbose option is activated #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 Dynamic color mapping for "fail-on" messages/categories in ColorizedTextReporter #9898
Enhanced support for @Property decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams.
Closes Enhanced support for @Property decorator in pyreverse #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 Add --max-depth option to control diagram complexity #10077
Handle deferred evaluation of annotations in Python 3.14.
Closes 3.14 annotation evaluation is deferred #10149
Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator).
Closes Composition not detected correctly in list comprehension #10236
pyreverse: add support for colorized output when using output formatmmd(MermaidJS) andhtml.Closes pyreverse: colored classes and packages in HTML generated diagrams #10242
pypy 3.11 is now officially supported.
Refs GH Actions: Add pypy3.11 to testing matrix #10287
Add support for Python 3.14.
Refs Add support for Python 3.14 #10467
Add naming styles for
ParamSpecandTypeVarTuplethat align with theTypeVarstyle.Refs Add naming styles for ParamSpec and TypeVarTuple #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 Check for name capture syntax errors #7128
Add new check
async-context-manager-with-regular-withto detect async context managers used with regularwithstatements instead ofasync with.Refs False Context manager 'async_generator' doesn't implement __enter__ and __exit__ #10408
Add
break-in-finallywarning. Usingbreakinside thefinallyclausewill 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 Update checks for PEP 765 - return/break/continue in finally block #10480
Add new checks for invalid uses of class patterns in :keyword:
match.invalid-match-args-definitionis emitted if :py:data:object.__match_args__isn't a tuple of strings.too-many-positional-sub-patternsif there are more positional sub-patterns than specified in :py:data:object.__match_args__.multiple-class-sub-patternsif there are multiple sub-patterns for the same attribute.Refs Add new checks for match class patterns #10559
Add additional checks for suboptimal uses of class patterns in :keyword:
match.match-class-bind-selfis emitted if a name is bound toselfinstead ofusing an
aspattern.match-class-positional-attributesis emitted if a class pattern has positionalattributes when keywords could be used.
Refs
R0903:too-few-public-methodsfor private methods #10586Add a
consider-math-not-floatmessage.float("nan")andfloat("inf")are slowerthan their counterpart
math.infandmath.nanby a factor of 4 (notwithstandingthe 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 [consider-math-not-float] Add a check for
float("inf"),float("nan")andfloat("typos")#10621False Positives Fixed
Fix a false positive for
used-before-assignmentwhen a variable defined underan
ifand via a named expression (walrus operator) is used later when guardedunder the same
iftest.Closes [used-before-assignment] False positive for "same test" exception when test is a walrus operator #10061
Fix :ref:
no-name-in-modulefor members ofconcurrent.futureswith Python 3.14.Closes False positive no-name-in-module for ProcessPoolExecutor in python 3.14 #10632
False Negatives Fixed
Fix false negative for
used-before-assignmentwhen aTYPE_CHECKINGimport is used as a type annotation prior to erroneous usage.Refs false negative: used-before-assignment w/ TYPE_CHECKING guard #8893
Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly.
Refs [mccabe - too-complex] Add each match case as an edge in the graph #9667
Check module-level constants with type annotations for
invalid-name.Remember to adjust
const-naming-styleorconst-rgxto your liking.Closes Annotated module level constant not checked for
invalid-name#9770Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore.
Closes False Negative function-redefined when function named with leading underscore #9894
We now raise a
logging-too-few-argsfor format string with nointerpolation 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 Detect missing arguments in logging format strings #9999
Fix false negative for
used-before-assignmentwhen a function is defined inside aTYPE_CHECKINGguard block and used later.Closes [used-before-assignment] Functions defined in type-checking guard not flagged when used later #10028
Fix a false negative for
possibly-used-before-assignmentwhen a variable is conditionally definedand later assigned to a type-annotated variable.
Closes False negative:
possibly-used-before-assignmentwith type annotation after assignment in conditional/loop #10421Fix false negative for
deprecated-modulewhen a__import__method is used instead ofimportsentence.Refs False negative for
deprecated-modulewhen a__import__method is used instead ofimportsentence. #10453Count match cases for
too-many-branchescheck.Refs Count match cases for too-many-branches #10542
Fix false-negative where :ref:
unused-importwas not reported for names referenced in a precedingglobalstatement.Refs Update astroid to 4.0.1 #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 Pylint crashes with "'\U00010000' == '\ud800\udc00'" #8736
Fixed unidiomatic-typecheck only checking left-hand side.
Closes unidiomatic-typecheck only checks left-hand side #10217
Fix a crash caused by malformed format strings when using
.formatwith keyword arguments.Closes AstroidError when checking against sample bad-format-string code #10282
Fix false positive
inconsistent-return-statementswhen usingquit()orexit()functions.Closes Inconsistent report of inconsistent-return-statements when using exit / quit #10508
Fix a crash in :ref:
nested-min-maxwhen usingbuiltins.minorbuiltins.maxinstead of
minormaxdirectly.Closes AttributeError: 'Attribute' object has no attribute 'name' in nested-min-max checker #10626
Fixed a crash in :ref:
unnecessary-dict-index-lookupwhen the index of an enumerated listwas deleted inside a for loop.
Closes IndexError: list index out of range in unnecessary-list-index-lookup checker #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 Drop support for Python 3.9 #10405
Internal Changes
Modified test framework to allow for different test output for different Python versions.
Refs Allow different test output for different Python versions #10382