Releases: pylint-dev/pylint
pylint-2.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/deactivate
protected-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
 
pylint-2.6.2
- 
Astroid version has been set as < 2.5
Close #4093
 
pylint-2.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
 
pylint-2.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
 
pylint-2.5.2
- 
pylint.Runacceptsdo_exitas a deprecated parameterClose #3590
 
pylint-2.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
 
pylint-2.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 from
test_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 an
abc.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
 
pylint-2.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