chore(deps): update dependency pylint to v4
This MR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| pylint (changelog) |
==2.3.1 -> ==4.0.4
|
Release Notes
pylint-dev/pylint (pylint)
v4.0.4
What's new in Pylint 4.0.4?
Release date: 2025-11-30
False Positives Fixed
-
Fixed false positive for
invalid-namewhere module-level constants were incorrectly classified as variables when a class-level attribute with the same name exists.Closes #10719
-
Fix a false positive for
invalid-nameon an UPPER_CASED name inside anifbranch that assigns an object.Closes #10745
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
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
-
No longer flag undeprecated functions in
importlib.resourcesas deprecated.Closes #10593
-
Fix false positive
inconsistent-return-statementswhen usingquit()orexit()functions.Closes #10508
-
Fix false positive
undefined-variable(E0602) for for-loop variable shadowing patterns likefor item in item:when the variable was previously defined.Closes #10562
Other Bug Fixes
-
Fixed crash in 'unnecessary-list-index-lookup' when starting an enumeration using minus the length of an iterable inside a dict comprehension when the len call was only made in this dict comprehension, and not elsewhere. Also changed the approach, to use inference in all cases but the simple ones, so we don't have to fix crashes one by one for arbitrarily complex expressions in enumerate.
Closes #10510
v3.3.8
What's new in Pylint 3.3.8?
Release date: 2025-08-09
This patch release includes an exceptional fix for a false negative issue. For details, see: #10482 (comment)
False Positives Fixed
-
Fix false positives for
possibly-used-before-assignmentwhen variables are exhaustively assigned within amatchblock.Closes #9668
-
Fix false positive for
missing-raises-docandmissing-yield-docwhen the method length is less than docstring-min-length.Refs #10104
-
Fix a false positive for
unused-variablewhen multiple except handlers bind the same name under a try block.Closes #10426
False Negatives Fixed
-
Fix false-negative for
used-before-assignmentwithfrom __future__ import annotationsin function definitions.Refs #10482
Other Bug Fixes
-
Fix a bug in Pyreverse where aggregations and associations were included in diagrams regardless of the selected --filter-mode (such as PUB_ONLY, ALL, etc.).
Closes #10373
-
Fix double underscores erroneously rendering as bold in pyreverse's Mermaid output.
Closes #10402
v3.3.7
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 anunidiomatic-typecheckwarning anymore, consistent with the behavior applied only for==previously.Closes #10161
Other Bug Fixes
-
Fixed a crash when importing a class decorator that did not exist with the same name as a class attribute after the class definition.
Closes #10105
-
Fix a crash caused by malformed format strings when using
.formatwith keyword arguments.Closes #10282
-
Using a slice as a class decorator now raises a
not-callablemessage instead of crashing. A lot of checks that dealt with decorators (too many to list) are now shortcut if the decorator can't immediately be inferred to a function or class definition.Closes #10334
Other Changes
-
The algorithm used for
no-membersuggestions is now more efficient and cuts the calculation when the distance score is already above the threshold.Refs #10277
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-assignmentwhen an inner function's return type annotation is a class defined at module scope.Closes #9391
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-stringanduse-implicit-booleaness-not-comparison-to-zerowhen chained comparisons are checked.Closes #10065
-
Fix a false positive for
invalid-getnewargs-ex-returnedwhen the tuple or dict has been assigned to a name.Closes #10208
-
Remove
getoptandoptparsefrom the list of deprecated modules.Closes #10211
Other Bug Fixes
-
Fixed conditional import x.y causing false positive possibly-used-before-assignment.
Closes #10081
-
Fix a crash when something besides a class is found in an except handler.
Closes #10106
-
Fixed raising invalid-name when using camelCase for private methods with two leading underscores.
Closes #10189
Other Changes
-
Upload release assets to PyPI via Trusted Publishing.
Closes #10256
v3.3.4
Other Bug Fixes
-
Fixes "skipped files" count calculation; the previous method was displaying an arbitrary number.
Closes #10073
-
Fixes a crash that occurred when pylint was run in a container on a host with cgroupsv2 and restrictions on CPU usage.
Closes #10103
-
Relaxed the requirements for isort so pylint can benefit from isort 6.
Closes #10203
v3.3.3
What's new in Pylint 3.3.3?
Release date: 2024-12-23
False Positives Fixed
-
Fix false positives for
undefined-variablefor classes using Python 3.12 generic type syntax.Closes #9335
-
Fix a false positive for
use-implicit-booleaness-not-len. No lint should be emitted for generators (lenis not defined for generators).Refs #10100
Other Bug Fixes
-
Fix
Unable to import 'collections.abc' (import-error)on Python 3.13.1.Closes #10112
v3.3.2
False Positives Fixed
-
Fix a false positive for
potential-index-errorwhen an indexed iterable contains a starred element that evaluates to more than one item.Closes #10076
Other Bug Fixes
-
Fixes the issue with --source-root option not working when the source files are in a subdirectory of the source root (e.g. when using a /src layout).
Closes #10026
v3.3.1
What's new in Pylint 3.3.1?
Release date: 2024-09-24
False Positives Fixed
-
Fix regression causing some f-strings to not be inferred as strings.
Closes #9947
v3.3.0
Release date: 2024-09-20
Changes requiring user actions
-
We migrated
symilarto argparse, from getopt, so the error and help output changed (for the better). We exit with 2 instead of sometime 1, sometime 2. The error output is not captured by the runner anymore. It's not possible to use a value for the boolean options anymore (--ignore-comments 1should become--ignore-comments).Refs #9731
New Features
-
Add new
declare-non-sloterror which reports when a class has a__slots__member and a type hint on the class is not present in__slots__.Refs #9499
New Checks
-
Added
too-many-positional-argumentsto allow distinguishing the configuration for too many total arguments (with keyword-only params specified after*) from the configuration for too many positional-or-keyword or positional-only arguments.As part of evaluating whether this check makes sense for your project, ensure you adjust the value of
--max-positional-arguments.Closes #9099
-
Add
using-exception-groups-in-unsupported-versionandusing-generic-type-syntax-in-unsupported-versionfor uses of Python 3.11+ or 3.12+ features on lower supported versions provided with--py-version.Closes #9791
-
Add
using-assignment-expression-in-unsupported-versionfor uses of:=(walrus operator) on Python versions below 3.8 provided with--py-version.Closes #9820
-
Add
using-positional-only-args-in-unsupported-versionfor uses of positional-only args on Python versions below 3.8 provided with--py-version.Closes #9823
-
Add
unnecessary-default-type-argsto thetypingextension to detect the use of unnecessary default type args fortyping.Generatorandtyping.AsyncGenerator.Refs #9938
False Negatives Fixed
-
Fix computation of never-returning function:
Neveris handled in addition toNoReturn, and priority is given to the explicit--never-returning-functionsoption.Closes #7565.
-
Fix a false negative for
await-outside-asyncwhen await is inside Lambda.Refs #9653
-
Fix a false negative for
duplicate-argument-nameby includingpositional-only,*argsand**kwargsarguments in the check.Closes #9669
-
Fix false negative for
multiple-statementswhen multiple statements are present onelseandfinallylines oftry.Refs #9759
-
Fix false negatives when
isinstancedoes not have exactly two arguments. pylint now emits atoo-many-function-argsorno-value-for-parameterappropriately forisinstancecalls.Closes #9847
Other Bug Fixes
-
--enablewith--disable=allnow produces an error, when an unknown msg code is used. Internalpylintmessages are no longer affected by--disable=all.Closes #9403
-
Impossible to compile regexes for paths in the configuration or argument given to pylint won't crash anymore but raise an argparse error and display the error message from
re.compileinstead.Closes #9680
-
Fix a bug where a
tox.inifile with pylint configuration was ignored and it exists in the current directory..cfgand.inifiles containing aPylintconfiguration may now use a section named[pylint]. This enhancement impacts the scenario where these file types are used as defaults when they are present and have not been explicitly referred to, using the--rcfileoption.Closes #9727
-
Improve file discovery for directories that are not python packages.
Closes #9764
Other Changes
-
Remove support for launching pylint with Python 3.8. Code that supports Python 3.8 can still be linted with the
--py-version=3.8setting.Refs #9774
-
Add support for Python 3.13.
Refs #9852
Internal Changes
-
All variables, classes, functions and file names containing the word 'similar', when it was, in fact, referring to 'symilar' (the standalone program for the duplicate-code check) were renamed to 'symilar'.
Closes #9734
-
Remove old-style classes (Python 2) code and remove check for new-style class since everything is new-style in Python 3. Updated doc for exception checker to remove reference to new style class.
Refs #9925
v3.2.7
What's new in Pylint 3.2.7?
Release date: 2024-08-31
False Positives Fixed
-
Fixed a false positive
unreachableforNoReturncoroutine functions.Closes #9840
Other Bug Fixes
-
Fix crash in refactoring checker when calling a lambda bound as a method.
Closes #9865
-
Fix a crash in
undefined-loop-variablewhen providing theiterableargument toenumerate().Closes #9875
-
Fix to address indeterminacy of error message in case a module name is same as another in a separate namespace.
Refs #9883
v3.2.6
What's new in Pylint 3.2.6?
Release date: 2024-07-21
False Positives Fixed
-
Quiet false positives for
unexpected-keyword-argwhen pylint cannot determine which of two or more dynamically defined classes is being instantiated.Closes #9672
-
Fix a false positive for
missing-param-docwhere a method which is decorated withtyping.overloadwas expected to have a docstring specifying its parameters.Closes #9739
-
Fix a regression that raised
invalid-nameon class attributes merely overriding invalid names from an ancestor.Closes #9765
-
Treat
assert_never()the same way when imported fromtyping_extensions.Closes #9780
-
Fix a false positive for
consider-using-min-max-builtinwhen the assignment target is an attribute.Refs #9800
Other Bug Fixes
-
Fix an
AssertionErrorarising from properties that return partial functions.Closes #9214
-
Fix a crash when a subclass extends
__slots__.Closes #9814
v3.2.5
What's new in Pylint 3.2.5 ?
Release date: 2024-06-28
Other Bug Fixes
-
Fixed a false positive
unreachable-codewhen usingtyping.Anyas return type in python 3.8, thetyping.NoReturnare not taken into account anymore for python 3.8 however.Closes #9751
v3.2.4
What's new in Pylint 3.2.4?
Release date: 2024-06-26
False Positives Fixed
-
Prevent emitting
possibly-used-before-assignmentwhen relying on names only potentially not defined in conditional blocks guarded by functions annotated withtyping.Neverortyping.NoReturn.Closes #9674
Other Bug Fixes
-
Fixed a crash when the lineno of a variable used as an annotation wasn't available for
undefined-variable.Closes #8866
-
Fixed a crash when the
startvalue in anenumeratewas non-constant and impossible to infer (like inenumerate(apples, start=int(random_apple_index)) forunnecessary-list-index-lookup.Closes #9078
-
Fixed a crash in
symilarwhen the-dor-ishort option were not properly recognized. It's still impossible to do-d=1(you must do-d 1).Closes #9343
v3.2.3
False Positives Fixed
-
Classes with only an Ellipsis (
...) in their body do not trigger 'multiple-statements' anymore if they are inlined (in accordance with black's 2024 style).Closes #9398
-
Fix a false positive for
redefined-outer-namewhen there is a name defined in an exception-handling block which shares the same name as a local variable that has been defined in a function body.Closes #9671
-
Fix a false positive for
use-yield-fromwhen using the return value from theyieldatom.Closes #9696
v3.2.2
What's new in Pylint 3.2.2?
Release date: 2024-05-20
False Positives Fixed
-
Fix multiple false positives for generic class syntax added in Python 3.12 (PEP 695).
Closes #9406
-
Exclude context manager without cleanup from
contextmanager-generator-missing-cleanupchecks.Closes #9625
v3.2.1
What's new in Pylint 3.2.1?
Release date: 2024-05-18
False Positives Fixed
-
Exclude if/else branches containing terminating functions (e.g.
sys.exit()) frompossibly-used-before-assignmentchecks.Closes #9627
-
Don't emit
typevar-name-incorrect-variancewarnings for PEP 695 style TypeVars. The variance is inferred automatically by the type checker. Adding_coor_contrasuffix can help to reason about TypeVar.Refs #9638
-
Fix a false positive for
possibly-used-before-assignmentwhen usingtyping.assert_never()(3.11+) to indicate exhaustiveness.Closes #9643
Other Bug Fixes
-
Fix a false negative for
--ignore-patternswhen the directory to be linted is specified using a dot(.) and all files are ignored instead of only the files whose name begin with a dot.Closes #9273
-
Restore "errors / warnings by module" section to report output (with
-ry).Closes #9145
-
trailing-comma-tupleshould now be correctly emitted when it was disabled globally but enabled via local message control, after removal of an over-optimisation.Refs #9608
-
Add
--prefer-stubs=yesoption to opt-in to the astroid 3.2 feature that prefers.pyistubs over same-named.pyfiles. This has the potential to reduceno-membererrors but at the cost of more errors such asnot-an-iterablefrom function bodies appearing as....Defaults to
no.
Internal Changes
-
Update astroid version to 3.2.1. This solves some reports of
RecursionErrorand also makes the prefer .pyi stubs feature in astroid 3.2.0 opt-in with the aforementioned--prefer-stubs=yoption.Refs #9139
v3.2.0
What's new in Pylint 3.2.0?
Release date: 2024-05-14
Of note: a github reporter, two new checks (possibly-used-before-assignment and contextmanager-generator-missing-cleanup), performance improvements, and an astroid upgrade providing support for @overload and .pyi stubs.
New Features
-
Understand
six.PY2andsix.PY3for conditional imports.Closes #3501
-
A new
githubreporter has been added. This reporter returns the output ofpylintin a format that Github can use to automatically annotate code. Use it withpylint --output-format=githubon your Github Workflows.Closes #9443.
New Checks
-
Add check
possibly-used-before-assignmentwhen relying on names after anif/elseswitch when one branch failed to define the name, raise, or return.Closes #1727
-
Checks for generators that use contextmanagers that don't handle cleanup properly. Is meant to raise visibilty on the case that a generator is not fully exhausted and the contextmanager is not cleaned up properly. A contextmanager must yield a non-constant value and not handle cleanup for GeneratorExit. The using generator must attempt to use the yielded context value
with x() as yand not justwith x().Closes #2832
False Negatives Fixed
-
If and Try nodes are now checked for useless return statements as well.
Closes #9449.
-
Fix false negative for
property-with-parametersin the case of parameters which arepositional-only,keyword-only,variadic positionalorvariadic keyword.Closes #9584
False Positives Fixed
Performance Improvements
-
Ignored modules are now not checked at all, instead of being checked and then ignored. This should speed up the analysis of large codebases which have ignored modules.
Closes #9442
-
ImportChecker's logic has been modified to avoid context files when possible. This makes it possible to cache module searches on astroid and reduce execution times.
Refs #9310.
-
An internal check for
trailing-comma-tuplebeing enabled for a file or not is now done once per file instead of once for each token.Refs #9608.
v3.1.1
What's new in Pylint 3.1.1?
Release date: 2024-05-13
False Positives Fixed
-
Treat
attrs.defineandattrs.frozenas dataclass decorators intoo-few-public-methodscheck.Closes #9345
-
Fix a false positive with
singledispatchmethod-functionwhen a method is decorated with bothfunctools.singledispatchmethodandstaticmethod.Closes #9531
-
Fix a false positive for
consider-using-dict-itemswhen iterating usingkeys()and then deleting an item using the key as a lookup.Closes #9554
v3.1.0
Two new checks--use-yield-from, deprecated-attribute-- and a smattering of bug fixes.
New Features
-
Skip
consider-using-joincheck for non-empty separators if ansuggest-join-with-non-empty-separatoroption is set tono.Closes #8701
-
Discover
.pyifiles when linting.These can be ignored with the
ignore-patternssetting.Closes #9097
-
Check
TypeAliasandTypeVar(PEP 695) nodes forinvalid-name.Refs #9196
-
Support for resolving external toml files named pylintrc.toml and .pylintrc.toml.
Closes #9228
-
Check for
.clear,.discard,.popandremovemethods being called on a set while it is being iterated over.Closes #9334
New Checks
-
New message
use-yield-fromadded to the refactoring checker. This message is emitted when yielding from a loop can be replaced byyield from.Closes #9229.
-
Added a
deprecated-attributemessage to check deprecated attributes in the stdlib.Closes #8855
False Positives Fixed
-
Fixed false positive for
inherit-non-classfor generic Protocols.Closes #9106
-
Exempt
TypedDictfromtyping_extensionsfromtoo-many-ancestorchecks.Refs #9167
False Negatives Fixed
-
Extend broad-exception-raised and broad-exception-caught to except*.
Closes #8827
-
Fix a false-negative for unnecessary if blocks using a different than expected ordering of arguments.
Closes #8947.
Other Bug Fixes
-
Improve the message provided for wrong-import-order check. Instead of the import statement ("import x"), the message now specifies the import that is out of order and which imports should come after it. As reported in the issue, this is particularly helpful if there are multiple imports on a single line that do not follow the PEP8 convention.
The message will report imports as follows: For "import X", it will report "(standard/third party/first party/local) import X" For "import X.Y" and "from X import Y", it will report "(standard/third party/first party/local) import X.Y" The import category is specified to provide explanation as to why pylint has issued the message and guidence to the developer on how to fix the problem.
Closes #8808
Other Changes
-
Print how many files were checked in verbose mode.
Closes #8935
-
Fix a crash when an enum class which is also decorated with a
dataclasses.dataclassdecorator is defined.Closes #9100
Internal Changes
-
Update astroid version to 3.1.0.
Refs #9457
v3.0.4
False Positives Fixed
-
used-before-assignmentis no longer emitted when using a name in a loop and depending on an earlier name assignment in anexceptblock paired withelse: continue.Closes #6804
-
Avoid false positives for
no-memberinvolving function attributes supplied by decorators.Closes #9246
-
Fixed false positive nested-min-max for nested lists.
Closes #9307
-
Fix false positive for
used-before-assignmentin afinallyblock when assignments took place in both thetryblock and each exception handler.Closes #9451
Other Bug Fixes
-
Catch incorrect ValueError
"generator already executing"for Python 3.12.0 - 3.12.2. This is fixed upstream in Python 3.12.3.Closes #9138
v3.0.3
What's new in Pylint 3.0.3?
Release date: 2023-12-11
False Positives Fixed
-
Fixed false positive for
unnecessary-lambdawhen the call has keyword arguments but not the lambda.Closes #9148
-
Fixed incorrect suggestion for shallow copy in unnecessary-comprehension
Example of the suggestion: #pylint: disable=missing-module-docstring a = [1, 2, 3] b = [x for x in a] b[0] = 0 print(a) # [1, 2, 3]
After changing b = [x for x in a] to b = a based on the suggestion, the script now prints [0, 2, 3]. The correct suggestion should be use list(a) to preserve the original behavior.
Closes #9172
-
Fix false positives for
undefined-variableandunused-argumentfor classes and functions using Python 3.12 generic type syntax.Closes #9193
-
Fixed
pointless-string-statementfalse positive for docstrings on Python 3.12 type aliases.Closes #9268
-
Fix false positive for
invalid-exception-operationwhen concatenating tuples of exception types.Closes #9288
Other Bug Fixes
-
Fix a bug where pylint was unable to walk recursively through a directory if the directory has an
__init__.pyfile.Closes #9210
v3.0.2
False Positives Fixed
-
Fix
used-before-assignmentfalse positive for generic type syntax (PEP 695, Python 3.12).Closes #9110
Other Bug Fixes
-
Escape special symbols and newlines in messages.
Closes #7874
-
Fixes suggestion for
nested-min-maxfor expressions with additive operators, list and dict comprehensions.Closes #8524
-
Fixes ignoring conditional imports with
ignore-imports=y.Closes #8914
-
Emit
inconsistent-quotesfor f-strings with 3.12 interpreter only if targeting pre-3.12 versions.Closes #9113
v3.0.1
False Positives Fixed
-
Fixed false positive for
inherit-non-classfor generic Protocols.Closes #9106
Other Changes
-
Fix a crash when an enum class which is also decorated with a
dataclasses.dataclassdecorator is defined.Closes #9100
v3.0.0
Pylint now support python 3.12 officially.
This long anticipated major version also provides some important usability and performance improvements, along with enacting necessary breaking changes and long-announced deprecations. The documentation of each message with an example is very close too.
The required astroid version is now 3.0.0. See the astroid changelog for additional fixes, features, and performance improvements applicable to pylint.
Our code is now fully typed. The invalid-name message no longer checks for a minimum length of 3 characters by default. Dependencies like wrapt or setuptools were removed.
A new json2 reporter has been added. It features an enriched output that is easier to parse and provides more info, here's a sample output.
{
"messages": [
{
"type": "convention",
"symbol": "line-too-long",
"message": "Line too long (1/2)",
"messageId": "C0301",
"confidence": "HIGH",
"module": "0123",
"obj": "",
"line": 1,
"column": 0,
"endLine": 1,
"endColumn": 4,
"path": "0123",
"absolutePath": "0123"
}
],
"statistics": {
"messageTypeCount": {
"fatal": 0,
"error": 0,
"warning": 0,
"refactor": 0,
"convention": 1,
"info": 0
},
"modulesLinted": 1,
"score": 5.0
}
}
Breaking Changes
-
Enabling or disabling individual messages will now take effect even if an
--enable=allordisable=allfollows in the same configuration file (or on the command line).This means for the following example,
fixmemessages will now be emitted:pylint my_module --enable=fixme --disable=allTo regain the prior behavior, remove the superfluous earlier option.
Closes #3696
-
Remove support for launching pylint with Python 3.7. Code that supports Python 3.7 can still be linted with the
--py-version=3.7setting.Refs #6306
-
Disables placed in a
tryblock now apply to theexceptblock. Previously, they only happened to do so in the presence of anelseclause.Refs #7767
-
pyreversenow uses a new default color palette that is more colorblind friendly. The color scheme is taken fromPaul Tol's Notes <https://personal.sron.nl/~pault/>_. If you prefer other colors, you can use the--color-paletteoption to specify custom colors.Closes #8251
-
Everything related to the
__implements__construct was removed. It was based on PEP245 that was proposed in 2001 and rejected in 2006.The capability from pyreverse to take
__implements__into account when generating diagrams was also removed.Refs #8404
-
pyreverse: Support for the.vcgoutput format (Visualization of Compiler Graphs) has been dropped.Closes #8416
-
The warning when the now useless old pylint cache directory (pylint.d) was found was removed. The cache dir is documented in
the FAQ <https://pylint.readthedocs.io/en/latest/faq.html#where-is-the-persistent-data-stored-to-compare-between-successive-runs>_.Refs #8462
-
Following a deprecation period,
pylint.config.PYLINTRCwas removed. Use thepylint.config.find_default_config_filesgenerator instead.Closes #8862
Changes requiring user actions
-
The
invalid-namemessage no longer checks for a minimum length of 3 characters by default. (This was an unadvertised commingling of concerns between casing and name length, and users regularly reported this to be surprising.)If checking for a minimum length is still desired, it can be regained in two ways:
-
If you are content with a
disallowed-namemessage (instead ofinvalid-name), then simply add the optionbad-names-rgxs="^..?$", which will fail 1-2 character-long names. (Ensure you enabledisallowed-name.) -
If you would prefer an
invalid-namemessage to be emitted, or would prefer finer-grained control over the circumstances in which messages are emitted (classes vs. methods, etc.), then avail yourself of the regex options describedhere <https://pylint.readthedocs.io/en/stable/user_guide/configuration/all-options.html#main-checker>. (In particular, take note of the commented out options in the "example configuration" given at the bottom of the section.) The prior regexes can be found in thepull request <https://github.com/pylint-dev/pylint/pull/8813>that removed the length requirements.
Closes #2018
-
-
The compare to empty string checker (
pylint.extensions.emptystring) and the compare to zero checker (pylint.extensions.compare-to-zero) have been removed and their checks are now part of the implicit booleaness checker:-
compare-to-zerowas renameduse-implicit-booleaness-not-comparison-to-zeroandcompare-to-empty-stringwas renameduse-implicit-booleaness-not-comparison-to-stringand they now need to be enabled explicitly. -
The
pylint.extensions.emptystringandpylint.extensions.compare-to-zeroextensions no longer exist and need to be removed from theload-pluginsoption. -
Messages related to implicit booleaness were made more explicit and actionable. This permits to make their likeness explicit and will provide better performance as they share most of their conditions to be raised.
Closes #6871
-
-
epylint was removed. It now lives at: https://github.com/emacsorphanage/pylint.
Refs #7737
-
The
overgeneral-exceptionsoption now only takes fully qualified names into account (builtins.ExceptionnotException). If you overrode this option, you need to use the fully qualified name now.There's still a warning, but it will be removed in 3.1.0.
Refs #8411
-
Following a deprecation period, it's no longer possible to use
MASTERormasteras configuration section insetup.cfgortox.ini. It's bad practice to not start a section title with the tool name. Please usepylint.maininstead.Refs #8465
-
Package stats are now printed when running Pyreverse and a
--verboseflag was added to get the original output with parsed modules. You might need to activate the verbose option if you want to keep the old output.Closes #8973
New Features
-
A new
json2reporter has been added. It features a more enriched output that is easier to parse and provides more info.Compared to
jsonthe only changes are that messages are now under the"messages"key and that"message-id"now follows the camelCase convention and is renamed to"messageId". The new reporter also reports the "score" of the modules you linted as defined by theevaluationoption and provides statistics about the modules you linted.We encourage users to use the new reporter as the
jsonreporter will no longer be maintained.Closes #4741
-
In Pyreverse package dependency diagrams, show when a module imports another only for type-checking.
Closes #8112
-
Add new option (
--show-stdlib,-L) topyreverse. This is similar to the behavior of--show-builtinin that standard library modules are now not included by default, and this option will include them.Closes #8181
-
Add Pyreverse option to exclude standalone nodes from diagrams with
--no-standalone.Closes #8476
New Checks
-
Added
DataclassCheckermodule andinvalid-field-callchecker to check for invalid dataclasses.field() usage.Refs #5159
-
Add
return-in-finallyto emit a message if a return statement was found in a finally clause.Closes #8260
-
Add a new checker
kwarg-superseded-by-positional-argto warn when a function is called with a keyword argument which shares a name with a positional-only parameter and the function contains a keyword variadic parameter dictionary. It may be surprising behaviour when the keyword argument is added to the keyword variadic parameter dictionary.Closes #8558
Extensions
-
Add new
prefer-typing-namedtuplemessage to theCodeStyleCheckerto suggest rewriting calls tocollections.namedtupleas classes inheriting fromtyping.NamedTupleon Python 3.6+.Requires
load-plugins=pylint.extensions.code_styleandenable=prefer-typing-namedtupleto be raised.Closes #8660
False Positives Fixed
-
Extend concept of "function ambiguity" in
safe_infer()from differing number of function arguments to differing set of argument names.Solves false positives in
tensorflow.Closes #3613
-
Fix
unused-argumentfalse positive when__new__does not use all the arguments of__init__.Closes #3670
-
Fix a false positive for
invalid-namewhen a type-annotated class variable in anenum.Enumclass has no assigned value.Refs #7402
-
Fix
unused-importfalse positive for usage ofsix.with_metaclass.Closes #7506
-
Fix false negatives and false positives for
too-many-try-statements,too-complex, andtoo-many-branchesby correctly counting statements under atry.Refs #7767
-
When checking for unbalanced dict unpacking in for-loops, Pylint will now test whether the length of each value to be unpacked matches the number of unpacking targets. Previously, Pylint would test the number of values for the loop iteration, which would produce a false unbalanced-dict-unpacking warning.
Closes #8156
-
Fix false positive for
used-before-assignmentwhen usage and assignment are guarded by the same test in different statements.Closes #8167
-
Adds
asyncSetUpto the defaultdefining-attr-methodslist to silenceattribute-defined-outside-initwarning when usingunittest.IsolatedAsyncioTestCase.Refs #8403
-
logging-not-lazyis not longer emitted for explicitly concatenated string arguments.Closes #8410
-
Fix false positive for isinstance-second-argument-not-valid-type when union types contains None.
Closes #8424
-
invalid-namenow allows for integers intypealiasnames:- now valid:
Good2Name,GoodName2. - still invalid:
_1BadName.
Closes #8485
- now valid:
-
No longer consider
Unionas type annotation as type alias for naming checks.Closes #8487
-
unnecessary-lambdano longer warns on lambdas which use its parameters in their body (other than the final arguments), e.g.lambda foo: (bar if foo else baz)(foo).Closes #8496
-
Fixed
unused-importso that it observes thedummy-variables-rgxoption.Closes #8500
-
Uniontyped variables without assignment are no longer treated asTypeAlias.Closes #8540
-
Allow parenthesized implicitly concatenated strings when
check-str-concat-over-line-jumpsis enabled.Closes #8552.
-
Fix false positive for
positional-only-arguments-expectedwhen a function contains both a positional-only parameter that has a default value, and**kwargs.Closes #8555
-
Fix false positive for
keyword-arg-before-varargwhen a positional-only parameter with a default value precedes*args.Closes #8570
-
Fix false positive for
arguments-differwhen overriding__init_subclass__.Closes #8919
-
Fix a false positive for
no-value-for-parameterwhen a staticmethod is called in a class body.Closes #9036
False Negatives Fixed
-
Emit
used-before-assignmentwhen calling module-level functions before definition.Closes #1144
-
Apply
infer_kwarg_from_call()to more checksThese mostly solve false negatives for various checks, save for one false positive for
use-maxsplit-arg.Closes #7761
-
TypeAliasvariables defined in functions are now checked forinvalid-nameerrors.Closes #8536
-
Fix false negative for
no-value-for-parameterwhen a function, whose signature contains both a positional-only parameternameand also*kwargs, is called with a keyword-argument forname.Closes #8559
-
Fix a false negative for
too-many-argumentsby considering positional-only and keyword-only parameters.Closes #8667
-
Emit
assignment-from-no-returnfor calls to builtin methods likedict.update(). Calls tolist.sort()now raiseassignment-from-no-returnrather thanassignment-from-nonefor consistency. -
consider-using-augmented-assignis now applied to dicts and lists as well.Closes #8959
Other Bug Fixes
-
Support
duplicate-codemessage when parallelizing with--jobs.Closes #374
-
Support
cyclic-importmessage when parallelizing with--jobs.Closes #4171
-
--jobscan now be used with--load-plugins.This had regressed in astroid 2.5.0.
Closes #4874
-
docparams extension considers type comments as type documentation.
Closes #6287
-
When parsing comma-separated lists of regular expressions in the config, ignore commas that are inside braces since those indicate quantifiers, not delineation between expressions.
Closes #7229
-
The
ignored-modulesoption will now be correctly taken into account forno-name-in-module.Closes #7578
-
sys.argvis now always correctly considered as impossible to infer (instead of using the actual values given to pylint).Closes #7710
-
Avoid duplicative warnings for unqualified exception names in the
overgeneral-exceptionssetting when running with--jobs.Closes #7774
-
Don't show class fields more than once in Pyreverse diagrams.
Closes #8189
-
Fix
used-before-assignmentfalse negative when TYPE_CHECKING imports are used in multiple scopes.Closes #8198
-
--clear-cache-post-runnow also clears LRU caches for pylint utilities holding references to AST nodes.Closes #8361
-
Fix a crash when
TYPE_CHECKINGis used without importing it.Closes #8434
-
Fix a
used-before-assignmentfalse positive when imports are made under theTYPE_CHECKINGelse if branch.Closes #8437
-
Fix a regression of
preferred-moduleswhere a partial match was used instead of the required full match.Closes #8453
-
Fix a crash in pyreverse when "/" characters are used in the output filename e.g pyreverse -o png -p name/ path/to/project.
Closes #8504
-
Don't show arrows more than once in Pyreverse diagrams.
Closes #8522
-
Improve output of
consider-using-generatormessage formin()calls withdefaultkeyword.Closes #8563
-
Fixed a crash when generating a configuration file:
tomlkit.exceptions.TOMLKitError: Can't add a table to a dotted keycaused by tomlkitv0.11.8.Closes #8632
-
Fix a line break error in Pyreverse dot output.
Closes #8671
-
Fix a false positive for
method-hiddenwhen usingcached_propertydecorator.Closes #8753
-
Dunder methods defined in lambda do not trigger
unnecessary-dunder-callanymore, if they cannot be replaced by the non-dunder call.Closes #8769
-
Don't show duplicate type annotations in Pyreverse diagrams.
Closes #8888
-
Fixing inconsistent hashing issue in
BaseCheckercausing some reports not being exported.Closes #9001
-
Don't add
Optionalto|annotations withNonein Pyreverse diagrams.Closes #9014
-
Pyreverse doesn't show multiple class association arrows anymore, but only the strongest one.
Refs #9045
-
Prevented data loss in the linter stats for messages relating to the linter itself (e.g.
unknown-option-value), fixing problems with score, fail-on, etc.Closes #9059
-
Fix crash in refactoring checker when unary operand used with variable in for loop.
Closes #9074
Other Changes
-
Pylint now exposes its type annotations.
-
Search for
pyproject.tomlrecursively in parent directories up to a project or file system root. -
All code related to the optparse config parsing has been removed.
Refs #8405
-
Pylint now supports python 3.12.
Refs #8718
-
Add a CITATION.cff file to the root of the repository containing the necessary metadata to cite Pylint.
Closes #8760
-
Renamed the "unneeded-not" error into "unnecessary_negation" to be clearer.
Closes #8789
Internal Changes
-
get_message_definitionwas removed from the base checker API. You can access message definitions through theMessageStore.Refs #8401
-
Everything related to the
__implements__construct was removed. It was based on PEP245 that was proposed in 2001 and rejected in 2006.All the classes inheriting
Interfaceinpylint.interfaceswere removed.Checkershould only inheritBaseCheckeror any of the other checker types frompylint.checkers.Reportershould only inheritBaseReporter.Refs #8404
-
modnameandmsg_storeare now required to be given inFileState.collect_block_lineshas also been removed.Pylinter.current_namecannot be null anymore.Refs #8407
-
Reporter.set_outputwas removed in favor ofreporter.out = stream.Refs #8408
-
A number of old utility functions and classes have been removed:
MapReduceMixin: To make a checker reduce map data simply implementget_map_dataandreduce_map_data.is_inside_lambda: Useutils.get_node_first_ancestor_of_type(x, nodes.Lambda)check_messages: Useutils.only_required_for_messagesis_class_subscriptable_pep585_with_postponed_evaluation_enabled: Useis_postponed_evaluation_enabled(node)andis_node_in_type_annotation_context(node)get_python_path: assumption that there's always an init.py is not true since python 3.3 and is causing problems, particularly with PEP 420. Usediscover_package_pathand pass source root(s).fix_import_path: Useaugmented_sys_pathand pass additionalsys.pathentries as an argument obtained fromdiscover_package_path.get_global_option: Usechecker.linter.configto get all global options.Related private objects have been removed as well.
Refs #8409
-
colorize_ansinow only accepts aMessageStyleobject.Refs #8412
-
Following a deprecation period,
Pylinter.checknow only works with sequences of strings, not strings.Refs #8463
-
Following a deprecation period,
ColorizedTextReporteronly acceptsColorMappingDict.Refs #8464
-
Following a deprecation period,
MessageTest'send_lineandend_col_offsetmust be accurate in functional tests (for python 3.8 or above on cpython, and for python 3.9 or superior on pypy).Refs #8466
-
Following a deprecation period, the
do_exitargument of theRunclass (and of the_Runclass in testutils) were removed.Refs #8472
-
Following a deprecation period, the
py_versionargument of theMessageDefinition.may_be_emittedfunction is now required. The most likely solution is to use 'linter.config.py_version' if you need to keep using this function, or to use 'MessageDefinition.is_message_enabled' instead.Refs #8473
-
Following a deprecation period, the
OutputLineclass now requires the right number of argument all the time. The functional output can be regenerated automatically to achieve that easily.Refs #8474
-
Following a deprecation period,
is_typing_guard,is_node_in_typing_guarded_import_blockandis_node_in_guarded_import_blockfrompylint.utilswere removed: use a combination ofis_sys_guardandin_type_checking_blockinstead.Refs #8475
-
Following a deprecation period, the
locationargument of theMessageclass must now be aMessageLocationTuple.Refs #8477
-
Following a deprecation period, the
check_single_filefunction of thePylinteris replaced byPylinter.check_single_file_item.Refs #8478
Performance Improvements
-
pylintruns (at least) ~5% faster after improvements toastroidthat make better use of the inference cache. -
- Optimize
is_trailing_comma(). - Cache
class_is_abstract().
Refs #1954
- Optimize
-
Exit immediately if all messages are disabled.
Closes #8715
v2.17.7
2.17.7 is the last release before we only support pylint 3.0.0 or superior and python 3.8 or superior.
False Positives Fixed
-
Fix a regression in pylint 2.17.6 / astroid 2.15.7 causing various messages for code involving
TypeVar.Closes #9069
Other Bug Fixes
-
Fix crash in refactoring checker when unary operand used with variable in for loop.
Closes #9074
v2.17.6
Other Bug Fixes
-
When parsing comma-separated lists of regular expressions in the config, ignore commas that are inside braces since those indicate quantifiers, not delineation between expressions.
Closes #7229
-
sys.argvis now always correctly considered as impossible to infer (instead of using the actual values given to pylint).Closes #9047
-
Don't show class fields more than once in Pyreverse diagrams.
Closes #8189
-
Don't show arrows more than once in Pyreverse diagrams.
Closes #8522
-
Don't show duplicate type annotations in Pyreverse diagrams.
Closes #8888
-
Don't add
Optionalto|annotations withNonein Pyreverse diagrams.Closes #9014
v2.17.5
What's new in Pylint 2.17.5?
Release date: 2023-07-26
False Positives Fixed
-
Fix a false positive for
unused-variablewhen there is an import in aif TYPE_CHECKING:block andallow-global-unused-variablesis set tonoin the configuration.Closes #8696
-
Fix false positives generated when supplying arguments as
**kwargsto IO calls like open().Closes #8719
-
Fix a false positive where pylint was ignoring method calls annotated as
NoReturnduring theinconsistent-return-statementscheck.Closes #8747
-
Exempt parents with only type annotations from the
invalid-enum-extensionmessage.Closes #8830
Other Bug Fixes
-
Fixed crash when a call to
super()was placed after an operator (e.g.not).Closes #8554
-
Fix crash for
modified-while-iteratingchecker when deleting members of a dict returned from a call.Closes #8598
-
Fix crash in
invalid-metaclasscheck when a metaclass had duplicate bases.Closes #8698
-
Avoid
consider-using-f-stringon modulos with brackets in template.Closes #8720.
-
Fix a crash when
__all__exists but cannot be inferred.Closes #8740
-
Fix crash when a variable is assigned to a class attribute of identical name.
Closes #8754
-
Fixed a crash when calling
copy.copy()without arguments.Closes #8774
Other Changes
-
Fix a crash when a
nonlocalis defined at module-level.Closes #8735
v2.17.4
False Positives Fixed
-
Fix a false positive for
bad-dunder-namewhen there is a user-defined__index__method.Closes #8613
Other Bug Fixes
-
pyreverse: added escaping of vertical bar character in annotation labels produced by DOT printer to ensure it is not treated as field separator of record-based nodes.Closes #8603
-
Fixed a crash when generating a configuration file:
tomlkit.exceptions.TOMLKitError: Can't add a table to a dotted keycaused by tomlkitv0.11.8.Closes #8632
v2.17.3
What's new in Pylint 2.17.3?
Release date: 2023-04-24
False Positives Fixed
-
Fix
unused-argumentfalse positive when__new__does not use all the arguments of__init__.Closes #3670
-
Fix
unused-importfalse positive for usage ofsix.with_metaclass.Closes #7506
-
logging-not-lazyis not longer emitted for explicitly concatenated string arguments.Closes #8410
-
Fix false positive for isinstance-second-argument-not-valid-type when union types contains None.
Closes #8424
-
Fixed
unused-importso that it observes thedummy-variables-rgxoption.Closes #8500
-
Uniontyped variables without assignment are no longer treated asTypeAlias.Closes #8540
-
Fix false positive for
positional-only-arguments-expectedwhen a function contains both a positional-only parameter that has a default value, and**kwargs.Closes #8555
-
Fix false positive for
keyword-arg-before-varargwhen a positional-only parameter with a default value precedes*args.Closes #8570
Other Bug Fixes
-
Improve output of
consider-using-generatormessage formin()` calls withdefault`` keyword.Closes #8563
v2.17.2
False Positives Fixed
-
invalid-namenow allows for integers intypealiasnames:- now valid:
Good2Name,GoodName2. - still invalid:
_1BadName.
Closes #8485
- now valid:
-
No longer consider
Unionas type annotation as type alias for naming checks.Closes #8487
-
unnecessary-lambdano longer warns on lambdas which use its parameters in their body (other than the final arguments), e.g.lambda foo: (bar if foo else baz)(foo).Closes #8496
Other Bug Fixes
-
Fix a crash in pyreverse when "/" characters are used in the output filename e.g pyreverse -o png -p name/ path/to/project.
Closes #8504
v2.17.1
False Positives Fixed
-
Adds
asyncSetUpto the defaultdefining-attr-methodslist to silenceattribute-defined-outside-initwarning when usingunittest.IsolatedAsyncioTestCase.Refs #8403
Other Bug Fixes
-
--clear-cache-post-runnow also clears LRU caches for pylint utilities holding references to AST nodes.Closes #8361
-
Fix a crash when
TYPE_CHECKINGis used without importing it.Closes #8434
-
Fix a regression of
preferred-moduleswhere a partial match was used instead of the required full match.Closes #8453
Internal Changes
-
The following utilities are deprecated in favor of the more robust
in_type_checking_blockand will be removed in pylint 3.0:is_node_in_guarded_import_blockis_node_in_typing_guarded_import_blockis_typing_guard
is_sys_guardis still available, which was part ofis_node_in_guarded_import_block.Refs #8433
v2.17.0
2.17 is a small release that is the first to support python 3.11 officially with the addition of TryStar nodes.
There's still two new default checks: bad-chained-comparison and
implicit-flag-alias, one of them already fixed a previously undetected
bug in sentry.
Thanks to the community effort our documentation is almost complete, and almost all messages should have a proper documentation now. A big thank you to everyone who participated !
The next release is going to be 3.0.0, bring breaking changes and
enact long announced deprecations. There's going to be frequent beta
releases, before the official releases, everyone is welcome to try the betas
so we find problems before the actual release.
What's new in Pylint 2.17.0?
Release date: 2023-03-08
New Features
-
pyreversenow supports custom color palettes with the--color-paletteoption.Closes #6738
-
Add
invalid-namecheck forTypeAliasnames.Closes #7081
-
Accept values of the form
<class name>.<attribute name>for theexclude-protectedlist.Closes #7343
-
Add
--versionoption topyreverse.Refs #7851
-
Adds new functionality with preferred-modules configuration to detect submodules.
Refs #7957
-
Support implicit namespace packages (PEP 420).
Closes #8154
-
Add globbing pattern support for
--source-roots.Closes #8290
-
Support globbing pattern when defining which file/directory/module to lint.
Closes #8310
-
pylint now supports
TryStarnodes from Python 3.11 and should be fully compatible with Python 3.11.Closes #8387
New Checks
-
Add a
bad-chained-comparisoncheck that emits a warning when there is a chained comparison where one expression is semantically incompatible with the other.Closes #6559
-
Adds an
implicit-flag-aliascheck that emits a warning when a class derived fromenum.IntFlagassigns distinct integer values that share common bit positions.Refs #8102
False Positives Fixed
-
Fix various false positives for functions that return directly from structural pattern matching cases.
Closes #5288
-
Fix false positive for
used-before-assignmentwhentyping.TYPE_CHECKINGis used with if/elif/else blocks.Closes #7574
-
Fix false positive for isinstance-second-argument-not-valid-type with union types.
Closes #8205
-
Fix false positive for
used-before-assignmentfor named expressions appearing after the first element in a list, tuple, or set.Closes #8252
-
Fix false positive for
wrong-spelling-in-commentwith class names in a python 2 type comment.Closes #8370
False Negatives Fixed
-
Fix a false negative for 'missing-parentheses-for-call-in-test' when inference failed for the internal of the call as we did not need that information to raise correctly.
Refs #8185
-
Fix false negative for inconsistent-returns with while-loops.
Closes #8280
Other Bug Fixes
-
Fix
used-before-assignmentfalse positive when the walrus operator is used with a ternary operator in dictionary key/value initialization.Closes #8125
-
Fix
no-name-in-modulefalse positive raised when a package defines a variable with the same name as one of its submodules.Closes #8148
-
Fix a crash happening for python interpreter < 3.9 following a failed typing update.
Closes #8161
-
Fix
nested-min-maxsuggestion message to indicate it's possible to splat iterable objects.Closes #8168
-
Fix a crash happening when a class attribute was negated in the start argument of an enumerate.
Closes #8207
-
Prevent emitting
invalid-namefor the line on which aglobalstatement is declared.Closes #8307
Other Changes
-
Update explanation for
global-variable-not-assignedand add confidence.Closes #5073
-
The governance model and the path to become a maintainer have been documented as part of our effort to guarantee that the software supply chain in which pylint is included is secure.
Refs #8329
v2.16.4
False Positives Fixed
-
Fix false positive for isinstance-second-argument-not-valid-type with union types.
Closes #8205
v2.16.3
False Positives Fixed
-
Fix false positive for
wrong-spelling-in-commentwith class names in a python 2 type comment.Closes #8370
Other Bug Fixes
-
Prevent emitting
invalid-namefor the line on which aglobalstatement is declared.Closes #8307
v2.16.2
New Features
-
Add
--versionoption topyreverse.Refs #7851
False Positives Fixed
-
Fix false positive for
used-before-assignmentwhentyping.TYPE_CHECKINGis used with if/elif/else blocks.Closes #7574
-
Fix false positive for
used-before-assignmentfor named expressions appearing after the first element in a list, tuple, or set.Closes #8252
Other Bug Fixes
-
Fix
used-before-assignmentfalse positive when the walrus operator is used with a ternary operator in dictionary key/value initialization.Closes #8125
-
Fix
no-name-in-modulefalse positive raised when a package defines a variable with the same name as one of its submodules.Closes #8148
-
Fix
nested-min-maxsuggestion message to indicate it's possible to splat iterable objects.Closes #8168
-
Fix a crash happening when a class attribute was negated in the start argument of an enumerate.
Closes #8207
v2.16.1
Other Bug Fixes
-
Fix a crash happening for python interpreter < 3.9 following a failed typing update.
Closes #8161
v2.16.0
Summary -- Release highlights
In 2.16.0 we added aggregation and composition understanding in pyreverse, and a way to clear
the cache in between run in server mode (originally for the VS Code integration). Apart from the bug
fixes there's also a lot of new checks, and new extensions that have been asked for for a long time
that were implemented.
If you want to benefit from all the new checks load the following plugins::
pylint.extensions.dict_init_mutate,
pylint.extensions.dunder,
pylint.extensions.typing,
pylint.extensions.magic_value,
We still welcome any community effort to help review, integrate, and add good/bad examples to the doc for
#5953. This should be doable without any pylint or astroid
knowledge, so this is the perfect entrypoint if you want to contribute to pylint or open source without
any experience with our code!
Last but not least @clavedeluna and @nickdrozd became triagers, welcome to the team !
What's new in Pylint 2.16.0?
Changes requiring user actions
-
The
accept-no-raise-docoption related tomissing-raises-docwill now be correctly taken into account all the time.Pylint will no longer raise missing-raises-doc (W9006) when no exceptions are documented and accept-no-raise-doc is true (issue #7208). If you were expecting missing-raises-doc errors to be raised in that case, you will now have to add
accept-no-raise-doc=noin your configuration to keep the same behavior. Closes #7208
New Features
-
Added the
no-headeroutput format. If enabled with--output-format=no-header, it will not include the module name in the output. Closes #5362 -
Added configuration option
clear-cache-post-runto support server-like usage. Use this flag if you expect the linted files to be altered between runs. Refs #5401 -
Add
--allow-reexport-from-packageoption to configure theuseless-import-aliascheck not to emit a warning if a name is reexported from a package. Closes #6006 -
Update
pyreverseto differentiate between aggregations and compositions.pyreversechecks if it's an Instance or a Call of an object via method parameters (via type hints) to decide if it's a composition or an aggregation. Refs #6543
New Checks
-
Adds a
pointless-exception-statementcheck that emits a warning when an Exception is created and not assigned, raised or returned. Refs #3110 -
Add a
shadowed-importmessage for aliased imports. Closes #4836 -
Add new check called
unbalanced-dict-unpackingto check for unbalanced dict unpacking in assignment and for loops. Closes #5797 -
Add new checker
positional-only-arguments-expectedto check for cases when positional-only arguments have been passed as keyword arguments. Closes #6489 -
Added
singledispatch-methodwhich informs that@singledispatchshould decorate functions and not class/instance methods. Addedsingledispatchmethod-functionwhich informs that@singledispatchmethodshould decorate class/instance methods and not functions. Closes #6917 -
Rename
broad-excepttobroad-exception-caughtand add new checkerbroad-exception-raisedwhich will warn if general exceptionsBaseExceptionorExceptionare raised. Closes #7494 -
Added
nested-min-maxwhich flagsmin(1, min(2, 3))to simplify tomin(1, 2, 3). Closes #7546 -
Extended
use-dict-literalto also warn about call todict()when passing keyword arguments. Closes #7690 -
Add
named-expr-without-contextcheck to emit a warning if a named expression is used outside a context likeif,for,while, or a comprehension. Refs #7760 -
Add
invalid-slice-stepcheck to warn about a slice step value of0for common builtin sequences. Refs #7762 -
Add
consider-refactoring-into-while-conditioncheck to recommend refactoring when a while loop is defined with a constant condition with an immediateifstatement to check forbreakcondition as a first statement. Closes #8015
Extensions
-
Add new extension checker
dict-init-mutatethat flags mutating a dictionary immediately after the dictionary was created. Closes #2876 -
Added
bad-dunder-nameextension check, which flags bad or misspelled dunder methods. You can use thegood-dunder-namesoption to allow specific dunder names. Closes #3038 -
Added
consider-using-augmented-assigncheck forCodeStyleextension which flagsx = x + 1to simplify tox += 1. This check is disabled by default. To use it, load the code style extension withload-plugins=pylint.extensions.code_styleand addconsider-using-augmented-assignin theenableoption. Closes #3391 -
Add
magic-numberplugin checker for comparison with constants instead of named constants or enums. You can use it with--load-plugins=pylint.extensions.magic_value. Closes #7281 -
Add
redundant-typehint-argumentmessage fortypingplugin for duplicate assign typehints. Enable the plugin to enable the message with:--load-plugins=pylint.extensions.typing. Closes #7636
False Positives Fixed
-
Fix false positive for
unused-variableandunused-importwhen a name is only used in a string literal type annotation. Closes #3299 -
Document a known false positive for
useless-suppressionwhen disablingline-too-longin a module with only comments and no code. Closes #3368 -
trailing-whitespacesis no longer reported within strings. Closes #3822 -
Fix false positive for
global-variable-not-assignedwhen a global variable is re-assigned via anImportFromnode. Closes #4809 -
Fix false positive for
use-maxsplit-argwith custom split method. Closes #4857 -
Fix
logging-fstring-interpolationfalse positive raised when logging and f-string with%sformatting. Closes #4984 -
Fix false-positive for
used-before-assignmentin pattern matching with a guard. Closes #5327 -
Fix
use-sequence-for-iterationwhen unpacking a set with*. Closes #5788 -
Fix
deprecated-methodfalse positive when alias for method is similar to name of deprecated method. Closes #5886 -
Fix false positive
assigning-non-slotwhen a class attribute is re-assigned. Closes #6001 -
Fix false positive for
too-many-function-argswhen a function call is assigned to a class attribute inside the class where the function is defined. Closes #6592 -
Fixes false positive
abstract-methodon Protocol classes. Closes #7209 -
Pylint now understands the
kw_onlykeyword argument fordataclass. Closes #7290, closes #6550, closes #5857 -
Fix false positive for
undefined-loop-variableinfor-elseloops that use a function having a return type annotation ofNoReturnorNever. Closes #7311 -
Fix
used-before-assignmentfor functions/classes defined in type checking guard. Closes #7368 -
Fix false positive for
unhashable-memberwhen subclassingdictand using the subclass as a dictionary key. Closes #7501 -
Fix the message for
unnecessary-dunder-callfor__aiter__and__aneext__. Also only emit the warning whenpy-version>= 3.10. Closes #7529 -
Fix
used-before-assignmentfalse positive when else branch callssys.exitor similar terminating functions. Closes #7563 -
Fix a false positive for
used-before-assignmentfor imports guarded bytyping.TYPE_CHECKINGlater used in variable annotations. Closes #7609 -
Fix a false positive for
simplify-boolean-expressionwhen multiple values are inferred for a constant. Closes #7626 -
unnecessary-list-index-lookupwill not be wrongly emitted ifenumerateis called withstart. Closes #7682 -
Don't warn about
stop-iteration-returnwhen usingnext()overitertools.cycle. Closes #7765 -
Fixes
used-before-assignmentfalse positive when the walrus operator is used in a ternary operator. Closes #7779 -
Fix
missing-param-docfalse positive when function parameter has an escaped underscore. Closes #7827 -
Fixes
method-cache-max-size-nonefalse positive for methods inheriting fromEnum. Closes #7857 -
multiple-statementsno longer triggers for function stubs using inlined.... Closes #7860 -
Fix a false positive for
used-before-assignmentwhen a name guarded byif TYPE_CHECKING:is used as a type annotation in a function body and later re-imported in the same scope. Closes #7882 -
Prevent
used-before-assignmentwhen imports guarded byif TYPE_CHECKINGare guarded again when used. Closes #7979 -
Fixes false positive for
try-except-raisewith multiple exceptions in one except statement if exception are in different namespace. Closes #8051 -
Fix
invalid-nameerrors fortyping_extension.TypeVar. Refs #8089 -
Fix
no-kwoafalse positive for context managers. Closes #8100 -
Fix a false positive for
redefined-variable-typewhenasyncmethods are present. Closes #8120
False Negatives Fixed
-
Code following a call to
quit,exit,sys.exitoros._exitwill be marked asunreachable. Refs #519 -
Emit
used-before-assignmentwhen function arguments are redefined inside an inner function and accessed there before assignment. Closes #2374 -
Fix a false negative for
unused-importwhen one module used an import in a type annotation that was also used in another module. Closes #4150 -
Flag
superfluous-parensif parentheses are used during string concatenation. Closes #4792 -
Emit
used-before-assignmentwhen relying on names only defined under conditions always testing false. Closes #4913 -
consider-using-joincan now be emitted for non-empty string separators. Closes #6639 -
Emit
used-before-assignmentfor further imports guarded byTYPE_CHECKINGPreviously, this message was only emitted for imports guarded directly underTYPE_CHECKING, not guarded two if-branches deep, nor whenTYPE_CHECKINGwas imported fromtypingunder an alias. Closes #7539 -
Fix a false negative for
unused-importwhen a constant insidetyping.Annotatedwas treated as a reference to an import. Closes #7547 -
consider-using-any-or-allmessage will now be raised in cases when boolean is initialized, reassigned during loop, and immediately returned. Closes #7699 -
Extend
invalid-slice-indexto emit an warning for invalid slice indices used with string and byte sequences, and range objects. Refs #7762 -
Fixes
unnecessary-list-index-lookupfalse negative whenenumerateis called withiterableas a kwarg. Closes #7770 -
no-else-returnorno-else-raisewill be emitted ifexceptblock always returns or raises. Closes #7788 -
Fix
dangerous-default-valuefalse negative when*is used. Closes #7818 -
consider-using-withnow triggers forpathlib.Path.open. Closes #7964
Other Bug Fixes
-
Fix bug in detecting
unused-variablewhen iterating on variable. Closes #3044 -
Fix bug in scanning of names inside arguments to
typing.Literal. See https://peps.python.org/pep-0586/#literals-enums-and-forward-references for details. Refs #3299 -
Update
disallowed-namecheck to flag module-level variables. Closes #3701 -
Pylint will no longer deadlock if a parallel job is killed but fail immediately instead. Closes #3899
-
Fix ignored files being linted when passed on stdin. Closes #4354
-
Fix
no-memberfalse negative when augmented assign is done manually, without+=. Closes #4562 -
Any assertion on a populated tuple will now receive a
assert-on-tuplewarning. Closes #4655 -
missing-return-doc,missing-raises-docandmissing-yields-docnow respect theno-docstring-rgxoption. Closes #4743 -
Update
reimportedhelp message for clarity. Closes #4836 -
consider-iterating-dictionarywill no longer be raised if bitwise operations are used. Closes #5478 -
Using custom braces in
msg-templatewill now work properly. Closes #5636 -
Pylint will now filter duplicates given to it before linting. The output should be the same whether a file is given/discovered multiple times or not. Closes #6242, #4053
-
Remove
__index__dunder method call fromunnecessary-dunder-callcheck. Closes #6795 -
Fixed handling of
--as separator between positional arguments and flags. This was not actually fixed in 2.14.5. Closes #7003, Refs #7096 -
Don't crash on
OSErrorin config file discovery. Closes #7169 -
Messages sent to reporter are now copied so a reporter cannot modify the message sent to other reporters. Closes #7214
-
Fixed a case where custom plugins specified by command line could silently fail. Specifically, if a plugin relies on the
init-hookoption changingsys.pathbefore it can be imported, this will now emit abad-plugin-valuemessage. Before this change, it would silently fail to register the plugin for use, but would load any configuration, which could have unintended effects. Fixes part of #7264. -
Update
modified_iteratingchecker to fix a crash withforloops on empty list. Closes #7380 -
Update wording for
arguments-differandarguments-renamedto clarify overriding object. Closes #7390 -
disable-nextis now correctly scoped to only the succeeding line. Closes #7401 -
Fixed a crash in the
unhashable-memberchecker when using alambdaas a dict key. Closes #7453 -
Add
mailcapto deprecated modules list. Closes #7457 -
Fix a crash in the
modified-iterating-dictchecker involving instance attributes. Closes #7461 -
invalid-class-objectdoes not crash anymore when__class__is assigned alongside another variable. Closes #7467 -
--help-msgnow accepts a comma-separated list of message IDs again. Closes #7471 -
Allow specifying non-builtin exceptions in the
overgeneral-exceptionoption using an exception's qualified name. Closes #7495 -
Report
no-self-argumentrather thanno-method-argumentfor methods with variadic arguments. Closes #7507 -
Fixed an issue where
syntax-errorcouldn't be raised on files with invalid encodings. Closes #7522 -
Fix false positive for
redefined-outer-namewhen aliasingtypinge.g. astand guarding imports undert.TYPE_CHECKING. Closes #7524 -
Fixed a crash of the
modified_iteratingchecker when iterating on a set defined as a class attribute. Closes #7528 -
Use
py-versionto determine if a message should be emitted for messages defined withmax-versionormin-version. Closes #7569 -
Improve
bad-thread-instantiationcheck to warn iftargetis not passed in as a keyword argument or as a second argument. Closes #7570 -
Fixes edge case of custom method named
nextraised an astroid error. Closes #7610 -
Fixed a multi-processing crash that prevents using any more than 1 thread on MacOS. The returned module objects and errors that were cached by the linter plugin loader cannot be reliably pickled. This means that
dillwould throw an error when attempting to serialise the linter object for multi-processing use. Closes #7635. -
Fix crash that happened when parsing files with unexpected encoding starting with 'utf' like
utf13. Closes #7661 -
Fix a crash when a child class with an
__init__method inherits from a parent class with an__init__class attribute. Closes #7742 -
Fix
valid-metaclass-classmethod-first-argdefault config value from "cls" to "mcs" which would cause both a false-positive and false-negative. Closes #7782 -
Fixes a crash in the
unnecessary_list_index_lookupcheck when usingenumeratewithstartand a class attribute. Closes #7821 -
Fixes a crash in
stop-iteration-returnwhen thenextbuiltin is called without arguments. Closes #7828 -
When pylint exit due to bad arguments being provided the exit code will now be the expected
32. Refs #7931 -
Fixes a
ModuleNotFoundexception when running pylint on a Django project with thepylint_djangoplugin enabled. Closes #7938 -
Fixed a crash when inferring a value and using its qname on a slice that was being incorrectly called. Closes #8067
-
Use better regex to check for private attributes. Refs #8081
-
Fix issue with new typing Union syntax in runtime context for Python 3.10+. Closes #8119
Other Changes
-
Pylint now provides basic support for Python 3.11. Closes #5920
-
Update message for
abstract-methodto include child class name. Closes #7124 -
Update Pyreverse's dot and plantuml printers to detect when class methods are abstract and show them with italic font. For the dot printer update the label to use html-like syntax. Closes #7346
-
The
docparamsextension now considers typing in Numpy style docstrings as "documentation" for themissing-param-docmessage. Refs #7398 -
Relevant
DeprecationWarningsare now raised withstacklevel=2, so they have the callsite attached in the message. Closes #7463 -
Add a
minimaloption topylint-configand its toml generator. Closes #7485 -
Add method name to the error messages of
no-method-argumentandno-self-argument. Closes #7507 -
Prevent leaving the pip install cache in the Docker image. Refs #7544
-
Add a keyword-only
compare_constantsargument tosafe_infer. Refs #7626 -
Add
default_enabledoption to optional message dict. Provides an option to disable a checker message by default. To use a disabled message, the user must enable it explicitly by adding the message to theenableoption. Refs #7629 -
Sort
--generated-rcfileoutput. Refs #7655 -
epylint is now deprecated and will be removed in pylint 3.0.0. All emacs and flymake related files were removed and their support will now happen in an external repository : https://github.com/emacsorphanage/pylint. Closes #7737
-
Adds test for existing preferred-modules configuration functionality. Refs #7957
Internal Changes
- Add and fix regression tests for plugin loading.
This shores up the tests that cover the loading of custom plugins as affected
by any changes made to the
sys.pathduring execution of aninit-hook. Given the existing contract of allowing plugins to be loaded by fiddling with the path in this way, this is now the last bit of work needed to close Github issue #7264. Closes #7264
v2.15.10
False Positives Fixed
-
Fix
use-sequence-for-iterationwhen unpacking a set with*.Closes #5788
-
Fix false positive
assigning-non-slotwhen a class attribute is re-assigned.Closes #6001
-
Fixes
used-before-assignmentfalse positive when the walrus operator is used in a ternary operator.Closes #7779
-
Prevent
used-before-assignmentwhen imports guarded byif TYPE_CHECKINGare guarded again when used.Closes #7979
Other Bug Fixes
-
Using custom braces in
msg-templatewill now work properly.Closes #5636
v2.15.9
False Positives Fixed
-
Fix false-positive for
used-before-assignmentin pattern matching with a guard.Closes #5327
Other Bug Fixes
-
Pylint will no longer deadlock if a parallel job is killed but fail immediately instead.
Closes #3899
-
When pylint exit due to bad arguments being provided the exit code will now be the expected
32.Refs #7931
-
Fixes a
ModuleNotFoundexception when running pylint on a Django project with thepylint_djangoplugin enabled.Closes #7938
v2.15.8
False Positives Fixed
-
Document a known false positive for
useless-suppressionwhen disablingline-too-longin a module with only comments and no code.Closes #3368
-
Fix
logging-fstring-interpolationfalse positive raised when logging and f-string with%sformatting.Closes #4984
-
Fixes false positive
abstract-methodon Protocol classes.Closes #7209
-
Fix
missing-param-docfalse positive when function parameter has an escaped underscore.Closes #7827
-
multiple-statementsno longer triggers for function stubs using inlined....Closes #7860
v2.15.7
False Positives Fixed
-
Fix
deprecated-methodfalse positive when alias for method is similar to name of deprecated method.Closes #5886
-
Fix a false positive for
used-before-assignmentfor imports guarded bytyping.TYPE_CHECKINGlater used in variable annotations.Closes #7609
Other Bug Fixes
-
Pylint will now filter duplicates given to it before linting. The output should be the same whether a file is given/discovered multiple times or not.
-
Fixes a crash in
stop-iteration-returnwhen thenextbuiltin is called without arguments.Closes #7828
v2.15.6
False Positives Fixed
-
Fix false positive for
unhashable-memberwhen subclassingdictand using the subclass as a dictionary key.Closes #7501
-
unnecessary-list-index-lookupwill not be wrongly emitted ifenumerateis called withstart.Closes #7682
-
Don't warn about
stop-iteration-returnwhen usingnext()overitertools.cycle.Closes #7765
Other Bug Fixes
-
Messages sent to reporter are now copied so a reporter cannot modify the message sent to other reporters.
Closes #7214
-
Fixes edge case of custom method named
nextraised an astroid error.Closes #7610
-
Fix crash that happened when parsing files with unexpected encoding starting with 'utf' like
utf13.Closes #7661
-
Fix a crash when a child class with an
__init__method inherits from a parent class with an__init__class attribute.Closes #7742
v2.15.5
What's new in Pylint 2.15.5?
Release date: 2022-10-21
False Positives Fixed
-
Fix a false positive for
simplify-boolean-expressionwhen multiple values are inferred for a constant.Closes #7626
Other Bug Fixes
-
Remove
__index__dunder method call fromunnecessary-dunder-callcheck.Closes #6795
-
Fixed a multi-processing crash that prevents using any more than 1 thread on MacOS.
The returned module objects and errors that were cached by the linter plugin loader cannot be reliably pickled. This means that
dillwould throw an error when attempting to serialise the linter object for multi-processing use.Closes #7635.
Other Changes
-
Add a keyword-only
compare_constantsargument tosafe_infer.Refs #7626
-
Sort
--generated-rcfileoutput.Refs #7655
v2.15.4
False Positives Fixed
-
Fix the message for
unnecessary-dunder-callfor__aiter__and__anext__. Also only emit the warning whenpy-version>= 3.10.Closes #7529
Other Bug Fixes
-
Fix bug in detecting
unused-variablewhen iterating on variable.Closes #3044
-
Fixed handling of
--as separator between positional arguments and flags. This was not actually fixed in 2.14.5. -
Report
no-self-argumentrather thanno-method-argumentfor methods with variadic arguments.Closes #7507
-
Fixed an issue where
syntax-errorcouldn't be raised on files with invalid encodings.Closes #7522
-
Fix false positive for
redefined-outer-namewhen aliasingtypinge.g. astand guarding imports undert.TYPE_CHECKING.Closes #7524
-
Fixed a crash of the
modified_iteratingchecker when iterating on a set defined as a class attribute.Closes #7528
-
Fix bug in scanning of names inside arguments to
typing.Literal. See https://peps.python.org/pep-0586/#literals-enums-and-forward-references for details.Refs #3299
Other Changes
-
Add method name to the error messages of
no-method-argumentandno-self-argument.Closes #7507
v2.15.3
-
Fixed a crash in the
unhashable-memberchecker when using alambdaas a dict key.Closes #7453
-
Fix a crash in the
modified-iterating-dictchecker involving instance attributes.Closes #7461
-
invalid-class-objectdoes not crash anymore when__class__is assigned alongside another variable.Closes #7467
-
Fix false positive for
global-variable-not-assignedwhen a global variable is re-assigned via anImportFromnode.Closes #4809
-
Fix false positive for
undefined-loop-variableinfor-elseloops that use a function having a return type annotation ofNoReturnorNever.Closes #7311
-
--help-msgnow accepts a comma-separated list of message IDs again.Closes #7471
v2.15.2
-
Fixed a case where custom plugins specified by command line could silently fail.
Specifically, if a plugin relies on the
init-hookoption changingsys.pathbefore it can be imported, this will now emit abad-plugin-valuemessage. Before this change, it would silently fail to register the plugin for use, but would load any configuration, which could have unintended effects.Fixes part of #7264.
-
Fix
used-before-assignmentfor functions/classes defined in type checking guard.Closes #7368
-
Update
modified_iteratingchecker to fix a crash withforloops on empty list.Closes #7380
-
The
docparamsextension now considers typing in Numpy style docstrings as "documentation" for themissing-param-docmessage.Refs #7398
-
Fix false positive for
unused-variableandunused-importwhen a name is only used in a string literal type annotation.Closes #3299
-
Fix false positive for
too-many-function-argswhen a function call is assigned to a class attribute inside the class where the function is defined.Closes #6592
-
Fix
used-before-assignmentfor functions/classes defined in type checking guard.Closes #7368
-
Fix ignored files being linted when passed on stdin.
Closes #4354
-
missing-return-doc,missing-raises-docandmissing-yields-docnow respect theno-docstring-rgxoption.Closes #4743
-
Don't crash on
OSErrorin config file discovery.Closes #7169
-
disable-nextis now correctly scoped to only the succeeding line.Closes #7401
-
Update
modified_iteratingchecker to fix a crash withforloops on empty list.Closes #7380
v2.15.0
In pylint 2.15.0, we added a new check missing-timeout to warn of default timeout values that could cause a program to be hanging indefinitely.
We improved pylint's handling of namespace packages. More packages should be linted without resorting to using the --recursive=y option.
We still welcome any community effort to help review, integrate, and add good/bad examples to the doc for PyCQA#5953. This should be doable without any pylint or astroid knowledge, so this is the perfect entrypoint if you want to contribute to pylint or open source without any experience with our code!
Internally, we changed the way we generate the release notes, thanks to DudeNr33. There will be no more conflict resolution to do in the changelog, and every contributor rejoice.
Marc Byrne became a maintainer, welcome to the team !
New Checks
-
Added new checker
missing-timeoutto warn of default timeout values that could cause a program to be hanging indefinitely.Refs #6780
False Positives Fixed
-
Don't report
super-init-not-calledfor abstract__init__methods.Closes #3975
-
Don't report
unsupported-binary-operationon Python <= 3.9 when using the|operator with types, if one has a metaclass that overloads__or__or__ror__as appropriate.Closes #4951
-
Don't report
no-value-for-parameterfor dataclasses fields annotated withKW_ONLY.Closes #5767
-
Fixed inference of
Enumswhen they are imported under an alias.Closes #5776
-
Prevent false positives when accessing
PurePath.parentsby index (not slice) on Python 3.10+.Closes #5832
-
unnecessary-list-index-lookupis now more conservative to avoid potential false positives.Closes #6896
-
Fix double emitting
trailing-whitespacefor multi-line docstrings.Closes #6936
-
import-errornow correctly checks forcontextlib.suppressguards on import statements.Closes #7270
-
Fix false positive for
no-self-argument/no-method-argumentwhen a staticmethod is applied to a function but uses a different name.Closes #7300
-
Fix
undefined-loop-variablewithbreakandcontinuestatements inelseblocks.Refs #7311
False Negatives Fixed
-
Emit
used-before-assignmentwhen relying on a name that is reimported later in a function.Closes #4624
-
Emit
used-before-assignmentfor self-referencing named expressions (:=) lacking prior assignments.Closes #5653
-
Emit
used-before-assignmentfor self-referencing assignments under if conditions.Closes #6643
-
Emit
modified-iterating-listand analogous messages for dicts and sets when iterating literals, or when using thedelkeyword.Closes #6648
-
Emit
used-before-assignmentwhen calling nested functions before assignment.Closes #6812
-
Emit
nonlocal-without-bindingwhen a nonlocal name has been assigned at a later point in the same scope.Closes #6883
-
Emit
using-constant-testwhen testing the truth value of a variable or call result holding a generator.Closes #6909
-
Rename
unhashable-dict-keytounhashable-memberand emit when creating sets and dicts, not just when accessing dicts.
Other Bug Fixes
-
Fix a failure to lint packages with
__init__.pycontained in directories lacking__init__.py.Closes #1667
-
Fixed a syntax-error crash that was not handled properly when the declared encoding of a file was
utf-9.Closes #3860
-
Fix a crash in the
not-callablecheck when there is ambiguity whether an instance is being incorrectly provided to__new__().Closes #7109
-
Fix crash when regex option raises a
re.errorexception.Closes #7202
-
Fix
undefined-loop-variablefrom walrus in comprehension test.Closes #7222
-
Check for
<cwd>before removing first item fromsys.pathinmodify_sys_path.Closes #7231
-
Fix sys.path pollution in parallel mode.
Closes #7246
-
Prevent
useless-parent-delegationfor delegating to a builtin written in C (e.g.Exception.__init__) with non-self arguments.Closes #7319
Other Changes
-
bad-exception-contexthas been renamed tobad-exception-causeas it is about the cause and not the context.Closes #3694
-
The message for
literal-comparisonis now more explicit about the problem and the solution.Closes #5237
-
useless-super-delegationhas been renamed touseless-parent-delegationin order to be more generic.Closes #6953
-
Pylint now uses
towncrierfor changelog generation.Refs #6974
-
Update
astroidto 2.12.Refs #7153
-
Fix crash when a type-annotated
__slots__with no value is declared.Closes #7280
Internal Changes
-
Fixed an issue where it was impossible to update functional tests output when the existing output was impossible to parse. Instead of raising an error we raise a warning message and let the functional test fail with a default value.
Refs #6891
-
pylint.testutils.primeris now a private API.Refs #6905
-
We changed the way we handle the changelog internally by using towncrier. If you're a contributor you won't have to fix merge conflicts in the changelog anymore.
Closes #6974
-
Pylint is now using Scorecards to implement security recommendations from the
OpenSSF <https://openssf.org/>_. This is done in order to secure our supply chains using a combination of automated tooling and best practices, most of which were already implemented before.Refs #7267
v2.14.5
-
Fixed a crash in the
undefined-loop-variablecheck whenenumerate()is used in a ternary expression.Closes #7131
-
Fixed handling of
--as separator between positional arguments and flags.Closes #7003
-
Fixed the disabling of
fixmeand its interaction withuseless-suppression. -
Allow lists of default values in parameter documentation for
Numpystyle.Closes #4035
v2.14.4
-
The
differing-param-doccheck was triggered by positional only arguments.Closes #6950
-
Fixed an issue where scanning
.directory recursively with--ignore-path=^path/to/diris not ignoring thepath/to/dirdirectory.Closes #6964
-
Fixed regression that didn't allow quoted
init-hooksin option files.Closes #7006
-
Fixed a false positive for
modified-iterating-dictwhen updating an existing key.Closes #6179
-
Fixed an issue where many-core Windows machines (>~60 logical processors) would hang when using the default jobs count.
Closes #6965
-
Fixed an issue with the recognition of
setup.cfgfiles. Only.cfgfiles that are exactly namedsetup.cfgrequire section names that start withpylint..Closes #3630
-
Don't report
import-private-namefor relative imports.Closes #7078
v2.14.3
-
Fixed two false positives for
bad-super-callfor calls that refer to a non-direct parent. -
Fixed a false positive for
useless-super-delegationfor subclasses that specify the number of of parameters against a parent that uses a variadic argument.Closes #2270
-
Allow suppressing
undefined-loop-variableandundefined-variablewithout raisinguseless-suppression. -
Fixed false positive for
undefined-variablefor__class__in inner methods.Closes #4032
v2.14.2
-
Fixed a false positive for
unused-variablewhen a function returns anargparse.Namespaceobject.Closes #6895
-
Avoided raising an identical
undefined-loop-variablemessage twice on the same line. -
Don't crash if
lint.run._query_cpu()is run within a Kubernetes Pod, that has only a fraction of a cpu core assigned. Just go with one process then.Closes #6902
-
Fixed a false positive in
consider-using-f-stringif the left side of a%is not a string.Closes #6689
-
Fixed a false positive in
unnecessary-list-index-lookupandunnecessary-dict-index-lookupwhen the subscript is updated in the body of a nested loop.Closes #6818
-
Fixed an issue with multi-line
init-hookoptions which did not record the line endings.Closes #6888
-
Fixed a false positive for
used-before-assignmentwhen a try block returns but an except handler defines a name via type annotation. -
--errors-onlyno longer enables previously disabled messages. It was acting as "emit all and only error messages" without being clearly documented that way.Closes #6811
v2.14.1
-
Avoid reporting
unnecessary-dict-index-lookuporunnecessary-list-index-lookupwhen the index lookup is part of a destructuring assignment.Closes #6788
-
Fixed parsing of unrelated options in
tox.ini.Closes #6800
-
Fixed a crash when linting
__new__()methods that return a call expression.Closes #6805
-
Don't crash if we can't find the user's home directory.
Closes #6802
-
Fixed false positives for
unused-importwhen aliasingtypinge.g. astand guarding imports undert.TYPE_CHECKING.Closes #3846
-
Fixed a false positive regression in 2.13 for
used-before-assignmentwhere it is safe to rely on a name defined only in anexceptblock because theelseblock returned.Closes #6790
-
Fixed the use of abbreviations for some special options on the command line.
Closes #6810
-
Fix a crash in the optional
pylint.extensions.private_importextension.Closes #6624
-
bad-option-value(E0012) is now a warningunknown-option-value(W0012). Deleted messages that do not exist anymore in pylint now raiseuseless-option-value(R0022) instead ofbad-option-value. This allows to distinguish between genuine typos and configuration that could be cleaned up. Existing message disables forbad-option-valuewill still work on both new messages.Refs #6794
v2.14.0
Summary -- Release highlights
With 2.14 pylint only supports Python version 3.7.2 and above.
We introduced several new checks among which duplicate-value for sets,
comparison-of-constants, and checks related to lambdas. We removed no-init and
made no-self-use optional as they were too opinionated. We also added an option
to generate a toml configuration: --generate-toml-config.
We migrated to argparse from optparse and refactored the configuration handling
thanks to Daniël van Noord. On the user side it should change the output of the
--help command, and some inconsistencies and bugs should disappear. The behavior
between options set in a config file versus on the command line will be more consistent. For us,
it will permit to maintain this part of the code easily in the future and anticipate
optparse's removal in Python 3.12.
As a result of the refactor there are a lot of internal deprecations. If you're a library maintainer that depends on pylint, please verify that you're ready for pylint 3.0 by activating deprecation warnings.
We continued the integration of pylint-error and are now at 33%!. We still welcome
any community effort to help review, integrate, and add good/bad examples in #5953.
This should be doable without any pylint or astroid knowledge, so this is the perfect
entrypoint if you want to contribute to pylint or open source without any experience
with our code!
New checkers
-
Added new checker
comparison-of-constants.Closes #6076
-
Added new checker
typevar-name-mismatch: TypeVar must be assigned to a variable with the same name as its name argument.Closes #5224
-
invalid-enum-extension: Used when a class tries to extend an inherited Enum class.Closes #5501
-
Added new checker
typevar-double-variance: The "covariant" and "contravariant" keyword arguments cannot both be set to "True" in a TypeVar.Closes #5895
-
Add new check
unnecessary-dunder-callfor unnecessary dunder method calls.Closes #5936
-
unnecessary-lambda-assignment: Lambda expression assigned to a variable. Define a function using the "def" keyword instead.unnecessary-direct-lambda-call: Lambda expression called directly. Execute the expression inline instead.Closes #5976
-
potential-index-error: Emitted when the index of a list or tuple exceeds its length. This checker is currently quite conservative to avoid false positives. We welcome suggestions for improvements.Closes #578
-
Added new checker
unnecessary-list-index-lookupfor indexing into a list while iterating overenumerate().Closes #4525
-
Added new message called
duplicate-valuewhich identifies duplicate values inside sets.Closes #5880
-
Added the
super-without-bracketschecker, raised when a super call is missing its brackets.Closes #4008
Removed checkers
-
The
no-init(W0232) warning has been removed. It's ok to not have an__init__in a class.Closes #2409
-
Removed the
assign-to-new-keywordmessage as there are no new keywords in the supported Python versions any longer.Closes #4683
-
Moved
no-self-usecheck to optional extension. You now need to explicitly enable this check usingload-plugins=pylint.extensions.no_self_use.Closes #5502
Extensions
-
RedefinedLoopNameChecker- Added optional extension
redefined-loop-nameto emit messages when a loop variable is redefined in the loop body.
Closes #5072
- Added optional extension
-
DocStringStyleChecker- Re-enable checker
bad-docstring-quotesfor Python <= 3.7.
Closes #6087
- Re-enable checker
-
NoSelfUseChecker- Added
no-self-usecheck, previously enabled by default.
Closes #5502
- Added
Other Changes
-
Started ignoring underscore as a local variable for
too-many-locals.Closes #6488
-
Pylint can now be installed with an extra-require called
spelling(pip install pylint[spelling]). This will addpyenchantto pylint's dependencies. You will still need to install the requirements forpyenchant(theenchantlibrary and any dictionaries) yourself. You will also need to set thespelling-dictoption.Refs #6462
-
Improved wording of the message of
deprecated-moduleCloses #6169
-
Pylintnow requires Python 3.7.2 or newer to run.Closes #4301
-
We made a greater effort to reraise failures stemming from the
astroidlibrary asAstroidError, with the effect that pylint emitsastroid-errorrather than merelyfatal. Regardless, please report any such issues you encounter! -
We have improved our recognition of inline disable and enable comments. It is now possible to disable
bad-option-valueinline (as long as you disable it before the bad option value is raised, i.e.disable=bad-option-value,bad-messagenotdisable=bad-message,bad-option-value) as well as certain other previously unsupported messages.Closes #3312
-
The main checker name is now
maininstead ofmaster. The configuration does not need to be updated as sections' name are optional.Closes #5467
-
Update
invalid-slots-objectmessage to show bad object rather than its inferred value.Closes #6101
-
Fixed a crash in the
not-an-iterablechecker involving multiple starred expressions inside a call.Closes #6372
-
Fixed a crash in the
unused-private-memberchecker involving chained private attributes.Closes #6709
-
Disable spellchecking of mypy rule names in ignore directives.
Closes #5929
-
implicit-str-concatwill now be raised on calls likeopen("myfile.txt" "a+b")too.Closes #6441
-
Fix a failure to respect inline disables for
fixmeoccurring on the last line of a module when pylint is launched with--enable=fixme. -
Removed the broken
generate-manoption. -
Fixed failure to enable
deprecated-moduleafter adisable=allby makingImportsCheckersolely responsible for emittingdeprecated-moduleinstead of sharing responsibility withStdlibChecker. (This could have led to double messages.) -
Added the
generate-toml-configoption.Refs #5462
-
bad-option-valuewill be emitted whenever a configuration value or command line invocation includes an unknown message.Closes #4324
-
Added the
unrecognized-optionmessage. Raised if we encounter any unrecognized options.Closes #5259
-
Fix false negative for
bad-string-format-typeif the value to be formatted is passed in as a variable holding a constant. -
The concept of checker priority has been removed.
-
The
cache-max-size-nonechecker has been renamed tomethod-cache-max-size-none.Closes #5670
-
The
method-cache-max-size-nonechecker will now also checkfunctools.cache.Closes #5670
-
BaseCheckerclasses now require thelinterargument to be passed. -
The
set_config_directlydecorator has been removed. -
Don't report
useless-super-delegationfor the__hash__method in classes that also override the__eq__method.Closes #3934
-
Fix falsely issuing
useless-suppressionon thewrong-import-positionchecker.Closes #5219
-
Fixed false positive
no-memberfor Enums with self-defined members.Closes #5138
-
Fix false negative for
no-memberwhen attempting to assign an instance attribute to itself without any prior assignment.Closes #1555
-
Changed message type from
redefined-outer-nametoredefined-loop-name(optional extension) for redefinitions of outer loop variables by inner loops.Closes #5608
-
By default the similarity checker will now ignore imports and ignore function signatures when computing duplication. If you want to keep the previous behaviour set
ignore-importsandignore-signaturestoFalse. -
Pylint now expands the user path (i.e.
~tohome/yusef/) and expands environment variables (i.e.home/$USER/$projecttohome/yusef/pylintforUSER=yusefandproject=pylint) for pyreverse'soutput-directory,import-graph,ext-import-graph,int-import-graphoptions, and the spell checker'sspelling-private-dict-fileoption.Refs #6493
-
Don't emit
unsubscriptable-objectfor string annotations. Pylint doesn't check if class is only generic in type stubs only. -
Fix pyreverse crash
RuntimeError: dictionary changed size during iterationRefs #6612
-
Fix syntax for return type annotations in MermaidJS diagrams produced with
pyreverse.Closes #6467
-
Fix type annotations of class and instance attributes using the alternative union syntax in
pyreversediagrams. -
Fix bug where it writes a plain text error message to stdout, invalidating output formats.
Closes #6597
-
The refactoring checker now also raises 'consider-using-a-generator' messages for
max(),min()andsum().Refs #6595
-
Update ranges for
using-constant-testandmissing-parentheses-for-call-in-testerror messages. -
Don't emit
no-memberinside type annotations withfrom __future__ import annotations.Closes #6594
-
Fix
unexpected-special-method-signaturefalse positive for__init_subclass__methods with one or more arguments.Closes #6644
Deprecations
-
The
ignore-mixin-membersoption has been deprecated. You should now use the newignored-checks-for-mixinsoption.Closes #5205
-
interfaces.implementshas been deprecated and will be removed in 3.0. Please use standard inheritance patterns instead of__implements__.Refs #2287
-
All
Interfaceclasses inpylint.interfaceshave been deprecated. You can subclass the respective normal classes to get the same behaviour. The__implements__functionality was based on a rejected PEP from 2001: https://peps.python.org/pep-0245/Closes #2287
-
MapReduceMixinhas been deprecated.BaseCheckernow implementsget_map_dataandreduce_map_data. If a checker actually needs to reduce data it should defineget_map_dataas returning something different thanNoneand let itsreduce_map_datahandle a list of the types returned byget_map_data. An example can be seen by looking atpylint/checkers/similar.py. -
The
configattribute ofBaseCheckerhas been deprecated. You can usechecker.linter.configto access the global configuration object instead of a checker-specific object.Refs #5392
-
The
levelattribute ofBaseCheckerhas been deprecated: everything is now displayed in--help, all the time.Refs #5392
-
The
set_optionmethod ofBaseCheckerhas been deprecated. You can usechecker.linter.set_optionto set an option on the global configuration object instead of a checker-specific object.Refs #5392
-
The
options_providersattribute ofArgumentsManagerhas been deprecated.Refs #5392
-
Fix saving of persistent data files in environments where the user's cache directory and the linted file are on a different drive.
Closes #6394
-
The
method-cache-max-size-nonechecker will now also checkfunctools.cache. -
The
configattribute ofPyLinteris now of theargparse.Namespacetype instead ofoptparse.Values.Refs #5392
-
UnsupportedActionhas been deprecated.Refs #5392
-
OptionsManagerMixInhas been deprecated.Refs #5392
-
OptionParserhas been deprecated.Refs #5392
-
Optionhas been deprecated.Refs #5392
-
OptionsProviderMixInhas been deprecated.Refs #5392
-
ConfigurationMixInhas been deprecated. -
The
option_groupsattribute ofPyLinterhas been deprecated.Refs #5392
-
get_global_confighas been deprecated. You can now access all global options fromchecker.linter.config.Refs #5392
-
OptionsManagerMixInhas been replaced withArgumentsManager.ArgumentsManageris considered private API and most methods that were public onOptionsManagerMixInhave now been deprecated and will be removed in a future release.Refs #5392
-
OptionsProviderMixInhas been replaced withArgumentsProvider.ArgumentsProvideris considered private API and most methods that were public onOptionsProviderMixInhave now been deprecated and will be removed in a future release.Refs #5392
-
pylint.pyreverse.ASTWalkerhas been removed, as it was only used internally by a single child class.Refs #6712
-
pyreverse: Resolving and displaying implemented interfaces that are defined by the__implements__attribute has been deprecated and will be removed in 3.0.Refs #6713
-
is_class_subscriptable_pep585_with_postponed_evaluation_enabledhas been deprecated. Useis_postponed_evaluation_enabled(node) and is_node_in_type_annotation_context(node)instead.Refs #6536
v2.13.9
2.13.9 is the last release supporting python interpreter between 3.6.2 and 3.7.2.
-
Respect ignore configuration options with
--recursive=y.Closes #6471
-
Fix false positives for
no-name-in-moduleandimport-errorfornumpy.distutilsandpydantic.Closes #6497
-
Fix
IndexErrorcrash inuninferable_final_decoratorsmethod.Relates to #6531
-
Fix a crash in
unnecessary-dict-index-lookupwhen subscripting an attribute.Closes #6557
-
Fix a crash when accessing
__code__and assigning it to a variable.Closes #6539
-
Fix a false positive for
undefined-loop-variablewhen usingenumerate().Closes #6593
v2.13.8
-
Fix a false positive for
undefined-loop-variablefor a variable used in a lambda inside the first of multiple loops.Closes #6419
-
Fix a crash when linting a file that passes an integer
mode=toopenCloses #6414
-
Avoid reporting
superfluous-parenson expressions using theis notoperator.Closes #5930
-
Fix a false positive for
undefined-loop-variablewhen theelseof aforloop raises or returns.Closes #5971
-
Fix false positive for
unused-variablefor classes inside functions and where a metaclass is provided via a call.Closes #4020
-
Fix false positive for
unsubscriptable-objectin Python 3.8 and below for statements guarded byif TYPE_CHECKING.Closes #3979
v2.13.7
-
Fix a crash caused by using the new config from 2.14.0 in 2.13.x code.
Closes #6408
v2.13.6
-
Fix a crash in the
unsupported-membership-testchecker when assigning multiple constants to class attributes including__iter__via unpacking.Closes #6366
-
Asterisks are no longer required in Sphinx and Google style parameter documentation for
missing-param-docand are parsed correctly. -
Fixed a false positive for
unused-variablewhen a builtin specified in--additional-builtinsis given a type annotation.Closes #6388
-
Fixed an
AstroidErrorin 2.13.0 raised by theduplicate-codechecker withignore-importsorignore-signaturesenabled.Closes #6301
v2.13.5
-
Fix false positive regression in 2.13.0 for
used-before-assignmentfor homonyms between variable assignments in try/except blocks and variables in subscripts in comprehensions. -
lru-cache-decorating-methodhas been renamed tocache-max-size-noneand will only be emitted whenmaxsizeisNone.Closes #6180
-
Fix false positive for
unused-importwhen disabling bothused-before-assignmentandundefined-variable.Closes #6089
-
Narrow the scope of the
unnecessary-ellipsischecker to:- functions & classes which contain both a docstring and an ellipsis.
- A body which contains an ellipsis
nodes.Exprnode & at least one other statement.
-
Fix false positive for
used-before-assignmentfor assignments taking place via nonlocal declarations after an earlier type annotation.Closes #5394
-
Fix crash for
redefined-slots-in-subclasswhen the type of the slot is not a const or a string.Closes #6100
-
Only raise
not-callablewhen all the inferred values of a property are not callable.Closes #5931
-
Fix a false negative for
subclassed-final-classwhen a set of other messages were disabled.
v2.13.4
-
Fix false positive regression in 2.13.0 for
used-before-assignmentfor homonyms between variable assignments in try/except blocks and variables in a comprehension's filter.Closes #6035
-
Include
testing_pylintrcin source and wheel distributions.Closes #6028
-
Fix crash in
super-init-not-calledchecker when usingctypes.Union.Closes #6027
-
Fix crash for
unneccessary-ellipsischecker when an ellipsis is used inside of a container or a lambda expression.
v2.13.3
-
Fix false positive for
unnecessary-ellipsiswhen using an ellipsis as a default argument.Closes #5973
-
Fix crash involving unbalanced tuple unpacking.
Closes #5998
-
Fix false positive for 'nonexistent-operator' when repeated '-' are separated (e.g. by parens).
Closes #5769
v2.13.2
-
Fix crash when subclassing a
namedtuple.Closes #5982
-
Fix false positive for
superfluous-parensfor patterns like "return (a or b) in iterable".Closes #5803
-
Fix a false negative regression in 2.13.0 where
protected-accesswas not raised on functions.Fixes #5989
-
Better error messages in case of crash if pylint can't write the issue template.
Refer to #5987
v2.13.1
-
Fix a regression in 2.13.0 where
used-before-assignmentwas emitted for the usage of a nonlocal in a try block.Fixes #5965
-
Avoid emitting
raising-bad-typewhen there is inference ambiguity on the variable being raised.Closes #2793
-
Loosen TypeVar default name pattern a bit to allow names with multiple uppercase characters. E.g.
HVACModeTorIPAddressT.Closes #5981
-
Fixed false positive for
unused-argumentwhen anonlocalname is used in a nested function that is returned without being called by its parent.Closes #5187
-
Fix program crash for
modified_iterating-list/set/dictwhen the list/dict/set being iterated through is a function call.Closes #5969
-
Don't emit
broken-noreturnandbroken-collections-callableerrors insideif TYPE_CHECKINGblocks.
v2.13.0: 2.13.0
-
Add missing dunder methods to
unexpected-special-method-signaturecheck. -
No longer emit
no-memberin for loops that referenceselfif the binary operation that started the for loop uses aselfthat is encapsulated in tuples or lists.Ref PyCQA/astroid#1360 Closes #4826
-
Output better error message if unsupported file formats are used with
pyreverse.Closes #5950
-
Fix pyreverse diagrams type hinting for classmethods and staticmethods.
-
Fix pyreverse diagrams type hinting for methods returning None.
-
Fix matching
--notesoptions that end in a non-word character.Closes #5840
-
Updated the position of messages for class and function defintions to no longer cover the complete definition. Only the
deforclass+ the name of the class/function are covered.Closes #5466
-
using-f-string-in-unsupported-versionandusing-final-decorator-in-unsupported-versionmsgids were renamed fromW1601andW1602toW2601andW2602. Disabling using these msgids will break. This is done in order to restore consistency with the already existing msgids forapply-builtinandbasestring-builtinfrom the now deleted python 3K+ checker. There is now a check that we're not using existing msgids or symbols from deleted checkers.Closes #5729
-
The line numbering for messages related to function arguments is now more accurate. This can require some message disables to be relocated to updated positions.
-
Add
--recursiveoption to allow recursive discovery of all modules and packages in subtree. Running pylint with--recursive=yoption will check all discovered.pyfiles and packages found inside subtree of directory provided as parameter to pylint.Closes #352
-
Add
modified-iterating-list,modified-iterating-dictandmodified-iterating-set, emitted when items are added to or removed from respectively a list, dictionary or set being iterated through.Closes #5348
-
Fix false-negative for
assignment-from-nonechecker using list.sort() method.closes #5722
-
New extension
import-private-name: indicate imports of external private packages and objects (prefixed with_). It can be loaded usingload-plugins=pylint.extensions.private_import.Closes #5463
-
Fixed crash from
arguments-differandarguments-renamedwhen methods were defined outside the top level of a class.Closes #5648
-
Removed the deprecated
check_docsextension. You can use thedocparamschecker to get the checks previously included incheck_docs.Closes #5322
-
Added a
testutilextra require to the packaging, asgitpythonshould not be a dependency all the time but is still required to use the primer helper code inpylint.testutil. You can install it withpip install pylint[testutil].Closes #5486
-
Reinstated checks from the python3 checker that are still useful for python 3 (
eq-without-hash). This is now in thepylint.extensions.eq_without_hashoptional extension.Closes #5025
-
Fixed an issue where
ungrouped-importscould not be disabled without raisinguseless-suppression.Ref #2366
-
Added several checkers to deal with unicode security issues (see
Trojan Sources <https://trojansource.codes/>_ andPEP 672 <https://www.python.org/dev/peps/pep-0672/>_ for details) that also concern the readability of the code. In detail the following checks were added:-
bad-file-encodingchecks that the file is encoded in UTF-8 as suggested byPEP8 <https://www.python.org/dev/peps/pep-0008/#id20>. UTF-16 and UTF-32 arenot supported by Python <https://bugs.python.org/issue1503789>at the moment. If this ever changesinvalid-unicode-codecchecks that they aren't used, to allow for backwards compatibility. -
bidirectional-unicodechecks for bidirectional unicode characters that could make code execution different than what the user expects. -
invalid-character-backspace,invalid-character-carriage-return,invalid-character-sub,invalid-character-esc,invalid-character-zero-width-spaceandinvalid-character-nulto check for possibly harmful unescaped characters.
Closes #5281
-
-
Use the
tomlipackage instead oftomlto parse.tomlfiles.
Closes #5885
- Fix false positive - Allow unpacking of
selfin a subclass oftyping.NamedTuple.
Closes #5312
- Fixed false negative
unpacking-non-sequencewhen value is an empty list.
Closes #5707
-
Better warning messages for useless else or elif when a function returns early.
Closes #5614
-
Fixed false positive
consider-using-dict-comprehensionwhen creating a dict using a list of tuples where key AND value vary depending on the same condition.Closes #5588
-
Fixed false positive for
global-variable-undefinedwhenglobalis used with a class nameCloses #3088
-
Fixed false positive for
unused-variablewhen anonlocalname is assigned as part of a multi-name assignment.Closes #3781
-
Fixed a crash in
unspecified-encodingchecker when providingNoneto themodeargument of anopen()call.Closes #5731
-
Fixed a crash involving a
NewTypenamed with an f-string.Closes #5770 Ref PyCQA/astroid#1400
-
Improved
bad-open-modemessage when providingNoneto themodeargument of anopen()call.Closes #5733
-
Added
lru-cache-decorating-methodchecker with checks for the use offunctools.lru_cacheon class methods. This is unrecommended as it creates memory leaks by never letting the instance getting garbage collected.Closes #5670
-
Fixed crash with recursion error for inference of class attributes that referenced the class itself.
Closes #5408 Ref PyCQA/astroid#1392
-
Fixed false positive for
unused-argumentwhen a method overridden in a subclass does nothing with the value of a keyword-only argument.Closes #5771 Ref PyCQA/astroid#1382
-
The issue template for crashes is now created for crashes which were previously not covered by this mechanism.
Closes #5668
-
Rewrote checker for
non-ascii-name. It now ensures all Python names are ASCII and also properly checks the names of imports (non-ascii-module-import) as well as file names (non-ascii-file-name) and emits their respective new warnings.Non ASCII characters could be homoglyphs (look alike characters) and hard to enter on a non specialized keyboard. See
Confusable Characters in PEP 672 <https://www.python.org/dev/peps/pep-0672/#confusable-characters-in-identifiers>_ -
When run in parallel mode
pylintnow pickles the data passed to subprocesses with thedillpackage. Thedillpackage has therefore been added as a dependency. -
An astroid issue where symlinks were not being taken into account was fixed
Closes #1470 Closes #3499 Closes #4302 Closes #4798 Closes #5081
-
Fix a crash in
unused-private-memberchecker when analyzing code usingtype(self)in bound methods.Closes #5569
-
Optimize parsing of long lines when
missing-final-newlineis enabled.Closes #5724
-
Fix false positives for
used-before-assignmentfrom using named expressions in a ternary operator test and using that expression as a call argument. -
Fix false positive for
undefined-variablewhennamedtupleclass attributes are used as return annotations.Closes #5568
-
Fix false negative for
undefined-variableand related variable messages when the same undefined variable is used as a type annotation and is accessed multiple times, or is used as a default argument to a function.Closes #5399
-
Pyreverse - add output in mermaidjs format
-
Emit
used-before-assignmentinstead ofundefined-variablewhen attempting to access unused type annotations.Closes #5713
-
Added confidence level
CONTROL_FLOWfor warnings relying on assumptions about control flow. -
used-before-assignmentnow considers that assignments in a try block may not have occurred when the except or finally blocks are executed. -
Fixed false negative for
used-before-assignmentwhen a conditional or context manager intervened before the try statement that suggested it might fail.Closes #4045
-
Fixed false negative for
used-before-assignmentin finally blocks if an except handler did not define the assignment that might have failed in the try block. -
Fixed extremely long processing of long lines with comma's.
Closes #5483
-
Fixed crash on properties and inherited class methods when comparing them for equality against an empty dict.
Closes #5646
-
Fixed a false positive for
assigning-non-slotwhen the slotted class defined__setattr__.Closes #3793
-
Fixed a false positive for
invalid-class-objectwhen the object being assigned to the__class__attribute is uninferable. -
Fixed false positive for
used-before-assignmentwith self-referential type annotation in conditional statements within class methods.Closes #5499
-
Add checker
redefined-slots-in-subclass: Emitted when a slot is redefined in a subclass.Closes #5617
-
Fixed false positive for
global-variable-not-assignedwhen thedelstatement is usedCloses #5333
-
By default, pylint does no longer take files starting with
.#into account. Those are consideredemacs file locks. See https://www.gnu.org/software/emacs/manual/html_node/elisp/File-Locks.html. This behavior can be reverted by redefining theignore-patternsoption.Closes #367
-
Fixed a false positive for
used-before-assignmentwhen a named expression appears as the first value in a container.Closes #5112
-
used-before-assignmentnow assumes that assignments in except blocks may not have occurred and warns accordingly.Closes #4761
-
When evaluating statements after an except block,
used-before-assignmentassumes that assignments in the except blocks took place if the corresponding try block contained a return statement.Closes #5500
-
Fixed a false negative for
used-before-assignmentwhen some but not all except handlers defined a name relied upon after an except block when the corresponding try block contained a return statement.Closes #5524
-
When evaluating statements in the
elseclause of a loop,used-before-assignmentassumes that assignments in the except blocks took place if the except handlers constituted the only ways for the loop to finish without breaking early.Closes #5683
-
used-before-assignmentnow checks names in try blocks. -
Fixed false positive with
used-before-assignmentfor assignment expressions in lambda statements. -
Fixed a false positive (affecting unreleased development) for
used-before-assignmentinvolving homonyms between filtered comprehensions and assignments in except blocks.Closes #5586
-
Fixed crash with slots assignments and annotated assignments.
Closes #5479
-
Fixed crash on list comprehensions that used
typeas inner variable name.Closes #5461
-
Fixed crash in
use-maxsplit-argchecker when providing thesepargument tostr.split()by keyword.Closes #5737
-
Fix false positive for
unused-variablefor a comprehension variable matching an outer scope type annotation.Closes #5326
-
Fix false negative for
undefined-variablefor a variable used multiple times in a comprehension matching an unused outer scope type annotation.Closes #5654
-
Some files in
pylint.testutilswere deprecated. In the future imports should be done from thepylint.testutils.functionalnamespace directly. -
Fixed false positives for
no-value-for-parameterwith variadic positional arguments.Closes #5416
-
safe_inferno longer makes an inference when given two function definitions with differing numbers of arguments.Closes #3675
-
Fix
comparison-with-callablefalse positive for callables that raise, such as typing constants.Closes #5557
-
Fixed a crash on
__init__nodes when the attribute was previously uninferable due to a cache limit size. This limit can be hit when the inheritance pattern of a class (and therefore of the__init__attribute) is very large.Closes #5679
-
Fix false positive for
used-before-assignmentfrom a class definition nested under a function subclassing a class defined outside the function.Closes #4590
-
Fix
unnecessary_dict_index_lookupfalse positive when deleting a dictionary's entry.Closes #4716
-
Fix false positive for
used-before-assignmentwhen an except handler shares a name with a test in a filtered comprehension.Closes #5817
-
Fix crash in
unnecessary-dict-index-lookupchecker if the output ofitems()is assigned to a 1-tuple.Closes #5504
-
When invoking
pylint,epylint,symilarorpyreverseby importing them in a python file you can now pass anargvkeyword besides patchingsys.argv.Closes #5320
-
The
PyLinterclass will now be initialized with aTextReporteras its reporter if none is provided. -
Fix
super-init-not-calledwhen parent orselfis aProtocolCloses #4790
-
Fix false positive
not-callablewith attributes that aliasNamedTuplePartially closes #1730
-
Emit
redefined-outer-namewhen a nested except handler shadows an outer one. -
Fix false positive
super-init-not-calledfor classes that inherit theirinitfrom a parent.Closes #4941
-
encodingcan now be supplied as a positional argument to calls that open files without triggeringunspecified-encoding.Closes #5638
-
Fatal errors now emit a score of 0.0 regardless of whether the linted module contained any statements
Closes #5451
-
fatalwas added to the variables permitted in score evaluation expressions. -
The default score evaluation now uses a floor of 0.
Closes #2399
-
Fix false negative for
consider-iterating-dictionaryduring membership checks encapsulated in iterables ornot inchecksCloses #5323
-
Fixed crash on uninferable decorators on Python 3.6 and 3.7
-
Add checker
unnecessary-ellipsis: Emitted when the ellipsis constant is used unnecessarily.Closes #5460
-
Disable checker
bad-docstring-quotesfor Python <= 3.7, because in these versions the line numbers for decorated functions and classes are not reliable which interferes with the checker.Closes #3077
-
Fixed incorrect classification of Numpy-style docstring as Google-style docstring for docstrings with property setter documentation. Docstring classification is now based on the highest amount of matched sections instead of the order in which the docstring styles were tried.
-
Fixed detection of
arguments-differwhen superclass static methods lacked a@staticmethoddecorator.Closes #5371
-
TypingChecker-
Added new check
broken-noreturnto detect broken uses oftyping.NoReturnifpy-versionis set to Python3.7.1or below. https://bugs.python.org/issue34921 -
Added new check
broken-collections-callableto detect broken uses ofcollections.abc.Callableifpy-versionis set to Python3.9.1or below. https://bugs.python.org/issue42965
-
-
The
testutilsfor unittests now acceptend_linenoandend_column. Tests without these will trigger aDeprecationWarning. -
arguments-differwill no longer complain about method redefinitions with extra parameters that have default values. -
Fixed false positive
unexpected-keyword-argfor decorators.Closes #258
-
Importing the deprecated stdlib module
xml.etree.cElementTreenow emitsdeprecated_module.Closes #5862
-
Disables for
deprecated-moduleand similar warnings for stdlib features deprecated in newer versions of Python no longer raiseuseless-suppressionwhen linting with older Python interpreters where those features are not yet deprecated. -
Importing the deprecated stdlib module
distutilsnow emitsdeprecated_moduleon Python 3.10+. -
missing-raises-docwill now check the class hierarchy of the raised exceptions.. code-block:: python
def my_function() """My function.
Raises: Exception: if something fails """ raise ValueErrorCloses #4955
-
Allow disabling
duplicate-codewith a disable comment when running through pylint.Closes #214
-
Improve
invalid-namecheck forTypeVarnames. The accepted pattern can be customized with--typevar-rgx.Closes #3401
-
Added new checker
typevar-name-missing-variance. Emitted when a covariant or contravariantTypeVardoes not end with_coor_contrarespectively or when aTypeVaris not either but has a suffix. -
Allow usage of mccabe 0.7.x release
Closes #5878
-
Fix
unused-private-memberfalse positive when accessing private methods throughproperty.Closes #4756
v2.12.2
-
Fixed a false positive for
unused-importwhere everything was not analyzed properly inside typing guards. -
Fixed a false-positive regression for
used-before-assignmentfor typed variables in the body of class methods that reference the same classCloses #5342
-
Specified that the
ignore-pathsoption considers "" to represent a windows directory delimiter instead of a regular expression escape character. -
Fixed a crash with the
ignore-pathsoption when invoking the option via the command line.Closes #5437
-
Fixed handling of Sphinx-style parameter docstrings with asterisks. These should be escaped with by prepending a "".
Closes #5406
-
Add
endLineandendColumnkeys to output ofJSONReporter.Closes #5380
-
Fixed handling of Google-style parameter specifications where descriptions are on the line following the parameter name. These were generating false positives for
missing-param-doc.Closes #5452
-
Fix false negative for
consider-iterating-dictionaryduring membership checks encapsulated in iterables ornot inchecksCloses #5323
-
unused-importnow check all ancestors for typing guardsCloses #5316
v2.12.1: 2.12.1
-
Require Python
3.6.2to run pylint.Closes #5065
v2.12.0: 2.12.0
-
Upgrade astroid to 2.9.0
Closes #4982
-
Add ability to add
end_lineandend_columnto the--msg-templateoption. With the standardTextReporterthis will add the line and column number of the end of a node to the output of Pylint. If these numbers are unknown, they are represented by an empty string. -
Introduced primer tests and a configuration tests framework. The helper classes available in
pylint/testutil/are still unstable and might be modified in the near future. -
Fix
install graphizmessage which isn't needed for puml output format. -
MessageTestof the unittesttestutilnow requires theconfidenceattribute to match the expected value. If none is provided it is set toUNDEFINED. -
add_messageof the unittesttestutilnow actually handles thecol_offsetparameter and allows it to be checked against actual output in a test. -
Fix a crash in the
check_elifextensions where an undetected if in a comprehension with an if statement within a f-string resulted in an out of range error. The checker no longer relies on counting if statements anymore and uses known if statements locations instead. It should not crash on badly parsed if statements anymore. -
Fix
simplify-boolean-expressionwhen condition can be inferred as False.Closes #5200
-
Fix exception when pyreverse parses
property functionof a class. -
The functional
testutilsnow acceptend_linenoandend_column. Expected output files without these will trigger aDeprecationWarning. Expected output files can be easily updated with thepython tests/test_functional.py --update-functional-outputcommand. -
The functional
testutilsnow correctly check the distinction betweeenHIGHandUNDEFINEDconfidence. Expected output files without defiendconfidencelevels will now trigger aDeprecationWarning. Expected output files can be easily updated with thepython tests/test_functional.py --update-functional-outputcommand. -
The functional test runner now supports the option
min_pyver_end_positionto control on which python versions theend_linenoandend_columnattributes should be checked. The default value is 3.8. -
Fix
accept-no-yields-docandaccept-no-return-docnot allowing missingyieldorreturndocumentation when a docstring is partially correctCloses #5223
-
Add an optional extension
consider-using-any-or-all: Emitted when aforloop only produces a boolean and could be replaced byanyorallusing a generator. Also suggests a suitable any or all statement.Closes #5008
-
Properly identify parameters with no documentation and add new message called
missing-any-param-docCloses #3799
-
Add checkers
overridden-final-method&subclassed-final-classCloses #3197
-
Fixed
protected-accessfor accessing of attributes and methods of inner classesCloses #3066
-
Added support for
ModuleNotFoundError(import-errorandno-name-in-module).ModuleNotFoundErrorinherits fromImportErrorand was added in Python3.6 -
undefined-variablenow correctly flags variables which only receive a type annotations and never get assigned a valueCloses #5140
-
undefined-variablenow correctly considers the line numbering and order of classes used in metaclass declarationsCloses #4031
-
used-before-assignmentnow correctly considers references to classes as type annotation or default values in first-level methodsCloses #3771
-
undefined-variableandunused-variablenow correctly trigger for assignment expressions in functions defaultsFixes part of #3688
-
undefined-variablenow correctly triggers for assignment expressions in if ... else statements This includes a basic form of control flow inference for if ... else statements using constant boolean valuesCloses #3688
-
Added the
--enable-all-extensionscommand line option. It will load all available extensions which can be listed by running--list-extensions -
Fix bug with importing namespace packages with relative imports
-
Improve and flatten
unused-wildcard-importmessageCloses #3859
-
In length checker,
len-as-conditionhas been renamed asuse-implicit-booleaness-not-lenin order to be consistent withuse-implicit-booleaness-not-comparison. -
Created new
UnsupportedVersionCheckerchecker class that includes checks for features not supported by all versions indicated by apy-version.- Added
using-f-string-in-unsupported-versionchecker. Issued whenpy-versionis set to a version that does not support f-strings (< 3.6)
- Added
-
Fix
useless-super-delegationfalse positive when default keyword argument is a variable. -
Properly emit
duplicate-keywhen Enum members are duplicate dictionary keysCloses #5150
-
Use
py-versionsetting for alternative union syntax check (PEP 604), instead of the Python interpreter version. -
Subclasses of
dictare regarded as reversible by thebad-reversed-sequencechecker (Python 3.8 onwards).Closes #4981
-
Support configuring mixin class pattern via
mixin-class-rgx -
Added new checker
use-implicit-booleaness-not-comparison: Emitted when collection literal comparison is being used to check for emptiness.Closes #4774
-
mising-param-docnow correctly parses asterisks for variable length and keyword parametersCloses #3733
-
mising-param-docnow correctly handles Numpy parameter documentation without explicit typingCloses #5222
-
pylintno longer crashes when checking assignment expressions within if-statementsCloses #5178
-
Update ``literal-comparison``` checker to ignore tuple literals
Closes #3031
-
Normalize the input to the
ignore-pathsoption to allow both Posix and Windows pathsCloses #5194
-
Fix double emitting of
not-callableon inferrablepropertiesCloses #4426
-
self-cls-assignmentnow also considers tuple assignment -
Fix
missing-function-docstringnot being able to check__init__and other magic methods even if theno-docstring-rgxsetting was set to do so -
Added
using-final-decorator-in-unsupported-versionchecker. Issued whenpy-versionis set to a version that does not supporttyping.final(< 3.8) -
Added configuration option
exclude-too-few-public-methodsto allow excluding classes from themin-public-methodschecker.Closes #3370
-
The
--jobsparameter now fallbacks to 1 if the host operating system does not have functioning shared semaphore implementation.Closes #5216
-
Fix crash for
unused-private-memberwhen checking private members on__class__Closes #5261
-
Crashes when a list is encountered in a toml configuration do not happen anymore.
Closes #4580
-
Moved
misplaced-comparison-constantto its own extensioncomparison_placement. This checker was opinionated and now no longer a default. It can be reactived by addingpylint.extensions.comparison_placementtoload-pluginsin your config.Closes #1064
-
A new
bad-configuration-sectionchecker was added that will emit for misplaced option in pylint's top level namespace for toml configuration. Top-level dictionaries or option defined in the wrong section will still silently not be taken into account, which is tracked in a follow-up issue.Follow-up in #5259
-
Fix crash for
protected-accesson (outer) class traversal -
Added new checker
useless-with-lockto find incorrect usage of with statement and threading module locks. Emitted whenwith threading.Lock():is used instead ofwith lock_instance:.Closes #5208
-
Make yn validator case insensitive, to allow for
TrueandFalsein config files. -
Fix crash on
open()calls when themodeargument is not a simple string.Partially closes #5321
-
Inheriting from a class that implements
__class_getitem__no longer raisesinherit-non-class. -
Pyreverse - Add the project root directory to sys.path
Closes #2479
-
Don't emit
consider-using-f-stringifpy-versionis set to Python <3.6.f-stringswere added in Python3.6Closes #5019
-
Fix regression for
unspecified-encodingwithpathlib.Path.read_text()Closes #5029
-
Don't emit
consider-using-f-stringif the variables to be interpolated include a backslash -
Fixed false positive for
cell-var-from-loopwhen variable is used as the default value for a keyword-only parameter.Closes #5012
-
Fix false-positive
undefined-variablewithLambda,IfExp, and assignment expression. -
Fix false-positive
useless-suppressionforwrong-import-orderCloses #2366
-
Fixed
tomldependency issueCloses #5066
-
Fix false-positive
useless-suppressionforline-too-longCloses #4212
-
Fixed
invalid-namenot checking parameters of overwritten baseobjectmethodsCloses #3614
-
Fixed crash in
consider-using-f-stringifformatis not calledCloses #5058
-
Fix crash with
AssignAttrinif TYPE_CHECKINGblocks.Closes #5111
-
Improve node information for
invalid-nameon function argument. -
Prevent return type checkers being called on functions with ellipses as body
Closes #4736
-
Add
is_sys_guardandis_typing_guardhelper functions from astroid topylint.checkers.utils. -
Fix regression on ClassDef inference
-
Fix regression on Compare node inference
Closes #5048
-
Fix false-positive
isinstance-second-argument-not-valid-typewithtyping.Callable. -
It is now recommended to do
pylintdevelopment onPython3.8 or higher. This allows using the latestastparser. -
All standard jobs in the
pylintCI now run onPython3.8 by default. We still support python 3.6 and 3.7 and run tests for those interpreters. -
TypingChecker- Fix false-negative for
deprecated-typing-aliasandconsider-using-aliaswithtyping.Type+typing.Callable.
- Fix false-negative for
v2.11.1
-
unspecified-encodingnow checks the encoding ofpathlib.Path()correctlyCloses #5017
v2.11.0
-
The python3 porting mode checker and it's
py3koption were removed. You can still find it in older pylint versions. -
raising-bad-typeis now properly emitted when raising a string -
Added new extension
SetMembershipCheckerwithuse-set-for-membershipcheck: Emitted when using an in-place definedlistortupleto do a membership test.setsare better optimized for that.Closes #4776
-
Added
py-versionconfig key (if[MASTER]section). Used for version dependant checks. Will default to whatever Python version pylint is executed with. -
CodeStyleChecker-
Added
consider-using-assignment-expr: Emitted when an assignment is directly followed by an if statement and both can be combined by using an assignment expression:=. Requires Python 3.8Closes #4862
-
-
Added
consider-using-f-string: Emitted when .format() or '%' is being used to format a string.Closes #3592
-
Fix false positive for
consider-using-withif a context manager is assigned to a variable in different paths of control flow (e. g. if-else clause).Closes #4751
-
https is now prefered in the documentation and http://pylint.pycqa.org correctly redirect to https://pylint.pycqa.org
Closes #3802
-
Fix false positive for
function-redefinedfor simple type annotationsCloses #4936
-
Fix false positive for
protected-accessif a protected member is used in type hints of function definitions -
Fix false positive
dict-iter-missing-itemsfor dictionaries only using tuples as keysCloses #3282
-
The
unspecified-encodingchecker now also checks calls topathlib.Path().read_text()andpathlib.Path().write_text()Closes #4945
-
Fix false positive
superfluous-parensfor tuples created with inner tuplesCloses #4907
-
Fix false positive
unused-private-memberfor accessing attributes in a class usingclsCloses #4849
-
Fix false positive
unused-private-memberfor private staticmethods accessed in classmethods.Closes #4849
-
Extended
consider-using-incheck to work for attribute access. -
Setting
min-similarity-linesto 0 now makes the similarty checker stop checking for duplicate codeCloses #4901
-
Fix a bug where pylint complained if the cache's parent directory does not exist
Closes #4900
-
The
global-variable-not-assignedchecker now catches global variables that are never reassigned in a local scope and catches (reassigned) functions -
Fix false positives for invalid-all-format that are lists or tuples at runtime
Closes #4711
-
Fix
no-self-useanddocparams extensionfor async functions and methods. -
Add documentation for
pyreverseandsymilarCloses #4616
-
Non symbolic messages with the wrong capitalisation now correctly trigger
use-symbolic-message-insteadCloses #5000
-
The
consider-iterating-dictionarychecker now also considers membership checksCloses #4069
-
The
invalid-namemessage is now more detailed when using multiple naming style regexes.
v2.10.2
-
We now use platformdirs instead of appdirs since the latter is not maintained.
Closes #4886
-
Fix a crash in the checker raising
shallow-copy-environwhen failing to infer oncopy.copyCloses #4891
v2.10.1
-
pylint does not crash when PYLINT_HOME does not exist.
Closes #4883
v2.10.0
-
pyreverse: add option to produce colored output.
Closes #4488
-
pyreverse: add output in PlantUML format.
Closes #4498
-
consider-using-withis no longer triggered if a context manager is returned from a function.Closes #4748
-
pylint does not crash with a traceback anymore when a file is problematic. It creates a template text file for opening an issue on the bug tracker instead. The linting can go on for other non problematic files instead of being impossible.
-
pyreverse: Show class has-a relationships inferred from the type-hint
Closes #4744
-
Fixed a crash when importing beyond the top level package during
import-errormessage creationCloses #4775
-
Added
ignored-parentsoption to the design checker to ignore specific classes from thetoo-many-ancestorscheck (R0901).Partially closes #3057
-
Added
unspecified-encoding: Emitted when open() is called without specifying an encodingCloses #3826
-
Improved the Similarity checker performance. Fix issue with
--min-similarity-linesused with--jobs. -
Don't emit
no-membererror if guarded behind if statement. -
The default for
PYLINTHOMEis now the standardXDG_CACHE_HOME, and pylint now usesappdirs.Closes #3878
-
Added
use-list-literal: Emitted whenlist()is called with no arguments instead of using[]Closes #4365
-
Added
use-dict-literal: Emitted whendict()is called with no arguments instead of using{}Closes #4365
-
Added optional extension
consider-ternary-expression: Emitted whenever a variable is assigned in both branches of an if/else block.Closes #4366
-
Added optional extension
while-used: Emitted whenever awhileloop is used.Closes #4367
-
Added
forgotten-debug-statement: Emitted whenbreakpoint,pdb.set_traceorsys.breakpointhookcalls are foundCloses #3692
-
Fix false-positive of
unused-private-memberwhen using nested functions in a classCloses #4673
-
Fix crash for
unused-private-memberthat occurred with nested attributes.Closes #4755
-
Fix a false positive for
unused-private-memberwith class namesCloses #4681
-
Fix false positives for
superfluous-parenswith walrus operator, ternary operator and inside list comprehension. -
Added
format-string-without-interpolationchecker: Emitted when formatting is applied to a string without any variables to be replacedCloses #4042
-
Refactor of
--list-msgs&--list-msgs-enabled: both options now show whether messages are emittable with the current interpreter.Closes #4778
-
Fix false negative for
used-before-assignmentwhen the variable is assigned in an exception handler, but used outside of the handler.Closes #626
-
Added
disable-nextoption: allows using# pylint: disable-next=msgidto disable a message for the following lineCloses #1682
-
Added
redundant-u-string-prefixchecker: Emitted when the u prefix is added to a stringCloses #4102
-
Fixed
cell-var-from-loopchecker: handle cell variables in comprehensions within functions, and function default argument expressions. Also handle basic variable shadowing. -
Fixed bug with
cell-var-from-loopchecker: it no longer has false negatives when bothunused-variableandused-before-assignmentare disabled. -
Fix false postive for
invalid-all-formatif the list or tuple builtin functions are usedCloses #4711
-
Config files can now contain environment variables
Closes #3839
-
Fix false-positive
used-before-assignmentwith an assignment expression in aReturnnodeCloses #4828
-
Added
use-sequence-for-iteration: Emitted when iterating over an in-place definedset. -
CodeStyleChecker-
Limit
consider-using-tupleto be emitted only for in-place definedlists. -
Emit
consider-using-tupleeven if list contains astarredexpression.
-
-
Ignore decorators lines by similarities checker when ignore signatures flag enabled
Closes #4839
-
Allow
trueandfalsevalues inpylintrcfor better compatibility withtomlconfig. -
Class methods' signatures are ignored the same way as functions' with similarities "ignore-signatures" option enabled
Closes #4653
-
Improve performance when inferring
Callnodes, by utilizing caching. -
Improve error message for invalid-metaclass when the node is an Instance.
v2.9.6
-
Fix a false positive
undefined-variablewhen variable name in decoration matches function argumentCloses #3791
v2.9.5
-
Fix a crash when there would be a 'TypeError object does not support item assignment' in the code we parse.
Closes #4439
-
Fix crash if a callable returning a context manager was assigned to a list or dict item
Closes #4732
-
Fix a crash when a AttributeInferenceError was not handled properly when failing to infer the real name of an import in astroid.
Closes #4692
v2.9.4
-
Added
time.clockto deprecated functions/methods for python 3.3 -
Fix bug in which --fail-on can return a zero exit code even when the specified issue is present
-
Fix hard failure when handling missing attribute in a class with duplicated bases
Closes #4687
-
Fix false-positive
consider-using-with(R1732) if a ternary conditional is used together withwithCloses #4676
-
Fix false-positive
deprecated-modulewhen relative import uses deprecated module name.Closes #4629
-
Fix false-positive
consider-using-with(R1732) ifcontextlib.ExitStacktakes care of calling the__exit__methodCloses #4654
-
Fix a false positive for
unused-private-memberwhen mutating a private attribute withclsCloses #4657
-
Fix ignored empty functions by similarities checker with "ignore-signatures" option enabled
Closes #4652
-
Fix false-positive of
use-maxsplit-argwhen index is incremented in a loopCloses #4664
-
Don't emit
cyclic-importmessage if import is guarded bytyping.TYPE_CHECKING.Closes #3525
-
Fix false-positive
not-callablewith alternativeTypedDictsyntaxCloses #4715
-
Clarify documentation for consider-using-from-import
-
Don't emit
unreachablewarning for empty generator functionsCloses #4698
-
Don't emit
import-error,no-name-in-module, andungrouped-importsfor imports guarded bysys.version_infoortyping.TYPE_CHECKING. -
Fix
invalid-overridden-methodwith nested propertyCloses #4368
-
Fix false-positive of
unused-private-memberwhen using__new__in a classCloses #4668
-
No longer emit
consider-using-withforThreadPoolExecutorandProcessPoolExecutoras they have legitimate use cases without awithblock.Closes #4689
-
Fix crash when inferring variables assigned in match patterns
Closes #4685
-
Fix a crash when a StopIteration was raised when inferring a faulty function in a context manager.
Closes #4723
v2.9.3
-
Fix a crash that happened when analyzing empty function with docstring in the
similaritychecker.Closes #4648
-
The
similaritychecker no longer add three trailing whitespaces for empty lines in its report.
v2.9.2
-
Fix a crash that happened when analysing code using
type(self)to access a class attribute in theunused-private-memberchecker.Closes #4638
-
Fix a false positive for
unused-private-memberwhen accessing a private variable withselfCloses #4644
-
Fix false-positive of
unnecessary-dict-index-lookupandconsider-using-dict-itemsfor reassigned dict index lookupsCloses #4630
v2.9.1
v2.9.0
-
Python 3.10 is now supported.
-
Add type annotations to pyreverse dot files
Closes #1548
-
Fix missing support for detecting deprecated aliases to existing functions/methods.
Closes #4618
-
astroid has been upgraded to 2.6.1
-
Added various deprecated functions/methods for python 3.10, 3.7, 3.6 and 3.3
-
Fix false positive
useless-type-docon ignored argument usingpylint.extensions.docparamswhen a function was typed using pep484 but not inside the docstring. -
setuptools_scmhas been removed and replaced bytbumpin order to not have hidden runtime dependencies to setuptools -
Fix a crash when a test function is decorated with
@pytest.fixtureand astroid can't infer the name of the decorator when usingopenwithoutwith.Closes #4612
-
Added
deprecated-decorator: Emitted when deprecated decorator is used.Closes #4429
-
Added
ignore-pathsbehaviour. Defined regex patterns are matched against full file path.Close #2541
-
Fix false negative for
consider-using-withif calls likeopen()were used outside of assignment expressions. -
The warning for
arguments-differnow signals explicitly the difference it detected by naming the argument or arguments that changed and the type of change that occurred. -
Suppress
consider-using-withinside context managers.Closes #4430
-
Added
--fail-onoption to return non-zero exit codes regardless of--fail-undervalue. -
numversion tuple contains integers again to fix multiple pylint's plugins that relied on it
Closes #4420
-
Fix false-positive
too-many-ancestorswhen inheriting from builtin classes, especially from thecollections.abcmodule -
Stdlib deprecated modules check is moved to stdlib checker. New deprecated modules are added.
-
Fix raising false-positive
no-memberon abstract properties -
Created new error message called
arguments-renamedwhich identifies any changes at the parameter names of overridden functions.Closes #3536
-
New checker
consider-using-dict-items. Emitted when iterating over dictionary keys and then indexing the same dictionary with the key within loop body.Closes #3389
-
Don't emit
import-errorif import guarded behindif sys.version_info >= (x, x) -
Fix incompatibility with Python 3.6.0 caused by
typing.Counterandtyping.NoReturnusageCloses #4412
-
New checker
use-maxsplit-arg. Emitted either when accessing only the first or last element ofstr.split().Closes #4440
-
Add ignore_signatures to duplicate code checker
Closes #3619
-
Fix documentation errors in "Block disables" paragraph of User Guide.
-
New checker
unnecessary-dict-index-lookup. Emitted when iterating over dictionary items (key-value pairs) and accessing the value by index lookup.Closes #4470
-
New checker
consider-using-from-import. Emitted when a submodule/member of a package is imported and aliased with the same name.Closes #2309
-
Allow comma-separated list in
output-formatand separate output files for each specified format.Closes #1798
-
Make
using-constant-testdetect constant tests consisting of list literals like[]and[1, 2, 3]. -
Improved error message of
unnecessary-comprehensionchecker by providing code suggestion.Closes #4499
-
New checker
unused-private-member. Emitted when a private member (i.e., starts with__) of a class is defined but not used.Closes #4483
-
Fix false negative of
consider-using-enumeratewhen iterating over an attribute.Closes #3657
-
New checker
invalid-class-object. Emitted when a non-class is assigned to a__class__attribute.Closes #585
-
Fix a crash when a plugin from the configuration could not be loaded and raise an error 'bad-plugin-value' instead
Closes #4555
-
Added handling of floating point values when parsing configuration from pyproject.toml
Closes #4518
-
invalid-length-returned, now also works when nothing at all is returned following an upgrade in astroid. -
logging-format-interpolationandlogging-not-lazy, now works on logger class created from renamed logging import following an upgrade in astroid. -
Fix false-positive
no-memberwith generic base classCloses PyCQA/astroid#942
-
Fix
assigning-non-slotfalse-positive with base that inherits fromtyping.GenericCloses #4509 Closes PyCQA/astroid#999
-
New checker
invalid-all-format. Emitted when__all__has an invalid format, i.e. isn't atupleorlist. -
Fix false positive
unused-variableandundefined-variablewith Pattern Matching in Python 3.10 -
New checker
await-outside-async. Emitted when await is used outside an async function. -
Clarify documentation for
typingextension.Closes #4545
-
Add new extension
CodeStyleChecker. It includes checkers that can improve code consistency. As such they don't necessarily provide a performance benefit and are often times opinionated. -
New checker
consider-using-tuple. Emitted when an in-place defined list or set can be replaced by a tuple. -
New checker
consider-using-namedtuple-or-dataclass. Emitted when dictionary values can be replaced by namedtuples or dataclass instances. -
Fix error that occurred when using
sliceas subscript for dict. -
Reduce false-positives around inference of
.valueand.nameproperties onEnumsubclasses, following an upgrade in astroid -
Fix issue with
cached_propertythat causedinvalid-overridden-methoderror when overriding aproperty.Closes #4023
-
Fix
unused-importfalse positive for imported modules referenced in attribute lookups in type comments.Closes #4603
v2.8.3
Pin astroid to 2.5.6 for pylint 2.8.3
v2.8.2
-
Keep
__pkginfo__.numversiona tuple to avoid breaking pylint-django.Closes #4405
-
scm_setuptools has been added to the packaging.
-
Pylint's tags are now the standard form
vX.Y.Zand notpylint-X.Y.Zanymore.
v2.8.1
-
Add numversion back (temporarily) in
__pkginfo__because it broke Pylama and revert the unnecessarypylint.versionbreaking change.Closes #4399
v2.8.0
-
New refactoring message
consider-using-with. This message is emitted if resource-allocating functions or methods of the standard library (likeopen()orthreading.Lock.acquire()) that can be used as a context manager are called without awithblock.Closes #3413
-
Resolve false positives on unused variables in decorator functions
Closes #4252
-
Add new extension
ConfusingConsecutiveElifChecker. This optional checker emits a refactoring message (R5601confusing-consecutive-elif) if if/elif statements with different indentation levels follow directly one after the other. -
New option
--output=<file>to output result to a file rather than printing to stdout.Closes #1070
-
Use a prescriptive message for
unidiomatic-typecheckCloses #3891
-
Apply
const-naming-styleto module constants annotated withtyping.Final -
The packaging is now done via setuptools exclusively.
doc,tests,man,elispandChangelogare not packaged anymore - reducing the size of the package by 75%. -
Debian packaging is now (officially) done in https://salsa.debian.org/python-team/packages/pylint.
-
The 'doc' extra-require has been removed.
-
__pkginfo__now only contain__version__(also accessible withpylint.__version__), other meta-information are still accessible withimport importlib;metadata.metadata('pylint'). -
COPYING has been renamed to LICENSE for standardization.
-
Fix false-positive
used-before-assignmentin function returns.Closes #4301
-
Updated
astroidto 2.5.3 -
Add
consider-using-min-max-builtincheck for if statement which could be replaced by Python builtin min or maxCloses #3406
-
Don't auto-enable postponed evaluation of type annotations with Python 3.10
-
Update
astroidto 2.5.4 -
Add new extension
TypingChecker. This optional checker can detect the use of deprecated typing aliases and can suggest the use of the alternative union syntax where possible. (For example, 'typing.Dict' can be replaced by 'dict', and 'typing.Unions' by '|', etc.) Make sure to check the config options if you plan on using it! -
Reactivates old counts in report mode.
Closes #3819
-
During detection of
inconsistent-return-statementsconsider thatassert Falseis a return node.Closes #4019
-
Run will not fail if score exactly equals
config.fail_under. -
Functions that never returns may declare
NoReturnas type hints, so thatinconsistent-return-statementsis not emitted. -
Improved protected access checks to allow access inside class methods
Closes #1159
-
Fix issue with PEP 585 syntax and the use of
collections.abc.Set -
Fix issue that caused class variables annotated with
typing.ClassVarto be identified as class constants. Now, class variables annotated withtyping.Finalare identified as such.Closes #4277
-
Continuous integration with read the doc has been added.
Closes #3850
-
Don't show
DuplicateBasesErrorfor attribute access -
Fix crash when checking
setup.cfgfor pylint config when there are non-ascii characters in thereCloses #4328
-
Allow code flanked in backticks to be skipped by spellchecker
Closes #4319
-
Allow Python tool directives (for black, flake8, zimports, isort, mypy, bandit, pycharm) at beginning of comments to be skipped by spellchecker
Closes #4320
-
Fix issue that caused emacs pylint to fail when used with tramp
-
Improve check for invalid PEP 585 syntax inside functions if postponed evaluation of type annotations is enabled
-
Improve check for invalid PEP 585 syntax as default function arguments
v2.7.4
-
Fix a problem with disabled msgid not being ignored
Closes #4265
-
Fix issue with annotated class constants
- Closes #4264
v2.7.3
-
Introduce logic for checking deprecated attributes in DeprecationMixin.
-
Reduce usage of blacklist/whitelist terminology. Notably,
extension-pkg-allow-listis an alternative toextension-pkg-whitelistand the messageblacklisted-nameis now emitted asdisallowed-name. The previous names are accepted to maintain backward compatibility. -
Move deprecated checker to
DeprecatedMixinCloses #4086
-
Bump
astroidversion to2.5.2 -
Fix false positive for
method-hiddenwhen using private attribute and methodCloses #3936
-
use-symbolic-message-insteadnow also works on legacy messages likeC0111(missing-docstring). -
Remove unwanted print to stdout from
_emit_no_member -
Introduce a command-line option to specify pyreverse output directory
Closes #4159
-
Fix issue with Enums and
class-attribute-naming-style=snake_caseCloses #4149
-
Add
allowed-redefined-builtinsoption for fine tuningredefined-builtincheck.Close #3263
-
Fix issue when executing with
python -m pylintCloses #4161
-
Exempt
typing.TypedDictfromtoo-few-public-methodscheck.Closes #4180
-
Fix false-positive
no-memberfor typed annotations without default value.Closes #3167
-
Add
--class-const-naming-stylefor Enum constants and class variables annotated withtyping.ClassVarCloses #4181
-
Fix astroid.Inference error for undefined-variables with ``len()```
Closes #4215
-
Fix column index on FIXME warning messages
Closes #4218
-
Improve handling of assignment expressions, better edge case handling
-
Improve check if class is subscriptable PEP585
-
Fix documentation and filename handling of --import-graph
-
Fix false-positive for
unused-importon class keyword argumentsCloses #3202
-
Fix regression with plugins on PYTHONPATH if latter is cwd
Closes #4252
v2.7.2
-
Fix False Positive on
Enum.__members__.items(),Enum.__members__.values, andEnum.__members__.keysCloses #4123 -
Properly strip dangerous sys.path entries (not just the first one)
Closes #3636
v2.7.1
-
Expose
UnittestLinterin pylint.testutils -
Don't check directories starting with '.' when using register_plugins
Closes #4119
v2.7.0
-
Introduce DeprecationMixin for reusable deprecation checks.
Closes #4049
-
Fix false positive for
builtin-not-iteratingwhenmapreceives iterableCloses #4078
-
Python 3.6+ is now required.
-
Fix false positive for
builtin-not-iteratingwhenzipreceives iterable -
Add
nan-comparisoncheck for NaN comparisons -
Bug fix for empty-comment message line number.
Closes #4009
-
Only emit
bad-reversed-sequenceon dictionaries if below py3.8Closes #3940
-
Handle class decorators applied to function.
Closes #3882
-
Add check for empty comments
-
Fix minor documentation issue in contribute.rst
-
Enums are now required to be named in UPPER_CASE by
invalid-name.Close #3834
-
Add missing checks for deprecated functions.
-
Postponed evaluation of annotations are now recognized by default if python version is above 3.10
Closes #3992
-
Fix column metadata for anomalous backslash lints
-
Drop support for Python 3.5
-
Add support for pep585 with postponed evaluation
Closes #3320
-
Check alternative union syntax - PEP 604
Closes #4065
-
Fix multiple false positives with assignment expressions
-
Fix TypedDict inherit-non-class false-positive Python 3.9+
Closes #1927
-
Fix issue with nested PEP 585 syntax
-
Fix issue with nested PEP 604 syntax
-
Fix a crash in
undefined-variablecaused by chained attributes in metaclassClose #3742
-
Fix false positive for
not-async-context-managerwhencontextlib.asynccontextmanageris usedClose #3862
-
Fix linter multiprocessing pool shutdown (triggered warnings when runned in parallels with other pytest plugins)
Closes #3779
-
Fix a false-positive emission of
no-self-useandunused-argumentfor methods of generic structural types (Protocol[T])Closes #3885
-
Fix bug that lead to duplicate messages when using
--jobs 2or more.Close #3584
-
Adds option
check-protected-access-in-special-methodsin the ClassChecker to activate/deactivateprotected-accessmessage emission for single underscore prefixed attribute in special methods.Close #3120
-
Fix vulnerable regular expressions in
pyreverseClose #3811
-
inconsistent-return-statementsmessage is now emitted if one oftry/exceptstatement is not returning explicitly while the other do.Closes #3468
-
Fix
useless-super-delegationfalse positive when default keyword argument is a dictionnary.Close #3773
-
Fix a crash when a specified config file does not exist
-
Add support to
ignored-argument-namesin DocstringParameterChecker and addsuseless-param-docanduseless-type-docmessages.Close #3800
-
Enforce docparams consistently when docstring is not present
Close #2738
-
Fix
duplicate-codefalse positive when lines only contain whitespace and non-alphanumeric characters (e.g. parentheses, bracket, comman, etc.) -
Improve lint message for
singleton-comparisonwith bools -
Fix spell-checker crash on indented docstring lines that look like # comments
Close #3786
-
Fix AttributeError in checkers/refactoring.py
-
Improve sphinx directives spelling filter
-
Fix a bug with postponed evaluation when using aliases for annotations.
Close #3798
-
Fix minor documentation issues
-
Improve the performance of the line length check.
-
Removed incorrect deprecation of
inspect.getfullargspec -
Fix
signature-differsfalse positive for functions with variadicsClose #3737
-
Fix a crash in
consider-using-enumeratewhen encounteringrange()without argumentsClose #3735
-
len-as-conditionsis now triggered only for classes that are inheriting directly from list, dict, or set and not implementing the__bool__function, or from generators like range or list/dict/set comprehension. This should reduce the false positives for other classes, like pandas's DataFrame or numpy's Array.Close #1879
-
Fixes duplicate-errors not working with -j2+
Close #3314
-
generated-membersnow matches the qualified name of membersClose #2498
-
Add check for bool function to
len-as-condition -
Add
simplifiable-conditioncheck for extraneous constants in conditionals using and/or. -
Add
condition-evals-to-constantcheck for conditionals using and/or that evaluate to a constant.Close #3407
-
Changed setup.py to work with distlib
Close #3555
-
New check:
consider-using-generatorThis check warns when a comprehension is used inside an
anyorallfunction, since it is unnecessary and should be replaced by a generator instead. Using a generator would be less code and way faster.Close #3165
-
Add Github Actions to replace Travis and AppVeyor in the future
v2.6.2
-
Astroid version has been set as < 2.5
Close #4093
v2.6.0
-
Fix various scope-related bugs in
undefined-variablechecker -
bad-continuation and bad-whitespace have been removed, black or another formatter can help you with this better than Pylint
Close #246, #289, #638, #747, #1148, #1179, #1943, #2041, #2301, #2304, #2944, #3565
-
The no-space-check option has been removed. It's no longer possible to consider empty line like a
trailing-whitespaceby using clever optionsClose #1368
-
missing-kwoais no longer emitted when dealing with overload functionsClose #3655
-
mixed-indentation has been removed, it is no longer useful since TabError is included directly in python3
-
Add
super-with-argumentscheck for flagging instances of Python 2 style super calls. -
Add an faq detailing which messages to disable to avoid duplicates w/ other popular linters
-
Fix superfluous-parens false-positive for the walrus operator
Close #3383
-
Fix
fail-undernot accepting floats -
Fix a bug with
ignore-docstringsignoring all lines in a module -
Fix
pre-commitconfig that could lead to undetected duplicate lines of code -
Fix a crash in parallel mode when the module's filepath is not set
Close #3564
-
Add
raise-missing-fromcheck for exceptions that should have a cause. -
Support both isort 4 and isort 5. If you have pinned isort 4 in your projet requirements, nothing changes. If you use isort 5, though, note that the
known-standard-libraryoption is not interpreted the same in isort 4 and isort 5 (see the migration guide in isort documentation for further details). For compatibility's sake for most pylint users, theknown-standard-libraryoption in pylint now maps toextra-standard-libraryin isort 5. If you really want whatknown-standard-librarynow means in isort 5, you must disable thewrong-import-ordercheck in pylint and run isort manually with a proper isort configuration file.Close #3722
v2.5.3
-
Fix a regression where disable comments that have checker names with numbers in them are not parsed correctly
Close #3666
-
property-with-parametersproperly handles abstract propertiesClose #3600
-
continue-in-finallyno longer emitted on Python 3.8 where it's now validClose #3612
-
Fix a regression where messages with dash are not fully parsed
Close #3604
-
In a TOML configuration file, it's now possible to use rich (non-string) types, such as list, integer or boolean instead of strings. For example, one can now define a list of message identifiers to enable like this::
enable = [ "use-symbolic-message-instead", "useless-suppression", ]
Close #3538
-
Fix a regression where the score was not reported with multiple jobs
Close #3547
-
Protect against
AttributeErrorwhen checkingcell-var-from-loopClose #3646
v2.5.2
-
pylint.Runacceptsdo_exitas a deprecated parameterClose #3590
v2.5.1
-
Fix a crash in
method-hiddenlookup for unknown base classesClose #3527
-
Revert pylint.Run's
exitparameter todo_exitThis has been inadvertently changed several releases ago to
do_exit.Close #3533
-
no-value-for-parametervariadic detection has improved for assign statementsClose #3563
-
Allow package files to be properly discovered with multiple jobs
Close #3524
-
Allow linting directories without
__init__.pywhich was a regression in 2.5.Close #3528
v2.5.0
-
Fix a false negative for
undefined-variablewhen using class attribute in comprehension.Close #3494
-
Fix a false positive for
undefined-variablewhen using class attribute in decorator or as type hint. -
Remove HTML quoting of messages in JSON output.
Close #2769
-
Adjust the
invalid-namerule to work with non-ASCII identifiers and add thenon-ascii-namerule.Close #2725
-
Positional-only arguments are taken in account for
useless-super-delegation -
unidiomatic-typecheckis no longer emitted forinandnot inoperatorsClose #3337
-
Positional-only argument annotations are taken in account for
unused-importClose #3462
-
Add a command to list available extensions.
-
Allow used variables to be properly consumed when different checks are enabled / disabled
Close #3445
-
Fix dangerous-default-value rule to account for keyword argument defaults
Close #3373
-
Fix a false positive of
self-assigning-variableon tuple unpacking.Close #3433
-
no-self-useis no longer emitted for typing stubs.Close #3439
-
Fix a false positive for
undefined-variablewhen__class__is usedClose #3090
-
Emit
invalid-namefor variables defined in loops at module level.Close #2695
-
Add a check for cases where the second argument to
isinstanceis not a type.Close #3308
-
Add 'notes-rgx' option, to be used for fixme check.
Close #2874
-
function-redefinedexempts function redefined on a condition.Close #2410
-
typing.overloadfunctions are exempted from docstring checksClose #3350
-
Emit
invalid-overridden-methodfor improper async def overrides.Close #3355
-
Do not allow
python -m pylint ...to import user codepython -m pylint ...adds the current working directory as the first element ofsys.path. This opens up a potential security hole wherepylintwill import user level code as long as that code resides in modules having the same name as stdlib or pylint's own modules.Close #3386
-
Add
dummy-variables-rgxoption for_redeclared-assigned-namecheck.Close #3341
-
Fixed graph creation for relative paths
-
Add a check for asserts on string literals.
Close #3284
-
not inis considered iterating context for some of the Python 3 porting checkers. -
A new check
inconsistent-quoteswas added. -
Add a check for non string assignment to name attribute.
Close #583
-
__pow__,__imatmul__,__trunc__,__floor__, and__ceil__are recognized as special method names.Close #3281
-
Added errors for protocol functions when invalid return types are detected. E0304 (invalid-bool-returned): bool did not return a bool E0305 (invalid-index-returned): index did not return an integer E0306 (invalid-repr-returned): repr did not return a string E0307 (invalid-str-returned): str did not return a string E0308 (invalid-bytes-returned): bytes did not return a string E0309 (invalid-hash-returned): hash did not return an integer E0310 (invalid-length-hint-returned): length_hint did not return a non-negative integer E0311 (invalid-format-returned): format did not return a string E0312 (invalid-getnewargs-returned): getnewargs did not return a tuple E0313 (invalid-getnewargs-ex-returned): getnewargs_ex did not return a tuple of the form (tuple, dict)
Close #560
-
missing-*-docstringcan look for__doc__assignments.Close #3301
-
undefined-variablecan now find undefined loop iterablesClose #498
-
safe_infercan infer a value as long as all the paths share the same type.Close #2503
-
Add a --fail-under flag, also configurable in a .pylintrc file. If the final score is more than the specified score, it's considered a success and pylint exits with exitcode 0. Otherwise, it's considered a failure and pylint exits with its current exitcode based on the messages issued.
Close #2242
-
Don't emit
line-too-longfor multilines whendisable=line-too-longcomment stands at their endClose #2957
-
Fixed an
AttributeErrorcaused by improper handling ofdataclassesinference inpyreverseClose #3256
-
Do not exempt bare except from
undefined-variableand similar checksIf a node was wrapped in a
TryExcept,pylintwas taking a hint from the except handler when deciding to emit or not a message. We were treating bare except as a fully fledged ignore but only the corresponding exceptions should be handled that way (e.g.NameErrororImportError)Close #3235
-
No longer emit
assignment-from-no-returnwhen a function only raises an exceptionClose #3218
-
Allow import aliases to exempt
import-errorwhen used in type annotations.Close #3178
-
Ellipsis` is exempted frommultiple-statements`` for function overloads.Close #3224
-
No longer emit
invalid-namefor non-constants found at module level.Pylint was taking the following statement from PEP-8 too far, considering all module level variables as constants, which is not what the statement is saying:
Constants are usually defined on a module level and written in all capital letters with underscores separating words. -
Allow
implicit-str-concat-in-sequenceto be emitted for string juxtapositionClose #3030
-
implicit-str-concat-in-sequencewas renamedimplicit-str-concat -
The
jsonreporter no longer bypassesredirect_stdout. Close #3227 -
Move
NoFileError,OutputLine,FunctionalTestReporter,FunctionalTestFile,LintModuleTestand related methods fromtest_functional.pytopylint.testutilsto help testing for 3rd party pylint plugins. -
Can read config from a setup.cfg or pyproject.toml file.
Close #617
-
Fix exception-escape false positive with generators
Close #3128
-
inspect.getargvaluesis no longer marked as deprecated. -
A new check
f-string-without-interpolationwas addedClose #3190
-
Flag mutable
collections.*utilities as dangerous defaultsClose #3183
-
docparamsextension supports multiple types in raises sections.Multiple types can also be separated by commas in all valid sections.
Closes #2729
-
Allow parallel linting when run under Prospector
-
Fixed false positives of
method-hiddenwhen a subclass defines the method that is being hidden.Closes #414
-
Python 3 porting mode is 30-50% faster on most codebases
-
Python 3 porting mode no longer swallows syntax errors
Closes #2956
-
Pass the actual PyLinter object to sub processes to allow using custom PyLinter classes.
PyLinter object (and all its members except reporter) needs to support pickling so the PyLinter object can be passed to worker processes.
-
Clean up setup.py
Make pytest-runner a requirement only if running tests, similar to McCabe.
Clean up the setup.py file, resolving a number of warnings around it.
-
Handle SyntaxError in files passed via
--from-stdinoptionPylint no longer outputs a traceback, if a file, read from stdin, contains a syntaxerror.
-
Fix uppercase style to disallow 3+ uppercase followed by lowercase.
-
Fixed
undefined-variableandunused-importfalse positives when using a metaclass via an attribute.Close #1603
-
Emit
unused-argumentfor functions that partially uses their argument list before raising an exception.Close #3246
-
Fixed
broad_try_clauseextension to check try/finally statements and to check for nested statements (e.g., inside of anifstatement). -
Recognize classes explicitly inheriting from
abc.ABCor having anabc.ABCMetametaclass as abstract. This makes them not trigger W0223.Closes #3098
-
Fix overzealous
arguments-differwhen overridden function uses variadicsNo message is emitted if the overriding function provides positional or keyword variadics in its signature that can feasibly accept and pass on all parameters given by the overridden function.
-
Multiple types of string formatting are allowed in logging functions.
The
logging-fstring-interpolationmessage has been brought back to allow multiple types of string formatting to be used.Close #3361
v2.4.4
-
Exempt all the names found in type annotations from
unused-importThe previous code was assuming that only
typingnames need to be exempted, but we need to do that for the rest of the type comment names as well.Close #3112
-
Relax type import detection for names that do not come from the
typingmoduleClose #3191
v2.4.3
v2.4.2
v2.4.1
v2.4.0
Configuration
- If you want to rebase/retry this MR, check this box
This MR has been generated by Renovate Bot.