What's New in Pylint 2.12¶
- Release
2.12
- Date
2021-11-24
Summary -- Release highlights¶
In 2.12, we introduced a new option py-version that permits to analyse code for a python
version that may differ from your current python interpreter. This does not affect all checkers but
permits, for example, to check for python 3.5 code smells (using f-string's) while using pylint with python 3.6.
The minimum version to run pylint is now 3.6.2, while the last working version for python 3.6.0
and 3.6.1 was pylint 2.9.3.
On top of fixing a lot of false positives and bugs, we also added new default checks, like
use-implicit-booleaness-not-comparison, overridden-final-method, and useless-with-lock.
There's also better check for TOML configurations.
Lastly, in addition to the information we already had about start line and start column,
we introduced new information about the end line and end column of messages. This
will permit to have more precise visual clue in IDE like in pylint for vs-code. The default
will stay the same to not break compatibility but it can be retrieved by adding end_line
and end_column to the --msg-template option. For better result stick to python 3.8+.
The checker for Yoda conditions is now an extension, you might want to enable it if you were
relying on this check. There's also a new extension checker, consider-using-any-or-all that
detects for loops that could be replaced by any or all, entirely contributed by @areveny,
welcome to the team !
New checkers¶
Added
missing-any-param-doctriggered when a function has neither parameter nor parameter type documentation. Undocumented parameters are now being properly identified. A warning might start to appear unexpectedly ifmissing-param-docandmissing-type-docwere disabled, as a new messagemissing-any-param-docwill be emitted instead.Closes #3799
Checkers for
typing.finalAdded
overridden-final-method: Emitted when a method which is annotated withtyping.finalis overriddenAdded
subclassed-final-class: Emitted when a class which is annotated withtyping.finalis subclassed
Closes #3197
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 new checker
use-implicit-booleaness-not-comparison: Emitted when collection literal comparison is being used to check for emptiness.Closes #4774
Added
using-final-decorator-in-unsupported-versionchecker. Issued whenpy-versionis set to a version that does not support typing.final (< 3.8)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
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
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.
Extensions¶
Added 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/all statement if it is concise.Closes #5008
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
Other Changes¶
Fix
install graphizmessage which isn't needed for puml output format.pylintno longer crashes when checking assignment expressions within if-statementsCloses #5178
Added configuration option
exclude-too-few-public-methodsto allow excluding classes from themin-public-methodschecker.Closes #3370
Fix
accept-no-yields-docandaccept-no-return-docnot allowing missingyieldorreturndocumentation when a docstring is partially correctCloses #5223
Fix
simplify-boolean-expressionwhen condition can be inferred as False.Closes #5200
Fix exception when pyreverse parses
property functionof a class.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.Fixed
protected-accessfor accessing of attributes and methods of inner classesCloses #3066
Update
literal-comparison`checker to ignore tuple literalsCloses #3031
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.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
self-cls-assignmentnow also considers tuple assignmentundefined-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
Fix crash for
unused-private-memberwhen checking private members on__class__Closes #5261
Fix double emitting of
not-callableon inferrablepropertiesCloses #4426
Support configuring mixin class pattern via
mixin-class-rgxNormalize the input to the
ignore-pathsoption to allow both Posix and Windows pathsCloses #5194
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
The
--jobsparameter now falls back to 1 if the host operating system does not have functioning shared semaphore implementation.Closes #5216
Crashes when a list is encountered in a toml configuration do not happen anymore.
Closes #4580
Fix crash for
protected-accesson (outer) class traversalFix
useless-super-delegationfalse positive when default keyword argument is a variable.Make yn validator case insensitive, to allow for
TrueandFalsein config files.The last version compatible with python '3.6.0' and '3.6.1' is pylint '2.9.3'. We did not realize that when adding incompatible typing at the time, and all versions since are broken for this interpreter. 2.12.0 meta-information will permit to download pylint on those interpreters but the installation will fail and tell you to install '2.9.3' instead. pylint 2.12.1 will require python >= 3.6.2.
Closes #5171 Follow-up in #5065
Added the
--enable-all-extensionscommand line option. It will load all available extensions which can be listed by running--list-extensionsIt 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.Fix crash on
open()calls when themodeargument is not a simple string.Partially closes #5321
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.Closes #4412 #5287
Add
endLineandendColumnkeys to output ofJSONReporter.Closes #5380
Fix false negative for
consider-iterating-dictionaryduring membership checks encapsulated in iterables ornot inchecksCloses #5323
