chore(deps): update dependency pylint to v4

⚠️ CAUTION: this is a major update, indicating a (potential) breaking change! ⚠️

This MR contains the following updates:

Package Change Age Adoption Passing Confidence
pylint (changelog) ==2.3.1 -> ==4.0.4 age adoption passing confidence

Release Notes

pylint-dev/pylint (pylint)

v4.0.4

Compare Source

What's new in Pylint 4.0.4?

Release date: 2025-11-30

False Positives Fixed

  • Fixed false positive for invalid-name where 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-name on an UPPER_CASED name inside an if branch that assigns an object.

    Closes #​10745

v4.0.3

Compare Source

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-name with typing.Annotated.

    Closes #​10696

  • Fix false positive for f-string-without-interpolation with template strings when using format spec.

    Closes #​10702

  • Fix a false positive when an UPPER_CASED class attribute was raising an invalid-name when typed with Final.

    Closes #​10711

  • Fix a false positive for unbalanced-tuple-unpacking when 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-expr when a variable annotation without assignment is used as the if test expression.

    Closes #​10707

  • Fix crash for prefer-typing-namedtuple and consider-math-not-float when a slice object is called.

    Closes #​10708

v4.0.2

Compare Source

False Positives Fixed

  • Fix false positive for invalid-name on a partially uninferable module-level constant.

    Closes #​10652

  • Fix a false positive for invalid-name on exclusive module-level assignments composed of three or more branches. We won't raise disallowed-name on 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-name for TypedDict instances.

    Closes #​10672

v4.0.1

Compare Source

What's new in Pylint 4.0.1?

Release date: 2025-10-14

False Positives Fixed

  • Exclude __all__ and __future__.annotations from unused-variable.

    Closes #​10019

  • Fix false-positive for bare-name-capture-pattern if a case guard is used.

    Closes #​10647

  • Check enums created with the Enum() functional syntax to pass against the --class-rgx for the invalid-name check, like other enums.

    Closes #​10660

v4.0.0

Compare Source

  • 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-name at the module level was patchy. Now, module-level constants that are reassigned are treated as variables and checked against --variable-rgx rather 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-name now distinguishes module-level constants that are assigned only once from those that are reassigned and now applies --variable-rgx to 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-names or --good-names-rgxs can be provided to explicitly allow good names.

    Closes #​3585

  • The unused pylintrc argument to PyLinter.__init__() is deprecated and will be removed.

    Refs #​6052

  • Commented out code blocks such as # bar() # TODO: remove dead code will no longer emit fixme.

    Refs #​9255

  • pyreverse Run was changed to no longer call sys.exit() in its __init__. You should now call Run(args).run() which will return the exit code instead. Having a class that always raised a SystemExit exception was considered a bug.

    Normal usage of pyreverse through the CLI will not be affected by this change.

    Refs #​9689

  • The suggestion-mode option 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.py checker module has been renamed to async_checker.py since async is 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-finally was changed from E0116 to W0136. 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.NaN alias for numpy.NaN being recognized in ':ref:nan-comparison'. Use np or numpy instead.

    Refs #​10583

  • Version requirement for isort has been bumped to >=5.0.0. The internal compatibility for older isort versions exposed via pylint.utils.IsortDriver has been removed.

    Refs #​10637

New Features

  • comparison-of-constants now uses the unicode from the ast instead of reformatting from the node's values preventing some bad formatting due to utf-8 limitation. 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.

    Closes #​9045 Closes #​9267

  • The fixme check can now search through docstrings as well as comments, by using check-fixme-in-docstring = true in the [tool.pylint.miscellaneous] section.

    Closes #​9255

  • The use-implicit-booleaness-not-x checks 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-on in 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 format mmd (MermaidJS) and html.

    Closes #​10242

  • pypy 3.11 is now officially supported.

    Refs #​10287

  • Add support for Python 3.14.

    Refs #​10467

  • Add naming styles for ParamSpec and TypeVarTuple that align with the TypeVar style.

    Refs #​10541

New Checks

  • Add match-statements checker 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-with to detect async context managers used with regular with statements instead of async with.

    Refs #​10408

  • Add break-in-finally warning. Using break inside the finally clause will raise a syntax warning in Python 3.14. See PEP 765 - Disallow return/break/continue that exit a finally block <https://peps.python.org/pep-0765/>_.

    Refs #​10480

  • Add new checks for invalid uses of class patterns in :keyword:match.

    • :ref:invalid-match-args-definition is emitted if :py:data:object.__match_args__ isn't a tuple of strings.
    • :ref:too-many-positional-sub-patterns if there are more positional sub-patterns than specified in :py:data:object.__match_args__.
    • :ref:multiple-class-sub-patterns if there are multiple sub-patterns for the same attribute.

    Refs #​10559

  • Add additional checks for suboptimal uses of class patterns in :keyword:match.

    • :ref:match-class-bind-self is emitted if a name is bound to self instead of using an as pattern.
    • :ref:match-class-positional-attributes is emitted if a class pattern has positional attributes when keywords could be used.

    Refs #​10587

  • Add a consider-math-not-float message. float("nan") and float("inf") are slower than their counterpart math.inf and math.nan by 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_style need to be activated for this check to work.

    Refs #​10621

False Positives Fixed

  • Fix a false positive for used-before-assignment when a variable defined under an if and via a named expression (walrus operator) is used later when guarded under the same if test.

    Closes #​10061

  • Fix :ref:no-name-in-module for members of concurrent.futures with Python 3.14.

    Closes #​10632

False Negatives Fixed

  • Fix false negative for used-before-assignment when a TYPE_CHECKING import 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 adjust const-naming-style or const-rgx to 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-args for format string with no interpolation arguments at all (i.e. for something like logging.debug("Awaiting process %s") or logging.debug("Awaiting process {pid}")). Previously we did not raise for such case.

    Closes #​9999

  • Fix false negative for used-before-assignment when a function is defined inside a TYPE_CHECKING guard block and used later.

    Closes #​10028

  • Fix a false negative for possibly-used-before-assignment when a variable is conditionally defined and later assigned to a type-annotated variable.

    Closes #​10421

  • Fix false negative for deprecated-module when a __import__ method is used instead of import sentence.

    Refs #​10453

  • Count match cases for too-many-branches check.

    Refs #​10542

  • Fix false-negative where :ref:unused-import was not reported for names referenced in a preceding global statement.

    Refs #​10633

Other Bug Fixes

  • When displaying unicode with surrogates (or other potential UnicodeEncodeError), pylint will now display a '?' character (using encode(encoding="utf-8", errors="replace")) instead of crashing. The functional tests classes are also updated to handle this case.

    Closes #​8736

  • Fixed unidiomatic-typecheck only checking left-hand side.

    Closes #​10217

  • Fix a crash caused by malformed format strings when using .format with keyword arguments.

    Closes #​10282

  • Fix false positive inconsistent-return-statements when using quit() or exit() functions.

    Closes #​10508

  • Fix a crash in :ref:nested-min-max when using builtins.min or builtins.max instead of min or max directly.

    Closes #​10626

  • Fixed a crash in :ref:unnecessary-dict-index-lookup when 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.9 setting.

    Refs #​10405

Internal Changes

  • Modified test framework to allow for different test output for different Python versions.

    Refs #​10382

v3.3.9

Compare Source

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.resources as deprecated.

    Closes #​10593

  • Fix false positive inconsistent-return-statements when using quit() or exit() functions.

    Closes #​10508

  • Fix false positive undefined-variable (E0602) for for-loop variable shadowing patterns like for 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

Compare Source

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-assignment when variables are exhaustively assigned within a match block.

    Closes #​9668

  • Fix false positive for missing-raises-doc and missing-yield-doc when the method length is less than docstring-min-length.

    Refs #​10104

  • Fix a false positive for unused-variable when multiple except handlers bind the same name under a try block.

    Closes #​10426

False Negatives Fixed

  • Fix false-negative for used-before-assignment with from __future__ import annotations in 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

Compare Source

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 an unidiomatic-typecheck warning 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 .format with keyword arguments.

    Closes #​10282

  • Using a slice as a class decorator now raises a not-callable message 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-member suggestions is now more efficient and cuts the calculation when the distance score is already above the threshold.

    Refs #​10277

v3.3.6

Compare Source

What's new in Pylint 3.3.6?

Release date: 2025-03-20

False Positives Fixed

  • Fix a false positive for used-before-assignment when an inner function's return type annotation is a class defined at module scope.

    Closes #​9391

v3.3.5

Compare Source

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-string and use-implicit-booleaness-not-comparison-to-zero when chained comparisons are checked.

    Closes #​10065

  • Fix a false positive for invalid-getnewargs-ex-returned when the tuple or dict has been assigned to a name.

    Closes #​10208

  • Remove getopt and optparse from 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

Compare Source

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

Compare Source

What's new in Pylint 3.3.3?

Release date: 2024-12-23

False Positives Fixed

  • Fix false positives for undefined-variable for 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 (len is 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

Compare Source

False Positives Fixed

  • Fix a false positive for potential-index-error when 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

Compare Source

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

Compare Source

Release date: 2024-09-20

Changes requiring user actions

  • We migrated symilar to 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 1 should become --ignore-comments).

    Refs #​9731

New Features

  • Add new declare-non-slot error 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-arguments to 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-version and using-generic-type-syntax-in-unsupported-version for 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-version for uses of := (walrus operator) on Python versions below 3.8 provided with --py-version.

    Closes #​9820

  • Add using-positional-only-args-in-unsupported-version for uses of positional-only args on Python versions below 3.8 provided with --py-version.

    Closes #​9823

  • Add unnecessary-default-type-args to the typing extension to detect the use of unnecessary default type args for typing.Generator and typing.AsyncGenerator.

    Refs #​9938

False Negatives Fixed

  • Fix computation of never-returning function: Never is handled in addition to NoReturn, and priority is given to the explicit --never-returning-functions option.

    Closes #​7565.

  • Fix a false negative for await-outside-async when await is inside Lambda.

    Refs #​9653

  • Fix a false negative for duplicate-argument-name by including positional-only, *args and **kwargs arguments in the check.

    Closes #​9669

  • Fix false negative for multiple-statements when multiple statements are present on else and finally lines of try.

    Refs #​9759

  • Fix false negatives when isinstance does not have exactly two arguments. pylint now emits a too-many-function-args or no-value-for-parameter appropriately for isinstance calls.

    Closes #​9847

Other Bug Fixes

  • --enable with --disable=all now produces an error, when an unknown msg code is used. Internal pylint messages 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.compile instead.

    Closes #​9680

  • Fix a bug where a tox.ini file with pylint configuration was ignored and it exists in the current directory.

    .cfg and .ini files containing a Pylint configuration 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 --rcfile option.

    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.8 setting.

    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

Compare Source

What's new in Pylint 3.2.7?

Release date: 2024-08-31

False Positives Fixed

  • Fixed a false positive unreachable for NoReturn coroutine 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-variable when providing the iterable argument to enumerate().

    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

Compare Source

What's new in Pylint 3.2.6?

Release date: 2024-07-21

False Positives Fixed

  • Quiet false positives for unexpected-keyword-arg when pylint cannot determine which of two or more dynamically defined classes is being instantiated.

    Closes #​9672

  • Fix a false positive for missing-param-doc where a method which is decorated with typing.overload was expected to have a docstring specifying its parameters.

    Closes #​9739

  • Fix a regression that raised invalid-name on class attributes merely overriding invalid names from an ancestor.

    Closes #​9765

  • Treat assert_never() the same way when imported from typing_extensions.

    Closes #​9780

  • Fix a false positive for consider-using-min-max-builtin when the assignment target is an attribute.

    Refs #​9800

Other Bug Fixes

  • Fix an AssertionError arising from properties that return partial functions.

    Closes #​9214

  • Fix a crash when a subclass extends __slots__.

    Closes #​9814

v3.2.5

Compare Source

What's new in Pylint 3.2.5 ?

Release date: 2024-06-28

Other Bug Fixes

  • Fixed a false positive unreachable-code when using typing.Any as return type in python 3.8, the typing.NoReturn are not taken into account anymore for python 3.8 however.

    Closes #​9751

v3.2.4

Compare Source

What's new in Pylint 3.2.4?

Release date: 2024-06-26

False Positives Fixed

  • Prevent emitting possibly-used-before-assignment when relying on names only potentially not defined in conditional blocks guarded by functions annotated with typing.Never or typing.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 start value in an enumerate was non-constant and impossible to infer (like inenumerate(apples, start=int(random_apple_index)) for unnecessary-list-index-lookup.

    Closes #​9078

  • Fixed a crash in symilar when the -d or -i short option were not properly recognized. It's still impossible to do -d=1 (you must do -d 1).

    Closes #​9343

v3.2.3

Compare Source

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-name when 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-from when using the return value from the yield atom.

    Closes #​9696

v3.2.2

Compare Source

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-cleanup checks.

    Closes #​9625

v3.2.1

Compare Source

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()) from possibly-used-before-assignment checks.

    Closes #​9627

  • Don't emit typevar-name-incorrect-variance warnings for PEP 695 style TypeVars. The variance is inferred automatically by the type checker. Adding _co or _contra suffix can help to reason about TypeVar.

    Refs #​9638

  • Fix a false positive for possibly-used-before-assignment when using typing.assert_never() (3.11+) to indicate exhaustiveness.

    Closes #​9643

Other Bug Fixes

  • Fix a false negative for --ignore-patterns when 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-tuple should 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=yes option to opt-in to the astroid 3.2 feature that prefers .pyi stubs over same-named .py files. This has the potential to reduce no-member errors but at the cost of more errors such as not-an-iterable from function bodies appearing as ....

    Defaults to no.

    Closes #​9626 Closes #​9623

Internal Changes

  • Update astroid version to 3.2.1. This solves some reports of RecursionError and also makes the prefer .pyi stubs feature in astroid 3.2.0 opt-in with the aforementioned --prefer-stubs=y option.

    Refs #​9139

v3.2.0

Compare Source

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.PY2 and six.PY3 for conditional imports.

    Closes #​3501

  • A new github reporter has been added. This reporter returns the output of pylint in a format that Github can use to automatically annotate code. Use it with pylint --output-format=github on your Github Workflows.

    Closes #​9443.

New Checks

  • Add check possibly-used-before-assignment when relying on names after an if/else switch 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 y and not just with 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-parameters in the case of parameters which are positional-only, keyword-only, variadic positional or variadic keyword.

    Closes #​9584

False Positives Fixed

  • pylint now understands the @overload decorator return values better.

    Closes #​4696 Refs #​9606

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-tuple being enabled for a file or not is now done once per file instead of once for each token.

    Refs #​9608.

v3.1.1

Compare Source

What's new in Pylint 3.1.1?

Release date: 2024-05-13

False Positives Fixed

  • Treat attrs.define and attrs.frozen as dataclass decorators in too-few-public-methods check.

    Closes #​9345

  • Fix a false positive with singledispatchmethod-function when a method is decorated with both functools.singledispatchmethod and staticmethod.

    Closes #​9531

  • Fix a false positive for consider-using-dict-items when iterating using keys() and then deleting an item using the key as a lookup.

    Closes #​9554

v3.1.0

Compare Source

Two new checks--use-yield-from, deprecated-attribute-- and a smattering of bug fixes.

New Features

  • Skip consider-using-join check for non-empty separators if an suggest-join-with-non-empty-separator option is set to no.

    Closes #​8701

  • Discover .pyi files when linting.

    These can be ignored with the ignore-patterns setting.

    Closes #​9097

  • Check TypeAlias and TypeVar (PEP 695) nodes for invalid-name.

    Refs #​9196

  • Support for resolving external toml files named pylintrc.toml and .pylintrc.toml.

    Closes #​9228

  • Check for .clear, .discard, .pop and remove methods being called on a set while it is being iterated over.

    Closes #​9334

New Checks

  • New message use-yield-from added to the refactoring checker. This message is emitted when yielding from a loop can be replaced by yield from.

    Closes #​9229.

  • Added a deprecated-attribute message to check deprecated attributes in the stdlib.

    Closes #​8855

False Positives Fixed

  • Fixed false positive for inherit-non-class for generic Protocols.

    Closes #​9106

  • Exempt TypedDict from typing_extensions from too-many-ancestor checks.

    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.dataclass decorator is defined.

    Closes #​9100

Internal Changes

  • Update astroid version to 3.1.0.

    Refs #​9457

v3.0.4

Compare Source

False Positives Fixed

  • used-before-assignment is no longer emitted when using a name in a loop and depending on an earlier name assignment in an except block paired with else: continue.

    Closes #​6804

  • Avoid false positives for no-member involving function attributes supplied by decorators.

    Closes #​9246

  • Fixed false positive nested-min-max for nested lists.

    Closes #​9307

  • Fix false positive for used-before-assignment in a finally block when assignments took place in both the try block 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

Compare Source

What's new in Pylint 3.0.3?

Release date: 2023-12-11

False Positives Fixed

  • Fixed false positive for unnecessary-lambda when 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-variable and unused-argument for classes and functions using Python 3.12 generic type syntax.

    Closes #​9193

  • Fixed pointless-string-statement false positive for docstrings on Python 3.12 type aliases.

    Closes #​9268

  • Fix false positive for invalid-exception-operation when 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__.py file.

    Closes #​9210

v3.0.2

Compare Source

False Positives Fixed

  • Fix used-before-assignment false 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-max for expressions with additive operators, list and dict comprehensions.

    Closes #​8524

  • Fixes ignoring conditional imports with ignore-imports=y.

    Closes #​8914

  • Emit inconsistent-quotes for 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-class for generic Protocols.

    Closes #​9106

Other Changes

  • Fix a crash when an enum class which is also decorated with a dataclasses.dataclass decorator 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=all or disable=all follows in the same configuration file (or on the command line).

    This means for the following example, fixme messages will now be emitted:

        pylint my_module --enable=fixme --disable=all
    

    To 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.7 setting.

    Refs #​6306

  • Disables placed in a try block now apply to the except block. Previously, they only happened to do so in the presence of an else clause.

    Refs #​7767

  • pyreverse now uses a new default color palette that is more colorblind friendly. The color scheme is taken from Paul Tol's Notes <https://personal.sron.nl/~pault/>_. If you prefer other colors, you can use the --color-palette option 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 .vcg output 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.PYLINTRC was removed. Use the pylint.config.find_default_config_files generator instead.

    Closes #​8862

Changes requiring user actions

  • The invalid-name message 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-name message (instead of invalid-name), then simply add the option bad-names-rgxs="^..?$", which will fail 1-2 character-long names. (Ensure you enable disallowed-name.)

    • If you would prefer an invalid-name message 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 described here <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 the pull 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-zero was renamed use-implicit-booleaness-not-comparison-to-zero and compare-to-empty-string was renamed use-implicit-booleaness-not-comparison-to-string and they now need to be enabled explicitly.

    • The pylint.extensions.emptystring and pylint.extensions.compare-to-zero extensions no longer exist and need to be removed from the load-plugins option.

    • 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-exceptions option now only takes fully qualified names into account (builtins.Exception not Exception). 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 MASTER or master as configuration section in setup.cfg or tox.ini. It's bad practice to not start a section title with the tool name. Please use pylint.main instead.

    Refs #​8465

  • Package stats are now printed when running Pyreverse and a --verbose flag 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 json2 reporter has been added. It features a more enriched output that is easier to parse and provides more info.

    Compared to json the 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 the evaluation option and provides statistics about the modules you linted.

    We encourage users to use the new reporter as the json reporter 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) to pyreverse. This is similar to the behavior of --show-builtin in 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 DataclassChecker module and invalid-field-call checker to check for invalid dataclasses.field() usage.

    Refs #​5159

  • Add return-in-finally to emit a message if a return statement was found in a finally clause.

    Closes #​8260

  • Add a new checker kwarg-superseded-by-positional-arg to 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-namedtuple message to the CodeStyleChecker to suggest rewriting calls to collections.namedtuple as classes inheriting from typing.NamedTuple on Python 3.6+.

    Requires load-plugins=pylint.extensions.code_style and enable=prefer-typing-namedtuple to 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-argument false positive when __new__ does not use all the arguments of __init__.

    Closes #​3670

  • Fix a false positive for invalid-name when a type-annotated class variable in an enum.Enum class has no assigned value.

    Refs #​7402

  • Fix unused-import false positive for usage of six.with_metaclass.

    Closes #​7506

  • Fix false negatives and false positives for too-many-try-statements, too-complex, and too-many-branches by correctly counting statements under a try.

    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-assignment when usage and assignment are guarded by the same test in different statements.

    Closes #​8167

  • Adds asyncSetUp to the default defining-attr-methods list to silence attribute-defined-outside-init warning when using unittest.IsolatedAsyncioTestCase.

    Refs #​8403

  • logging-not-lazy is 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-name now allows for integers in typealias names:

    • now valid: Good2Name, GoodName2.
    • still invalid: _1BadName.

    Closes #​8485

  • No longer consider Union as type annotation as type alias for naming checks.

    Closes #​8487

  • unnecessary-lambda no 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-import so that it observes the dummy-variables-rgx option.

    Closes #​8500

  • Union typed variables without assignment are no longer treated as TypeAlias.

    Closes #​8540

  • Allow parenthesized implicitly concatenated strings when check-str-concat-over-line-jumps is enabled.

    Closes #​8552.

  • Fix false positive for positional-only-arguments-expected when a function contains both a positional-only parameter that has a default value, and **kwargs.

    Closes #​8555

  • Fix false positive for keyword-arg-before-vararg when a positional-only parameter with a default value precedes *args.

    Closes #​8570

  • Fix false positive for arguments-differ when overriding __init_subclass__.

    Closes #​8919

  • Fix a false positive for no-value-for-parameter when a staticmethod is called in a class body.

    Closes #​9036

False Negatives Fixed

  • Emit used-before-assignment when calling module-level functions before definition.

    Closes #​1144

  • Apply infer_kwarg_from_call() to more checks

    These mostly solve false negatives for various checks, save for one false positive for use-maxsplit-arg.

    Closes #​7761

  • TypeAlias variables defined in functions are now checked for invalid-name errors.

    Closes #​8536

  • Fix false negative for no-value-for-parameter when a function, whose signature contains both a positional-only parameter name and also *kwargs, is called with a keyword-argument for name.

    Closes #​8559

  • Fix a false negative for too-many-arguments by considering positional-only and keyword-only parameters.

    Closes #​8667

  • Emit assignment-from-no-return for calls to builtin methods like dict.update(). Calls to list.sort() now raise assignment-from-no-return rather than assignment-from-none for consistency.

    Closes #​8714 Closes #​8810

  • consider-using-augmented-assign is now applied to dicts and lists as well.

    Closes #​8959

Other Bug Fixes

  • Support duplicate-code message when parallelizing with --jobs.

    Closes #​374

  • Support cyclic-import message when parallelizing with --jobs.

    Closes #​4171

  • --jobs can 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-modules option will now be correctly taken into account for no-name-in-module.

    Closes #​7578

  • sys.argv is 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-exceptions setting when running with --jobs.

    Closes #​7774

  • Don't show class fields more than once in Pyreverse diagrams.

    Closes #​8189

  • Fix used-before-assignment false negative when TYPE_CHECKING imports are used in multiple scopes.

    Closes #​8198

  • --clear-cache-post-run now also clears LRU caches for pylint utilities holding references to AST nodes.

    Closes #​8361

  • Fix a crash when TYPE_CHECKING is used without importing it.

    Closes #​8434

  • Fix a used-before-assignment false positive when imports are made under the TYPE_CHECKING else if branch.

    Closes #​8437

  • Fix a regression of preferred-modules where 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-generator message for min() calls with default keyword.

    Closes #​8563

  • Fixed a crash when generating a configuration file: tomlkit.exceptions.TOMLKitError: Can't add a table to a dotted key caused by tomlkit v0.11.8.

    Closes #​8632

  • Fix a line break error in Pyreverse dot output.

    Closes #​8671

  • Fix a false positive for method-hidden when using cached_property decorator.

    Closes #​8753

  • Dunder methods defined in lambda do not trigger unnecessary-dunder-call anymore, 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 BaseChecker causing some reports not being exported.

    Closes #​9001

  • Don't add Optional to | annotations with None in 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.

    Closes #​5488 and #​2079

  • Search for pyproject.toml recursively in parent directories up to a project or file system root.

    Refs #​7163, Closes #​3289

  • 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_definition was removed from the base checker API. You can access message definitions through the MessageStore.

    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 Interface in pylint.interfaces were removed. Checker should only inherit BaseChecker or any of the other checker types from pylint.checkers. Reporter should only inherit BaseReporter.

    Refs #​8404

  • modname and msg_store are now required to be given in FileState. collect_block_lines has also been removed. Pylinter.current_name cannot be null anymore.

    Refs #​8407

  • Reporter.set_output was removed in favor of reporter.out = stream.

    Refs #​8408

  • A number of old utility functions and classes have been removed:

    MapReduceMixin: To make a checker reduce map data simply implement get_map_data and reduce_map_data.

    is_inside_lambda: Use utils.get_node_first_ancestor_of_type(x, nodes.Lambda)

    check_messages: Use utils.only_required_for_messages

    is_class_subscriptable_pep585_with_postponed_evaluation_enabled: Use is_postponed_evaluation_enabled(node) and is_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. Use discover_package_path and pass source root(s).

    fix_import_path: Use augmented_sys_path and pass additional sys.path entries as an argument obtained from discover_package_path.

    get_global_option: Use checker.linter.config to get all global options.

    Related private objects have been removed as well.

    Refs #​8409

  • colorize_ansi now only accepts a MessageStyle object.

    Refs #​8412

  • Following a deprecation period, Pylinter.check now only works with sequences of strings, not strings.

    Refs #​8463

  • Following a deprecation period, ColorizedTextReporter only accepts ColorMappingDict.

    Refs #​8464

  • Following a deprecation period, MessageTest's end_line and end_col_offset must 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_exit argument of the Run class (and of the _Run class in testutils) were removed.

    Refs #​8472

  • Following a deprecation period, the py_version argument of the MessageDefinition.may_be_emitted function 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 OutputLine class 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_block and is_node_in_guarded_import_block from pylint.utils were removed: use a combination of is_sys_guard and in_type_checking_block instead.

    Refs #​8475

  • Following a deprecation period, the location argument of the Message class must now be a MessageLocationTuple.

    Refs #​8477

  • Following a deprecation period, the check_single_file function of the Pylinter is replaced by Pylinter.check_single_file_item.

    Refs #​8478

Performance Improvements

  • pylint runs (at least) ~5% faster after improvements to astroid that make better use of the inference cache.

    Refs pylint-dev/astroid#529

    • Optimize is_trailing_comma().
    • Cache class_is_abstract().

    Refs #​1954

  • Exit immediately if all messages are disabled.

    Closes #​8715

v2.17.7

Compare Source

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

Compare Source

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.argv is 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 Optional to | annotations with None in Pyreverse diagrams.

    Closes #​9014

v2.17.5

Compare Source

What's new in Pylint 2.17.5?

Release date: 2023-07-26

False Positives Fixed

  • Fix a false positive for unused-variable when there is an import in a if TYPE_CHECKING: block and allow-global-unused-variables is set to no in the configuration.

    Closes #​8696

  • Fix false positives generated when supplying arguments as **kwargs to IO calls like open().

    Closes #​8719

  • Fix a false positive where pylint was ignoring method calls annotated as NoReturn during the inconsistent-return-statements check.

    Closes #​8747

  • Exempt parents with only type annotations from the invalid-enum-extension message.

    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-iterating checker when deleting members of a dict returned from a call.

    Closes #​8598

  • Fix crash in invalid-metaclass check when a metaclass had duplicate bases.

    Closes #​8698

  • Avoid consider-using-f-string on 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 nonlocal is defined at module-level.

    Closes #​8735

v2.17.4

Compare Source

False Positives Fixed

  • Fix a false positive for bad-dunder-name when 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 key caused by tomlkit v0.11.8.

    Closes #​8632

v2.17.3

Compare Source

What's new in Pylint 2.17.3?

Release date: 2023-04-24

False Positives Fixed

  • Fix unused-argument false positive when __new__ does not use all the arguments of __init__.

    Closes #​3670

  • Fix unused-import false positive for usage of six.with_metaclass.

    Closes #​7506

  • logging-not-lazy is 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-import so that it observes the dummy-variables-rgx option.

    Closes #​8500

  • Union typed variables without assignment are no longer treated as TypeAlias.

    Closes #​8540

  • Fix false positive for positional-only-arguments-expected when a function contains both a positional-only parameter that has a default value, and **kwargs.

    Closes #​8555

  • Fix false positive for keyword-arg-before-vararg when a positional-only parameter with a default value precedes *args.

    Closes #​8570

Other Bug Fixes

  • Improve output of consider-using-generator message for min()` calls with default`` keyword.

    Closes #​8563

v2.17.2

Compare Source

False Positives Fixed

  • invalid-name now allows for integers in typealias names:

    • now valid: Good2Name, GoodName2.
    • still invalid: _1BadName.

    Closes #​8485

  • No longer consider Union as type annotation as type alias for naming checks.

    Closes #​8487

  • unnecessary-lambda no 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

Compare Source

False Positives Fixed

  • Adds asyncSetUp to the default defining-attr-methods list to silence attribute-defined-outside-init warning when using unittest.IsolatedAsyncioTestCase.

    Refs #​8403

Other Bug Fixes

  • --clear-cache-post-run now also clears LRU caches for pylint utilities holding references to AST nodes.

    Closes #​8361

  • Fix a crash when TYPE_CHECKING is used without importing it.

    Closes #​8434

  • Fix a regression of preferred-modules where 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_block and will be removed in pylint 3.0:

    • is_node_in_guarded_import_block
    • is_node_in_typing_guarded_import_block
    • is_typing_guard

    is_sys_guard is still available, which was part of is_node_in_guarded_import_block.

    Refs #​8433

v2.17.0

Compare Source

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

  • pyreverse now supports custom color palettes with the --color-palette option.

    Closes #​6738

  • Add invalid-name check for TypeAlias names.

    Closes #​7081

  • Accept values of the form <class name>.<attribute name> for the exclude-protected list.

    Closes #​7343

  • Add --version option to pyreverse.

    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 TryStar nodes from Python 3.11 and should be fully compatible with Python 3.11.

    Closes #​8387

New Checks

  • Add a bad-chained-comparison check 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-alias check that emits a warning when a class derived from enum.IntFlag assigns 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-assignment when typing.TYPE_CHECKING is 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-assignment for named expressions appearing after the first element in a list, tuple, or set.

    Closes #​8252

  • Fix false positive for wrong-spelling-in-comment with 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-assignment false positive when the walrus operator is used with a ternary operator in dictionary key/value initialization.

    Closes #​8125

  • Fix no-name-in-module false 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-max suggestion 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-name for the line on which a global statement is declared.

    Closes #​8307

Other Changes

  • Update explanation for global-variable-not-assigned and 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

Compare Source

False Positives Fixed

  • Fix false positive for isinstance-second-argument-not-valid-type with union types.

    Closes #​8205

v2.16.3

Compare Source

False Positives Fixed

  • Fix false positive for wrong-spelling-in-comment with class names in a python 2 type comment.

    Closes #​8370

Other Bug Fixes

  • Prevent emitting invalid-name for the line on which a global statement is declared.

    Closes #​8307

v2.16.2

Compare Source

New Features

  • Add --version option to pyreverse.

    Refs #​7851

False Positives Fixed

  • Fix false positive for used-before-assignment when typing.TYPE_CHECKING is used with if/elif/else blocks.

    Closes #​7574

  • Fix false positive for used-before-assignment for named expressions appearing after the first element in a list, tuple, or set.

    Closes #​8252

Other Bug Fixes

  • Fix used-before-assignment false positive when the walrus operator is used with a ternary operator in dictionary key/value initialization.

    Closes #​8125

  • Fix no-name-in-module false positive raised when a package defines a variable with the same name as one of its submodules.

    Closes #​8148

  • Fix nested-min-max suggestion 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

Compare Source

Other Bug Fixes

  • Fix a crash happening for python interpreter < 3.9 following a failed typing update.

    Closes #​8161

v2.16.0

Compare Source

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-doc option related to missing-raises-doc will 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=no in your configuration to keep the same behavior. Closes #​7208

New Features

  • Added the no-header output 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-run to support server-like usage. Use this flag if you expect the linted files to be altered between runs. Refs #​5401

  • Add --allow-reexport-from-package option to configure the useless-import-alias check not to emit a warning if a name is reexported from a package. Closes #​6006

  • Update pyreverse to differentiate between aggregations and compositions. pyreverse checks 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-statement check that emits a warning when an Exception is created and not assigned, raised or returned. Refs #​3110

  • Add a shadowed-import message for aliased imports. Closes #​4836

  • Add new check called unbalanced-dict-unpacking to check for unbalanced dict unpacking in assignment and for loops. Closes #​5797

  • Add new checker positional-only-arguments-expected to check for cases when positional-only arguments have been passed as keyword arguments. Closes #​6489

  • Added singledispatch-method which informs that @singledispatch should decorate functions and not class/instance methods. Added singledispatchmethod-function which informs that @singledispatchmethod should decorate class/instance methods and not functions. Closes #​6917

  • Rename broad-except to broad-exception-caught and add new checker broad-exception-raised which will warn if general exceptions BaseException or Exception are raised. Closes #​7494

  • Added nested-min-max which flags min(1, min(2, 3)) to simplify to min(1, 2, 3). Closes #​7546

  • Extended use-dict-literal to also warn about call to dict() when passing keyword arguments. Closes #​7690

  • Add named-expr-without-context check to emit a warning if a named expression is used outside a context like if, for, while, or a comprehension. Refs #​7760

  • Add invalid-slice-step check to warn about a slice step value of 0 for common builtin sequences. Refs #​7762

  • Add consider-refactoring-into-while-condition check to recommend refactoring when a while loop is defined with a constant condition with an immediate if statement to check for break condition as a first statement. Closes #​8015

Extensions

  • Add new extension checker dict-init-mutate that flags mutating a dictionary immediately after the dictionary was created. Closes #​2876

  • Added bad-dunder-name extension check, which flags bad or misspelled dunder methods. You can use the good-dunder-names option to allow specific dunder names. Closes #​3038

  • Added consider-using-augmented-assign check for CodeStyle extension which flags x = x + 1 to simplify to x += 1. This check is disabled by default. To use it, load the code style extension with load-plugins=pylint.extensions.code_style and add consider-using-augmented-assign in the enable option. Closes #​3391

  • Add magic-number plugin 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-argument message for typing plugin 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-variable and unused-import when a name is only used in a string literal type annotation. Closes #​3299

  • Document a known false positive for useless-suppression when disabling line-too-long in a module with only comments and no code. Closes #​3368

  • trailing-whitespaces is no longer reported within strings. Closes #​3822

  • Fix false positive for global-variable-not-assigned when a global variable is re-assigned via an ImportFrom node. Closes #​4809

  • Fix false positive for use-maxsplit-arg with custom split method. Closes #​4857

  • Fix logging-fstring-interpolation false positive raised when logging and f-string with %s formatting. Closes #​4984

  • Fix false-positive for used-before-assignment in pattern matching with a guard. Closes #​5327

  • Fix use-sequence-for-iteration when unpacking a set with *. Closes #​5788

  • Fix deprecated-method false positive when alias for method is similar to name of deprecated method. Closes #​5886

  • Fix false positive assigning-non-slot when a class attribute is re-assigned. Closes #​6001

  • Fix false positive for too-many-function-args when a function call is assigned to a class attribute inside the class where the function is defined. Closes #​6592

  • Fixes false positive abstract-method on Protocol classes. Closes #​7209

  • Pylint now understands the kw_only keyword argument for dataclass. Closes #​7290, closes #​6550, closes #​5857

  • Fix false positive for undefined-loop-variable in for-else loops that use a function having a return type annotation of NoReturn or Never. Closes #​7311

  • Fix used-before-assignment for functions/classes defined in type checking guard. Closes #​7368

  • Fix false positive for unhashable-member when subclassing dict and using the subclass as a dictionary key. Closes #​7501

  • Fix the message for unnecessary-dunder-call for __aiter__ and __aneext__. Also only emit the warning when py-version >= 3.10. Closes #​7529

  • Fix used-before-assignment false positive when else branch calls sys.exit or similar terminating functions. Closes #​7563

  • Fix a false positive for used-before-assignment for imports guarded by typing.TYPE_CHECKING later used in variable annotations. Closes #​7609

  • Fix a false positive for simplify-boolean-expression when multiple values are inferred for a constant. Closes #​7626

  • unnecessary-list-index-lookup will not be wrongly emitted if enumerate is called with start. Closes #​7682

  • Don't warn about stop-iteration-return when using next() over itertools.cycle. Closes #​7765

  • Fixes used-before-assignment false positive when the walrus operator is used in a ternary operator. Closes #​7779

  • Fix missing-param-doc false positive when function parameter has an escaped underscore. Closes #​7827

  • Fixes method-cache-max-size-none false positive for methods inheriting from Enum. Closes #​7857

  • multiple-statements no longer triggers for function stubs using inlined .... Closes #​7860

  • Fix a false positive for used-before-assignment when a name guarded by if 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-assignment when imports guarded by if TYPE_CHECKING are guarded again when used. Closes #​7979

  • Fixes false positive for try-except-raise with multiple exceptions in one except statement if exception are in different namespace. Closes #​8051

  • Fix invalid-name errors for typing_extension.TypeVar. Refs #​8089

  • Fix no-kwoa false positive for context managers. Closes #​8100

  • Fix a false positive for redefined-variable-type when async methods are present. Closes #​8120

False Negatives Fixed

  • Code following a call to quit, exit, sys.exit or os._exit will be marked as unreachable. Refs #​519

  • Emit used-before-assignment when function arguments are redefined inside an inner function and accessed there before assignment. Closes #​2374

  • Fix a false negative for unused-import when one module used an import in a type annotation that was also used in another module. Closes #​4150

  • Flag superfluous-parens if parentheses are used during string concatenation. Closes #​4792

  • Emit used-before-assignment when relying on names only defined under conditions always testing false. Closes #​4913

  • consider-using-join can now be emitted for non-empty string separators. Closes #​6639

  • Emit used-before-assignment for further imports guarded by TYPE_CHECKING Previously, this message was only emitted for imports guarded directly under TYPE_CHECKING, not guarded two if-branches deep, nor when TYPE_CHECKING was imported from typing under an alias. Closes #​7539

  • Fix a false negative for unused-import when a constant inside typing.Annotated was treated as a reference to an import. Closes #​7547

  • consider-using-any-or-all message will now be raised in cases when boolean is initialized, reassigned during loop, and immediately returned. Closes #​7699

  • Extend invalid-slice-index to emit an warning for invalid slice indices used with string and byte sequences, and range objects. Refs #​7762

  • Fixes unnecessary-list-index-lookup false negative when enumerate is called with iterable as a kwarg. Closes #​7770

  • no-else-return or no-else-raise will be emitted if except block always returns or raises. Closes #​7788

  • Fix dangerous-default-value false negative when * is used. Closes #​7818

  • consider-using-with now triggers for pathlib.Path.open. Closes #​7964

Other Bug Fixes

  • Fix bug in detecting unused-variable when 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-name check 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-member false negative when augmented assign is done manually, without +=. Closes #​4562

  • Any assertion on a populated tuple will now receive a assert-on-tuple warning. Closes #​4655

  • missing-return-doc, missing-raises-doc and missing-yields-doc now respect the no-docstring-rgx option. Closes #​4743

  • Update reimported help message for clarity. Closes #​4836

  • consider-iterating-dictionary will no longer be raised if bitwise operations are used. Closes #​5478

  • Using custom braces in msg-template will 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 from unnecessary-dunder-call check. 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 OSError in 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-hook option changing sys.path before it can be imported, this will now emit a bad-plugin-value message. 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_iterating checker to fix a crash with for loops on empty list. Closes #​7380

  • Update wording for arguments-differ and arguments-renamed to clarify overriding object. Closes #​7390

  • disable-next is now correctly scoped to only the succeeding line. Closes #​7401

  • Fixed a crash in the unhashable-member checker when using a lambda as a dict key. Closes #​7453

  • Add mailcap to deprecated modules list. Closes #​7457

  • Fix a crash in the modified-iterating-dict checker involving instance attributes. Closes #​7461

  • invalid-class-object does not crash anymore when __class__ is assigned alongside another variable. Closes #​7467

  • --help-msg now accepts a comma-separated list of message IDs again. Closes #​7471

  • Allow specifying non-builtin exceptions in the overgeneral-exception option using an exception's qualified name. Closes #​7495

  • Report no-self-argument rather than no-method-argument for methods with variadic arguments. Closes #​7507

  • Fixed an issue where syntax-error couldn't be raised on files with invalid encodings. Closes #​7522

  • Fix false positive for redefined-outer-name when aliasing typing e.g. as t and guarding imports under t.TYPE_CHECKING. Closes #​7524

  • Fixed a crash of the modified_iterating checker when iterating on a set defined as a class attribute. Closes #​7528

  • Use py-version to determine if a message should be emitted for messages defined with max-version or min-version. Closes #​7569

  • Improve bad-thread-instantiation check to warn if target is not passed in as a keyword argument or as a second argument. Closes #​7570

  • Fixes edge case of custom method named next raised 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 dill would 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-arg default 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_lookup check when using enumerate with start and a class attribute. Closes #​7821

  • Fixes a crash in stop-iteration-return when the next builtin 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 ModuleNotFound exception when running pylint on a Django project with the pylint_django plugin 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-method to 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 docparams extension now considers typing in Numpy style docstrings as "documentation" for the missing-param-doc message. Refs #​7398

  • Relevant DeprecationWarnings are now raised with stacklevel=2, so they have the callsite attached in the message. Closes #​7463

  • Add a minimal option to pylint-config and its toml generator. Closes #​7485

  • Add method name to the error messages of no-method-argument and no-self-argument. Closes #​7507

  • Prevent leaving the pip install cache in the Docker image. Refs #​7544

  • Add a keyword-only compare_constants argument to safe_infer. Refs #​7626

  • Add default_enabled option 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 the enable option. Refs #​7629

  • Sort --generated-rcfile output. 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.path during execution of an init-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

Compare Source

False Positives Fixed

  • Fix use-sequence-for-iteration when unpacking a set with *.

    Closes #​5788

  • Fix false positive assigning-non-slot when a class attribute is re-assigned.

    Closes #​6001

  • Fixes used-before-assignment false positive when the walrus operator is used in a ternary operator.

    Closes #​7779

  • Prevent used-before-assignment when imports guarded by if TYPE_CHECKING are guarded again when used.

    Closes #​7979

Other Bug Fixes

  • Using custom braces in msg-template will now work properly.

    Closes #​5636

v2.15.9

Compare Source

False Positives Fixed

  • Fix false-positive for used-before-assignment in 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 ModuleNotFound exception when running pylint on a Django project with the pylint_django plugin enabled.

    Closes #​7938

v2.15.8

Compare Source

False Positives Fixed

  • Document a known false positive for useless-suppression when disabling line-too-long in a module with only comments and no code.

    Closes #​3368

  • Fix logging-fstring-interpolation false positive raised when logging and f-string with %s formatting.

    Closes #​4984

  • Fixes false positive abstract-method on Protocol classes.

    Closes #​7209

  • Fix missing-param-doc false positive when function parameter has an escaped underscore.

    Closes #​7827

  • multiple-statements no longer triggers for function stubs using inlined ....

    Closes #​7860

v2.15.7

Compare Source

False Positives Fixed

  • Fix deprecated-method false positive when alias for method is similar to name of deprecated method.

    Closes #​5886

  • Fix a false positive for used-before-assignment for imports guarded by typing.TYPE_CHECKING later 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.

    Closes #​6242, #​4053

  • Fixes a crash in stop-iteration-return when the next builtin is called without arguments.

    Closes #​7828

v2.15.6

Compare Source

False Positives Fixed

  • Fix false positive for unhashable-member when subclassing dict and using the subclass as a dictionary key.

    Closes #​7501

  • unnecessary-list-index-lookup will not be wrongly emitted if enumerate is called with start.

    Closes #​7682

  • Don't warn about stop-iteration-return when using next() over itertools.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 next raised 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

Compare Source

What's new in Pylint 2.15.5?

Release date: 2022-10-21

False Positives Fixed

  • Fix a false positive for simplify-boolean-expression when multiple values are inferred for a constant.

    Closes #​7626

Other Bug Fixes

  • Remove __index__ dunder method call from unnecessary-dunder-call check.

    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 dill would throw an error when attempting to serialise the linter object for multi-processing use.

    Closes #​7635.

Other Changes

  • Add a keyword-only compare_constants argument to safe_infer.

    Refs #​7626

  • Sort --generated-rcfile output.

    Refs #​7655

v2.15.4

Compare Source

False Positives Fixed

  • Fix the message for unnecessary-dunder-call for __aiter__ and __anext__. Also only emit the warning when py-version >= 3.10.

    Closes #​7529

Other Bug Fixes

  • Fix bug in detecting unused-variable when iterating on variable.

    Closes #​3044

  • Fixed handling of -- as separator between positional arguments and flags. This was not actually fixed in 2.14.5.

    Closes #​7003, Refs #​7096

  • Report no-self-argument rather than no-method-argument for methods with variadic arguments.

    Closes #​7507

  • Fixed an issue where syntax-error couldn't be raised on files with invalid encodings.

    Closes #​7522

  • Fix false positive for redefined-outer-name when aliasing typing e.g. as t and guarding imports under t.TYPE_CHECKING.

    Closes #​7524

  • Fixed a crash of the modified_iterating checker 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-argument and no-self-argument.

    Closes #​7507

v2.15.3

Compare Source

  • Fixed a crash in the unhashable-member checker when using a lambda as a dict key.

    Closes #​7453

  • Fix a crash in the modified-iterating-dict checker involving instance attributes.

    Closes #​7461

  • invalid-class-object does not crash anymore when __class__ is assigned alongside another variable.

    Closes #​7467

  • Fix false positive for global-variable-not-assigned when a global variable is re-assigned via an ImportFrom node.

    Closes #​4809

  • Fix false positive for undefined-loop-variable in for-else loops that use a function having a return type annotation of NoReturn or Never.

    Closes #​7311

  • --help-msg now accepts a comma-separated list of message IDs again.

    Closes #​7471

v2.15.2

Compare Source

  • Fixed a case where custom plugins specified by command line could silently fail.

    Specifically, if a plugin relies on the init-hook option changing sys.path before it can be imported, this will now emit a bad-plugin-value message. 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-assignment for functions/classes defined in type checking guard.

    Closes #​7368

  • Update modified_iterating checker to fix a crash with for loops on empty list.

    Closes #​7380

  • The docparams extension now considers typing in Numpy style docstrings as "documentation" for the missing-param-doc message.

    Refs #​7398

  • Fix false positive for unused-variable and unused-import when a name is only used in a string literal type annotation.

    Closes #​3299

  • Fix false positive for too-many-function-args when a function call is assigned to a class attribute inside the class where the function is defined.

    Closes #​6592

  • Fix used-before-assignment for 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-doc and missing-yields-doc now respect the no-docstring-rgx option.

    Closes #​4743

  • Don't crash on OSError in config file discovery.

    Closes #​7169

  • disable-next is now correctly scoped to only the succeeding line.

    Closes #​7401

  • Update modified_iterating checker to fix a crash with for loops on empty list.

    Closes #​7380

v2.15.0

Compare Source

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-timeout to 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-called for abstract __init__ methods.

    Closes #​3975

  • Don't report unsupported-binary-operation on 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-parameter for dataclasses fields annotated with KW_ONLY.

    Closes #​5767

  • Fixed inference of Enums when they are imported under an alias.

    Closes #​5776

  • Prevent false positives when accessing PurePath.parents by index (not slice) on Python 3.10+.

    Closes #​5832

  • unnecessary-list-index-lookup is now more conservative to avoid potential false positives.

    Closes #​6896

  • Fix double emitting trailing-whitespace for multi-line docstrings.

    Closes #​6936

  • import-error now correctly checks for contextlib.suppress guards on import statements.

    Closes #​7270

  • Fix false positive for no-self-argument/no-method-argument when a staticmethod is applied to a function but uses a different name.

    Closes #​7300

  • Fix undefined-loop-variable with break and continue statements in else blocks.

    Refs #​7311

False Negatives Fixed

  • Emit used-before-assignment when relying on a name that is reimported later in a function.

    Closes #​4624

  • Emit used-before-assignment for self-referencing named expressions (:=) lacking prior assignments.

    Closes #​5653

  • Emit used-before-assignment for self-referencing assignments under if conditions.

    Closes #​6643

  • Emit modified-iterating-list and analogous messages for dicts and sets when iterating literals, or when using the del keyword.

    Closes #​6648

  • Emit used-before-assignment when calling nested functions before assignment.

    Closes #​6812

  • Emit nonlocal-without-binding when a nonlocal name has been assigned at a later point in the same scope.

    Closes #​6883

  • Emit using-constant-test when testing the truth value of a variable or call result holding a generator.

    Closes #​6909

  • Rename unhashable-dict-key to unhashable-member and emit when creating sets and dicts, not just when accessing dicts.

    Closes #​7034, Closes #​7055

Other Bug Fixes

  • Fix a failure to lint packages with __init__.py contained 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-callable check when there is ambiguity whether an instance is being incorrectly provided to __new__().

    Closes #​7109

  • Fix crash when regex option raises a re.error exception.

    Closes #​7202

  • Fix undefined-loop-variable from walrus in comprehension test.

    Closes #​7222

  • Check for <cwd> before removing first item from sys.path in modify_sys_path.

    Closes #​7231

  • Fix sys.path pollution in parallel mode.

    Closes #​7246

  • Prevent useless-parent-delegation for delegating to a builtin written in C (e.g. Exception.__init__) with non-self arguments.

    Closes #​7319

Other Changes

  • bad-exception-context has been renamed to bad-exception-cause as it is about the cause and not the context.

    Closes #​3694

  • The message for literal-comparison is now more explicit about the problem and the solution.

    Closes #​5237

  • useless-super-delegation has been renamed to useless-parent-delegation in order to be more generic.

    Closes #​6953

  • Pylint now uses towncrier for changelog generation.

    Refs #​6974

  • Update astroid to 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.primer is 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

Compare Source

  • Fixed a crash in the undefined-loop-variable check when enumerate() is used in a ternary expression.

    Closes #​7131

  • Fixed handling of -- as separator between positional arguments and flags.

    Closes #​7003

  • Fixed the disabling of fixme and its interaction with useless-suppression.

  • Allow lists of default values in parameter documentation for Numpy style.

    Closes #​4035

v2.14.4

Compare Source

  • The differing-param-doc check was triggered by positional only arguments.

    Closes #​6950

  • Fixed an issue where scanning . directory recursively with --ignore-path=^path/to/dir is not ignoring the path/to/dir directory.

    Closes #​6964

  • Fixed regression that didn't allow quoted init-hooks in option files.

    Closes #​7006

  • Fixed a false positive for modified-iterating-dict when 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.cfg files. Only .cfg files that are exactly named setup.cfg require section names that start with pylint..

    Closes #​3630

  • Don't report import-private-name for relative imports.

    Closes #​7078

v2.14.3

Compare Source

  • Fixed two false positives for bad-super-call for calls that refer to a non-direct parent.

    Closes #​4922, Closes #​2903

  • Fixed a false positive for useless-super-delegation for subclasses that specify the number of of parameters against a parent that uses a variadic argument.

    Closes #​2270

  • Allow suppressing undefined-loop-variable and undefined-variable without raising useless-suppression.

  • Fixed false positive for undefined-variable for __class__ in inner methods.

    Closes #​4032

v2.14.2

Compare Source

  • Fixed a false positive for unused-variable when a function returns an argparse.Namespace object.

    Closes #​6895

  • Avoided raising an identical undefined-loop-variable message 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-string if the left side of a % is not a string.

    Closes #​6689

  • Fixed a false positive in unnecessary-list-index-lookup and unnecessary-dict-index-lookup when the subscript is updated in the body of a nested loop.

    Closes #​6818

  • Fixed an issue with multi-line init-hook options which did not record the line endings.

    Closes #​6888

  • Fixed a false positive for used-before-assignment when a try block returns but an except handler defines a name via type annotation.

  • --errors-only no 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

Compare Source

  • Avoid reporting unnecessary-dict-index-lookup or unnecessary-list-index-lookup when 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-import when aliasing typing e.g. as t and guarding imports under t.TYPE_CHECKING.

    Closes #​3846

  • Fixed a false positive regression in 2.13 for used-before-assignment where it is safe to rely on a name defined only in an except block because the else block 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_import extension.

    Closes #​6624

  • bad-option-value (E0012) is now a warning unknown-option-value (W0012). Deleted messages that do not exist anymore in pylint now raise useless-option-value (R0022) instead of bad-option-value. This allows to distinguish between genuine typos and configuration that could be cleaned up. Existing message disables for bad-option-value will still work on both new messages.

    Refs #​6794

v2.14.0

Compare Source

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-call for 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-lookup for indexing into a list while iterating over enumerate().

    Closes #​4525

  • Added new message called duplicate-value which identifies duplicate values inside sets.

    Closes #​5880

  • Added the super-without-brackets checker, 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-keyword message as there are no new keywords in the supported Python versions any longer.

    Closes #​4683

  • Moved no-self-use check to optional extension. You now need to explicitly enable this check using load-plugins=pylint.extensions.no_self_use.

    Closes #​5502

Extensions

  • RedefinedLoopNameChecker

    • Added optional extension redefined-loop-name to emit messages when a loop variable is redefined in the loop body.

    Closes #​5072

  • DocStringStyleChecker

    • Re-enable checker bad-docstring-quotes for Python <= 3.7.

    Closes #​6087

  • NoSelfUseChecker

    • Added no-self-use check, previously enabled by default.

    Closes #​5502

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 add pyenchant to pylint's dependencies. You will still need to install the requirements for pyenchant (the enchant library and any dictionaries) yourself. You will also need to set the spelling-dict option.

    Refs #​6462

  • Improved wording of the message of deprecated-module

    Closes #​6169

  • Pylint now requires Python 3.7.2 or newer to run.

    Closes #​4301

  • We made a greater effort to reraise failures stemming from the astroid library as AstroidError, with the effect that pylint emits astroid-error rather than merely fatal. 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-value inline (as long as you disable it before the bad option value is raised, i.e. disable=bad-option-value,bad-message not disable=bad-message,bad-option-value ) as well as certain other previously unsupported messages.

    Closes #​3312

  • The main checker name is now main instead of master. The configuration does not need to be updated as sections' name are optional.

    Closes #​5467

  • Update invalid-slots-object message to show bad object rather than its inferred value.

    Closes #​6101

  • Fixed a crash in the not-an-iterable checker involving multiple starred expressions inside a call.

    Closes #​6372

  • Fixed a crash in the unused-private-member checker involving chained private attributes.

    Closes #​6709

  • Disable spellchecking of mypy rule names in ignore directives.

    Closes #​5929

  • implicit-str-concat will now be raised on calls like open("myfile.txt" "a+b") too.

    Closes #​6441

  • Fix a failure to respect inline disables for fixme occurring on the last line of a module when pylint is launched with --enable=fixme.

  • Removed the broken generate-man option.

    Closes #​5283 Closes #​1887

  • Fixed failure to enable deprecated-module after a disable=all by making ImportsChecker solely responsible for emitting deprecated-module instead of sharing responsibility with StdlibChecker. (This could have led to double messages.)

  • Added the generate-toml-config option.

    Refs #​5462

  • bad-option-value will be emitted whenever a configuration value or command line invocation includes an unknown message.

    Closes #​4324

  • Added the unrecognized-option message. Raised if we encounter any unrecognized options.

    Closes #​5259

  • Fix false negative for bad-string-format-type if 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-none checker has been renamed to method-cache-max-size-none.

    Closes #​5670

  • The method-cache-max-size-none checker will now also check functools.cache.

    Closes #​5670

  • BaseChecker classes now require the linter argument to be passed.

  • The set_config_directly decorator has been removed.

  • Don't report useless-super-delegation for the __hash__ method in classes that also override the __eq__ method.

    Closes #​3934

  • Fix falsely issuing useless-suppression on the wrong-import-position checker.

    Closes #​5219

  • Fixed false positive no-member for Enums with self-defined members.

    Closes #​5138

  • Fix false negative for no-member when attempting to assign an instance attribute to itself without any prior assignment.

    Closes #​1555

  • Changed message type from redefined-outer-name to redefined-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-imports and ignore-signatures to False.

  • Pylint now expands the user path (i.e. ~ to home/yusef/) and expands environment variables (i.e. home/$USER/$project to home/yusef/pylint for USER=yusef and project=pylint) for pyreverse's output-directory, import-graph, ext-import-graph, int-import-graph options, and the spell checker's spelling-private-dict-file option.

    Refs #​6493

  • Don't emit unsubscriptable-object for string annotations. Pylint doesn't check if class is only generic in type stubs only.

    Closes #​4369 and #​6523

  • Fix pyreverse crash RuntimeError: dictionary changed size during iteration

    Refs #​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 pyreverse diagrams.

  • 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() and sum().

    Refs #​6595

  • Update ranges for using-constant-test and missing-parentheses-for-call-in-test error messages.

  • Don't emit no-member inside type annotations with from __future__ import annotations.

    Closes #​6594

  • Fix unexpected-special-method-signature false positive for __init_subclass__ methods with one or more arguments.

    Closes #​6644

Deprecations

  • The ignore-mixin-members option has been deprecated. You should now use the new ignored-checks-for-mixins option.

    Closes #​5205

  • interfaces.implements has been deprecated and will be removed in 3.0. Please use standard inheritance patterns instead of __implements__.

    Refs #​2287

  • All Interface classes in pylint.interfaces have 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

  • MapReduceMixin has been deprecated. BaseChecker now implements get_map_data and reduce_map_data. If a checker actually needs to reduce data it should define get_map_data as returning something different than None and let its reduce_map_data handle a list of the types returned by get_map_data. An example can be seen by looking at pylint/checkers/similar.py.

  • The config attribute of BaseChecker has been deprecated. You can use checker.linter.config to access the global configuration object instead of a checker-specific object.

    Refs #​5392

  • The level attribute of BaseChecker has been deprecated: everything is now displayed in --help, all the time.

    Refs #​5392

  • The set_option method of BaseChecker has been deprecated. You can use checker.linter.set_option to set an option on the global configuration object instead of a checker-specific object.

    Refs #​5392

  • The options_providers attribute of ArgumentsManager has 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-none checker will now also check functools.cache.

  • The config attribute of PyLinter is now of the argparse.Namespace type instead of optparse.Values.

    Refs #​5392

  • UnsupportedAction has been deprecated.

    Refs #​5392

  • OptionsManagerMixIn has been deprecated.

    Refs #​5392

  • OptionParser has been deprecated.

    Refs #​5392

  • Option has been deprecated.

    Refs #​5392

  • OptionsProviderMixIn has been deprecated.

    Refs #​5392

  • ConfigurationMixIn has been deprecated.

  • The option_groups attribute of PyLinter has been deprecated.

    Refs #​5392

  • get_global_config has been deprecated. You can now access all global options from checker.linter.config.

    Refs #​5392

  • OptionsManagerMixIn has been replaced with ArgumentsManager. ArgumentsManager is considered private API and most methods that were public on OptionsManagerMixIn have now been deprecated and will be removed in a future release.

    Refs #​5392

  • OptionsProviderMixIn has been replaced with ArgumentsProvider. ArgumentsProvider is considered private API and most methods that were public on OptionsProviderMixIn have now been deprecated and will be removed in a future release.

    Refs #​5392

  • pylint.pyreverse.ASTWalker has 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_enabled has been deprecated. Use is_postponed_evaluation_enabled(node) and is_node_in_type_annotation_context(node) instead.

    Refs #​6536

v2.13.9

Compare Source

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-module and import-error for numpy.distutils and pydantic.

    Closes #​6497

  • Fix IndexError crash in uninferable_final_decorators method.

    Relates to #​6531

  • Fix a crash in unnecessary-dict-index-lookup when 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-variable when using enumerate().

    Closes #​6593

v2.13.8

Compare Source

  • Fix a false positive for undefined-loop-variable for 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= to open

    Closes #​6414

  • Avoid reporting superfluous-parens on expressions using the is not operator.

    Closes #​5930

  • Fix a false positive for undefined-loop-variable when the else of a for loop raises or returns.

    Closes #​5971

  • Fix false positive for unused-variable for classes inside functions and where a metaclass is provided via a call.

    Closes #​4020

  • Fix false positive for unsubscriptable-object in Python 3.8 and below for statements guarded by if TYPE_CHECKING.

    Closes #​3979

v2.13.7

Compare Source

  • Fix a crash caused by using the new config from 2.14.0 in 2.13.x code.

    Closes #​6408

v2.13.6

Compare Source

  • Fix a crash in the unsupported-membership-test checker 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-doc and are parsed correctly.

    Closes #​5815 Closes #​5406

  • Fixed a false positive for unused-variable when a builtin specified in --additional-builtins is given a type annotation.

    Closes #​6388

  • Fixed an AstroidError in 2.13.0 raised by the duplicate-code checker with ignore-imports or ignore-signatures enabled.

    Closes #​6301

v2.13.5

Compare Source

  • Fix false positive regression in 2.13.0 for used-before-assignment for homonyms between variable assignments in try/except blocks and variables in subscripts in comprehensions.

    Closes #​6069 Closes #​6136

  • lru-cache-decorating-method has been renamed to cache-max-size-none and will only be emitted when maxsize is None.

    Closes #​6180

  • Fix false positive for unused-import when disabling both used-before-assignment and undefined-variable.

    Closes #​6089

  • Narrow the scope of the unnecessary-ellipsis checker to:

    • functions & classes which contain both a docstring and an ellipsis.
    • A body which contains an ellipsis nodes.Expr node & at least one other statement.
  • Fix false positive for used-before-assignment for assignments taking place via nonlocal declarations after an earlier type annotation.

    Closes #​5394

  • Fix crash for redefined-slots-in-subclass when the type of the slot is not a const or a string.

    Closes #​6100

  • Only raise not-callable when all the inferred values of a property are not callable.

    Closes #​5931

  • Fix a false negative for subclassed-final-class when a set of other messages were disabled.

v2.13.4

Compare Source

  • Fix false positive regression in 2.13.0 for used-before-assignment for homonyms between variable assignments in try/except blocks and variables in a comprehension's filter.

    Closes #​6035

  • Include testing_pylintrc in source and wheel distributions.

    Closes #​6028

  • Fix crash in super-init-not-called checker when using ctypes.Union.

    Closes #​6027

  • Fix crash for unneccessary-ellipsis checker when an ellipsis is used inside of a container or a lambda expression.

    Closes #​6036 Closes #​6037 Closes #​6048

v2.13.3

Compare Source

  • Fix false positive for unnecessary-ellipsis when 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

Compare Source

  • Fix crash when subclassing a namedtuple.

    Closes #​5982

  • Fix false positive for superfluous-parens for patterns like "return (a or b) in iterable".

    Closes #​5803

  • Fix a false negative regression in 2.13.0 where protected-access was 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

Compare Source

  • Fix a regression in 2.13.0 where used-before-assignment was emitted for the usage of a nonlocal in a try block.

    Fixes #​5965

  • Avoid emitting raising-bad-type when 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. HVACModeT or IPAddressT.

    Closes #​5981

  • Fixed false positive for unused-argument when a nonlocal name 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/dict when the list/dict/set being iterated through is a function call.

    Closes #​5969

  • Don't emit broken-noreturn and broken-collections-callable errors inside if TYPE_CHECKING blocks.

v2.13.0: 2.13.0

Compare Source

  • Add missing dunder methods to unexpected-special-method-signature check.

  • No longer emit no-member in for loops that reference self if the binary operation that started the for loop uses a self that 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 --notes options 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 def or class + the name of the class/function are covered.

    Closes #​5466

  • using-f-string-in-unsupported-version and using-final-decorator-in-unsupported-version msgids were renamed from W1601 and W1602 to W2601 and W2602. Disabling using these msgids will break. This is done in order to restore consistency with the already existing msgids for apply-builtin and basestring-builtin from 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 --recursive option to allow recursive discovery of all modules and packages in subtree. Running pylint with --recursive=y option will check all discovered .py files and packages found inside subtree of directory provided as parameter to pylint.

    Closes #​352

  • Add modified-iterating-list, modified-iterating-dict and modified-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-none checker 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 using load-plugins=pylint.extensions.private_import.

    Closes #​5463

  • Fixed crash from arguments-differ and arguments-renamed when methods were defined outside the top level of a class.

    Closes #​5648

  • Removed the deprecated check_docs extension. You can use the docparams checker to get the checks previously included in check_docs.

    Closes #​5322

  • Added a testutil extra require to the packaging, as gitpython should not be a dependency all the time but is still required to use the primer helper code in pylint.testutil. You can install it with pip 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 the pylint.extensions.eq_without_hash optional extension.

    Closes #​5025

  • Fixed an issue where ungrouped-imports could not be disabled without raising useless-suppression.

    Ref #​2366

  • Added several checkers to deal with unicode security issues (see Trojan Sources <https://trojansource.codes/>_ and PEP 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-encoding checks that the file is encoded in UTF-8 as suggested by PEP8 <https://www.python.org/dev/peps/pep-0008/#id20>. UTF-16 and UTF-32 are not supported by Python <https://bugs.python.org/issue1503789> at the moment. If this ever changes invalid-unicode-codec checks that they aren't used, to allow for backwards compatibility.

    • bidirectional-unicode checks 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-space and invalid-character-nul to check for possibly harmful unescaped characters.

    Closes #​5281

  • Use the tomli package instead of toml to parse .toml files.

Closes #​5885

  • Fix false positive - Allow unpacking of self in a subclass of typing.NamedTuple.

Closes #​5312

  • Fixed false negative unpacking-non-sequence when 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-comprehension when 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-undefined when global is used with a class name

    Closes #​3088

  • Fixed false positive for unused-variable when a nonlocal name is assigned as part of a multi-name assignment.

    Closes #​3781

  • Fixed a crash in unspecified-encoding checker when providing None to the mode argument of an open() call.

    Closes #​5731

  • Fixed a crash involving a NewType named with an f-string.

    Closes #​5770 Ref PyCQA/astroid#1400

  • Improved bad-open-mode message when providing None to the mode argument of an open() call.

    Closes #​5733

  • Added lru-cache-decorating-method checker with checks for the use of functools.lru_cache on 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-argument when 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 pylint now pickles the data passed to subprocesses with the dill package. The dill package 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-member checker when analyzing code using type(self) in bound methods.

    Closes #​5569

  • Optimize parsing of long lines when missing-final-newline is enabled.

    Closes #​5724

  • Fix false positives for used-before-assignment from using named expressions in a ternary operator test and using that expression as a call argument.

    Closes #​5177, #​5212

  • Fix false positive for undefined-variable when namedtuple class attributes are used as return annotations.

    Closes #​5568

  • Fix false negative for undefined-variable and 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-assignment instead of undefined-variable when attempting to access unused type annotations.

    Closes #​5713

  • Added confidence level CONTROL_FLOW for warnings relying on assumptions about control flow.

  • used-before-assignment now considers that assignments in a try block may not have occurred when the except or finally blocks are executed.

    Closes #​85, #​2615

  • Fixed false negative for used-before-assignment when a conditional or context manager intervened before the try statement that suggested it might fail.

    Closes #​4045

  • Fixed false negative for used-before-assignment in 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-slot when the slotted class defined __setattr__.

    Closes #​3793

  • Fixed a false positive for invalid-class-object when the object being assigned to the __class__ attribute is uninferable.

  • Fixed false positive for used-before-assignment with 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-assigned when the del statement is used

    Closes #​5333

  • By default, pylint does no longer take files starting with .# into account. Those are considered emacs file locks. See https://www.gnu.org/software/emacs/manual/html_node/elisp/File-Locks.html. This behavior can be reverted by redefining the ignore-patterns option.

    Closes #​367

  • Fixed a false positive for used-before-assignment when a named expression appears as the first value in a container.

    Closes #​5112

  • used-before-assignment now assumes that assignments in except blocks may not have occurred and warns accordingly.

    Closes #​4761

  • When evaluating statements after an except block, used-before-assignment assumes 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-assignment when 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 else clause of a loop, used-before-assignment assumes 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-assignment now checks names in try blocks.

  • Fixed false positive with used-before-assignment for assignment expressions in lambda statements.

    Closes #​5360, #​3877

  • Fixed a false positive (affecting unreleased development) for used-before-assignment involving 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 type as inner variable name.

    Closes #​5461

  • Fixed crash in use-maxsplit-arg checker when providing the sep argument to str.split() by keyword.

    Closes #​5737

  • Fix false positive for unused-variable for a comprehension variable matching an outer scope type annotation.

    Closes #​5326

  • Fix false negative for undefined-variable for a variable used multiple times in a comprehension matching an unused outer scope type annotation.

    Closes #​5654

  • Some files in pylint.testutils were deprecated. In the future imports should be done from the pylint.testutils.functional namespace directly.

  • Fixed false positives for no-value-for-parameter with variadic positional arguments.

    Closes #​5416

  • safe_infer no longer makes an inference when given two function definitions with differing numbers of arguments.

    Closes #​3675

  • Fix comparison-with-callable false 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-assignment from a class definition nested under a function subclassing a class defined outside the function.

    Closes #​4590

  • Fix unnecessary_dict_index_lookup false positive when deleting a dictionary's entry.

    Closes #​4716

  • Fix false positive for used-before-assignment when an except handler shares a name with a test in a filtered comprehension.

    Closes #​5817

  • Fix crash in unnecessary-dict-index-lookup checker if the output of items() is assigned to a 1-tuple.

    Closes #​5504

  • When invoking pylint, epylint, symilar or pyreverse by importing them in a python file you can now pass an argv keyword besides patching sys.argv.

    Closes #​5320

  • The PyLinter class will now be initialized with a TextReporter as its reporter if none is provided.

  • Fix super-init-not-called when parent or self is a Protocol

    Closes #​4790

  • Fix false positive not-callable with attributes that alias NamedTuple

    Partially closes #​1730

  • Emit redefined-outer-name when a nested except handler shadows an outer one.

    Closes #​4434 Closes #​5370

  • Fix false positive super-init-not-called for classes that inherit their init from a parent.

    Closes #​4941

  • encoding can now be supplied as a positional argument to calls that open files without triggering unspecified-encoding.

    Closes #​5638

  • Fatal errors now emit a score of 0.0 regardless of whether the linted module contained any statements

    Closes #​5451

  • fatal was 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-dictionary during membership checks encapsulated in iterables or not in checks

    Closes #​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-quotes for 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-differ when superclass static methods lacked a @staticmethod decorator.

    Closes #​5371

  • TypingChecker

  • The testutils for unittests now accept end_lineno and end_column. Tests without these will trigger a DeprecationWarning.

  • arguments-differ will no longer complain about method redefinitions with extra parameters that have default values.

    Closes #​1556, #​5338

  • Fixed false positive unexpected-keyword-arg for decorators.

    Closes #​258

  • Importing the deprecated stdlib module xml.etree.cElementTree now emits deprecated_module.

    Closes #​5862

  • Disables for deprecated-module and similar warnings for stdlib features deprecated in newer versions of Python no longer raise useless-suppression when linting with older Python interpreters where those features are not yet deprecated.

  • Importing the deprecated stdlib module distutils now emits deprecated_module on Python 3.10+.

  • missing-raises-doc will now check the class hierarchy of the raised exceptions

    .. code-block:: python

    def my_function() """My function.

    Raises:
      Exception: if something fails
    """
    raise ValueError
    

    Closes #​4955

  • Allow disabling duplicate-code with a disable comment when running through pylint.

    Closes #​214

  • Improve invalid-name check for TypeVar names. The accepted pattern can be customized with --typevar-rgx.

    Closes #​3401

  • Added new checker typevar-name-missing-variance. Emitted when a covariant or contravariant TypeVar does not end with _co or _contra respectively or when a TypeVar is not either but has a suffix.

  • Allow usage of mccabe 0.7.x release

    Closes #​5878

  • Fix unused-private-member false positive when accessing private methods through property.

    Closes #​4756

v2.12.2

Compare Source

  • Fixed a false positive for unused-import where everything was not analyzed properly inside typing guards.

  • Fixed a false-positive regression for used-before-assignment for typed variables in the body of class methods that reference the same class

    Closes #​5342

  • Specified that the ignore-paths option considers "" to represent a windows directory delimiter instead of a regular expression escape character.

  • Fixed a crash with the ignore-paths option 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 endLine and endColumn keys to output of JSONReporter.

    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-dictionary during membership checks encapsulated in iterables or not in checks

    Closes #​5323

  • unused-import now check all ancestors for typing guards

    Closes #​5316

v2.12.1: 2.12.1

Compare Source

  • Require Python 3.6.2 to run pylint.

    Closes #​5065

v2.12.0: 2.12.0

Compare Source

  • Upgrade astroid to 2.9.0

    Closes #​4982

  • Add ability to add end_line and end_column to the --msg-template option. With the standard TextReporter this 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

  • Fix install graphiz message which isn't needed for puml output format.

  • MessageTest of the unittest testutil now requires the confidence attribute to match the expected value. If none is provided it is set to UNDEFINED.

  • add_message of the unittest testutil now actually handles the col_offset parameter and allows it to be checked against actual output in a test.

  • Fix a crash in the check_elif extensions 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-expression when condition can be inferred as False.

    Closes #​5200

  • Fix exception when pyreverse parses property function of a class.

  • The functional testutils now accept end_lineno and end_column. Expected output files without these will trigger a DeprecationWarning. Expected output files can be easily updated with the python tests/test_functional.py --update-functional-output command.

  • The functional testutils now correctly check the distinction betweeen HIGH and UNDEFINED confidence. Expected output files without defiend confidence levels will now trigger a DeprecationWarning. Expected output files can be easily updated with the python tests/test_functional.py --update-functional-output command.

  • The functional test runner now supports the option min_pyver_end_position to control on which python versions the end_lineno and end_column attributes should be checked. The default value is 3.8.

  • Fix accept-no-yields-doc and accept-no-return-doc not allowing missing yield or return documentation when a docstring is partially correct

    Closes #​5223

  • Add an optional extension consider-using-any-or-all : Emitted when a for loop only produces a boolean and could be replaced by any or all using 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-doc

    Closes #​3799

  • Add checkers overridden-final-method & subclassed-final-class

    Closes #​3197

  • Fixed protected-access for accessing of attributes and methods of inner classes

    Closes #​3066

  • Added support for ModuleNotFoundError (import-error and no-name-in-module). ModuleNotFoundError inherits from ImportError and was added in Python 3.6

  • undefined-variable now correctly flags variables which only receive a type annotations and never get assigned a value

    Closes #​5140

  • undefined-variable now correctly considers the line numbering and order of classes used in metaclass declarations

    Closes #​4031

  • used-before-assignment now correctly considers references to classes as type annotation or default values in first-level methods

    Closes #​3771

  • undefined-variable and unused-variable now correctly trigger for assignment expressions in functions defaults

    Fixes part of #​3688

  • undefined-variable now 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 values

    Closes #​3688

  • Added the --enable-all-extensions command 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

    Closes #​2967 and #​5131

  • Improve and flatten unused-wildcard-import message

    Closes #​3859

  • In length checker, len-as-condition has been renamed as use-implicit-booleaness-not-len in order to be consistent with use-implicit-booleaness-not-comparison.

  • Created new UnsupportedVersionChecker checker class that includes checks for features not supported by all versions indicated by a py-version.

    • Added using-f-string-in-unsupported-version checker. Issued when py-version is set to a version that does not support f-strings (< 3.6)
  • Fix useless-super-delegation false positive when default keyword argument is a variable.

  • Properly emit duplicate-key when Enum members are duplicate dictionary keys

    Closes #​5150

  • Use py-version setting for alternative union syntax check (PEP 604), instead of the Python interpreter version.

  • Subclasses of dict are regarded as reversible by the bad-reversed-sequence checker (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-doc now correctly parses asterisks for variable length and keyword parameters

    Closes #​3733

  • mising-param-doc now correctly handles Numpy parameter documentation without explicit typing

    Closes #​5222

  • pylint no longer crashes when checking assignment expressions within if-statements

    Closes #​5178

  • Update ``literal-comparison``` checker to ignore tuple literals

    Closes #​3031

  • Normalize the input to the ignore-paths option to allow both Posix and Windows paths

    Closes #​5194

  • Fix double emitting of not-callable on inferrable properties

    Closes #​4426

  • self-cls-assignment now also considers tuple assignment

  • Fix missing-function-docstring not being able to check __init__ and other magic methods even if the no-docstring-rgx setting was set to do so

  • Added using-final-decorator-in-unsupported-version checker. Issued when py-version is set to a version that does not support typing.final (< 3.8)

  • Added configuration option exclude-too-few-public-methods to allow excluding classes from the min-public-methods checker.

    Closes #​3370

  • The --jobs parameter now fallbacks to 1 if the host operating system does not have functioning shared semaphore implementation.

    Closes #​5216

  • Fix crash for unused-private-member when 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-constant to its own extension comparison_placement. This checker was opinionated and now no longer a default. It can be reactived by adding pylint.extensions.comparison_placement to load-plugins in your config.

    Closes #​1064

  • A new bad-configuration-section checker 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-access on (outer) class traversal

  • Added new checker useless-with-lock to find incorrect usage of with statement and threading module locks. Emitted when with threading.Lock(): is used instead of with lock_instance:.

    Closes #​5208

  • Make yn validator case insensitive, to allow for True and False in config files.

  • Fix crash on open() calls when the mode argument is not a simple string.

    Partially closes #​5321

  • Inheriting from a class that implements __class_getitem__ no longer raises inherit-non-class.

  • Pyreverse - Add the project root directory to sys.path

    Closes #​2479

  • Don't emit consider-using-f-string if py-version is set to Python < 3.6. f-strings were added in Python 3.6

    Closes #​5019

  • Fix regression for unspecified-encoding with pathlib.Path.read_text()

    Closes #​5029

  • Don't emit consider-using-f-string if the variables to be interpolated include a backslash

  • Fixed false positive for cell-var-from-loop when variable is used as the default value for a keyword-only parameter.

    Closes #​5012

  • Fix false-positive undefined-variable with Lambda, IfExp, and assignment expression.

  • Fix false-positive useless-suppression for wrong-import-order

    Closes #​2366

  • Fixed toml dependency issue

    Closes #​5066

  • Fix false-positive useless-suppression for line-too-long

    Closes #​4212

  • Fixed invalid-name not checking parameters of overwritten base object methods

    Closes #​3614

  • Fixed crash in consider-using-f-string if format is not called

    Closes #​5058

  • Fix crash with AssignAttr in if TYPE_CHECKING blocks.

    Closes #​5111

  • Improve node information for invalid-name on function argument.

  • Prevent return type checkers being called on functions with ellipses as body

    Closes #​4736

  • Add is_sys_guard and is_typing_guard helper functions from astroid to pylint.checkers.utils.

  • Fix regression on ClassDef inference

    Closes #​5030 Closes #​5036

  • Fix regression on Compare node inference

    Closes #​5048

  • Fix false-positive isinstance-second-argument-not-valid-type with typing.Callable.

    Closes #​3507 Closes #​5087

  • It is now recommended to do pylint development on Python 3.8 or higher. This allows using the latest ast parser.

  • All standard jobs in the pylint CI now run on Python 3.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-alias and consider-using-alias with typing.Type + typing.Callable.

v2.11.1

Compare Source

  • unspecified-encoding now checks the encoding of pathlib.Path() correctly

    Closes #​5017

v2.11.0

Compare Source

  • The python3 porting mode checker and it's py3k option were removed. You can still find it in older pylint versions.

  • raising-bad-type is now properly emitted when raising a string

  • Added new extension SetMembershipChecker with use-set-for-membership check: Emitted when using an in-place defined list or tuple to do a membership test. sets are better optimized for that.

    Closes #​4776

  • Added py-version config 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.8

      Closes #​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-with if 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-redefined for simple type annotations

    Closes #​4936

  • Fix false positive for protected-access if a protected member is used in type hints of function definitions

  • Fix false positive dict-iter-missing-items for dictionaries only using tuples as keys

    Closes #​3282

  • The unspecified-encoding checker now also checks calls to pathlib.Path().read_text() and pathlib.Path().write_text()

    Closes #​4945

  • Fix false positive superfluous-parens for tuples created with inner tuples

    Closes #​4907

  • Fix false positive unused-private-member for accessing attributes in a class using cls

    Closes #​4849

  • Fix false positive unused-private-member for private staticmethods accessed in classmethods.

    Closes #​4849

  • Extended consider-using-in check to work for attribute access.

  • Setting min-similarity-lines to 0 now makes the similarty checker stop checking for duplicate code

    Closes #​4901

  • Fix a bug where pylint complained if the cache's parent directory does not exist

    Closes #​4900

  • The global-variable-not-assigned checker now catches global variables that are never reassigned in a local scope and catches (reassigned) functions

    Closes #​1375 Closes #​330

  • Fix false positives for invalid-all-format that are lists or tuples at runtime

    Closes #​4711

  • Fix no-self-use and docparams extension for async functions and methods.

  • Add documentation for pyreverse and symilar

    Closes #​4616

  • Non symbolic messages with the wrong capitalisation now correctly trigger use-symbolic-message-instead

    Closes #​5000

  • The consider-iterating-dictionary checker now also considers membership checks

    Closes #​4069

  • The invalid-name message is now more detailed when using multiple naming style regexes.

v2.10.2

Compare Source

  • We now use platformdirs instead of appdirs since the latter is not maintained.

    Closes #​4886

  • Fix a crash in the checker raising shallow-copy-environ when failing to infer on copy.copy

    Closes #​4891

v2.10.1

Compare Source

  • pylint does not crash when PYLINT_HOME does not exist.

    Closes #​4883

v2.10.0

Compare Source

  • pyreverse: add option to produce colored output.

    Closes #​4488

  • pyreverse: add output in PlantUML format.

    Closes #​4498

  • consider-using-with is 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-error message creation

    Closes #​4775

  • Added ignored-parents option to the design checker to ignore specific classes from the too-many-ancestors check (R0901).

    Partially closes #​3057

  • Added unspecified-encoding: Emitted when open() is called without specifying an encoding

    Closes #​3826

  • Improved the Similarity checker performance. Fix issue with --min-similarity-lines used with --jobs.

    Close #​4120 Close #​4118

  • Don't emit no-member error if guarded behind if statement.

    Ref #​1162 Closes #​1990 Closes #​4168

  • The default for PYLINTHOME is now the standard XDG_CACHE_HOME, and pylint now uses appdirs.

    Closes #​3878

  • Added use-list-literal: Emitted when list() is called with no arguments instead of using []

    Closes #​4365

  • Added use-dict-literal: Emitted when dict() 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 a while loop is used.

    Closes #​4367

  • Added forgotten-debug-statement: Emitted when breakpoint, pdb.set_trace or sys.breakpointhook calls are found

    Closes #​3692

  • Fix false-positive of unused-private-member when using nested functions in a class

    Closes #​4673

  • Fix crash for unused-private-member that occurred with nested attributes.

    Closes #​4755

  • Fix a false positive for unused-private-member with class names

    Closes #​4681

  • Fix false positives for superfluous-parens with walrus operator, ternary operator and inside list comprehension.

    Closes #​2818 Closes #​3249 Closes #​3608 Closes #​4346

  • Added format-string-without-interpolation checker: Emitted when formatting is applied to a string without any variables to be replaced

    Closes #​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-assignment when the variable is assigned in an exception handler, but used outside of the handler.

    Closes #​626

  • Added disable-next option: allows using # pylint: disable-next=msgid to disable a message for the following line

    Closes #​1682

  • Added redundant-u-string-prefix checker: Emitted when the u prefix is added to a string

    Closes #​4102

  • Fixed cell-var-from-loop checker: handle cell variables in comprehensions within functions, and function default argument expressions. Also handle basic variable shadowing.

    Closes #​2846 Closes #​3107

  • Fixed bug with cell-var-from-loop checker: it no longer has false negatives when both unused-variable and used-before-assignment are disabled.

  • Fix false postive for invalid-all-format if the list or tuple builtin functions are used

    Closes #​4711

  • Config files can now contain environment variables

    Closes #​3839

  • Fix false-positive used-before-assignment with an assignment expression in a Return node

    Closes #​4828

  • Added use-sequence-for-iteration: Emitted when iterating over an in-place defined set.

  • CodeStyleChecker

    • Limit consider-using-tuple to be emitted only for in-place defined lists.

    • Emit consider-using-tuple even if list contains a starred expression.

  • Ignore decorators lines by similarities checker when ignore signatures flag enabled

    Closes #​4839

  • Allow true and false values in pylintrc for better compatibility with toml config.

  • Class methods' signatures are ignored the same way as functions' with similarities "ignore-signatures" option enabled

    Closes #​4653

  • Improve performance when inferring Call nodes, by utilizing caching.

  • Improve error message for invalid-metaclass when the node is an Instance.

v2.9.6

Compare Source

  • Fix a false positive undefined-variable when variable name in decoration matches function argument

    Closes #​3791

v2.9.5

Compare Source

  • 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

Compare Source

  • Added time.clock to 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

    Closes #​4296 Closes #​3363

  • 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 with with

    Closes #​4676

  • Fix false-positive deprecated-module when relative import uses deprecated module name.

    Closes #​4629

  • Fix false-positive consider-using-with (R1732) if contextlib.ExitStack takes care of calling the __exit__ method

    Closes #​4654

  • Fix a false positive for unused-private-member when mutating a private attribute with cls

    Closes #​4657

  • Fix ignored empty functions by similarities checker with "ignore-signatures" option enabled

    Closes #​4652

  • Fix false-positive of use-maxsplit-arg when index is incremented in a loop

    Closes #​4664

  • Don't emit cyclic-import message if import is guarded by typing.TYPE_CHECKING.

    Closes #​3525

  • Fix false-positive not-callable with alternative TypedDict syntax

    Closes #​4715

  • Clarify documentation for consider-using-from-import

  • Don't emit unreachable warning for empty generator functions

    Closes #​4698

  • Don't emit import-error, no-name-in-module, and ungrouped-imports for imports guarded by sys.version_info or typing.TYPE_CHECKING.

    Closes #​3285 Closes #​3382

  • Fix invalid-overridden-method with nested property

    Closes #​4368

  • Fix false-positive of unused-private-member when using __new__ in a class

    Closes #​4668

  • No longer emit consider-using-with for ThreadPoolExecutor and ProcessPoolExecutor as they have legitimate use cases without a with block.

    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

Compare Source

  • Fix a crash that happened when analyzing empty function with docstring in the similarity checker.

    Closes #​4648

  • The similarity checker no longer add three trailing whitespaces for empty lines in its report.

v2.9.2

Compare Source

  • Fix a crash that happened when analysing code using type(self) to access a class attribute in the unused-private-member checker.

    Closes #​4638

  • Fix a false positive for unused-private-member when accessing a private variable with self

    Closes #​4644

  • Fix false-positive of unnecessary-dict-index-lookup and consider-using-dict-items for reassigned dict index lookups

    Closes #​4630

v2.9.1

Compare Source

v2.9.0

Compare Source

  • 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-doc on ignored argument using pylint.extensions.docparams when a function was typed using pep484 but not inside the docstring.

    Closes #​4117 Closes #​4593

  • setuptools_scm has been removed and replaced by tbump in order to not have hidden runtime dependencies to setuptools

  • Fix a crash when a test function is decorated with @pytest.fixture and astroid can't infer the name of the decorator when using open without with.

    Closes #​4612

  • Added deprecated-decorator: Emitted when deprecated decorator is used.

    Closes #​4429

  • Added ignore-paths behaviour. Defined regex patterns are matched against full file path.

    Close #​2541

  • Fix false negative for consider-using-with if calls like open() were used outside of assignment expressions.

  • The warning for arguments-differ now signals explicitly the difference it detected by naming the argument or arguments that changed and the type of change that occurred.

  • Suppress consider-using-with inside context managers.

    Closes #​4430

  • Added --fail-on option to return non-zero exit codes regardless of --fail-under value.

  • numversion tuple contains integers again to fix multiple pylint's plugins that relied on it

    Closes #​4420

  • Fix false-positive too-many-ancestors when inheriting from builtin classes, especially from the collections.abc module

    Closes #​4166 Closes #​4415

  • Stdlib deprecated modules check is moved to stdlib checker. New deprecated modules are added.

  • Fix raising false-positive no-member on abstract properties

  • Created new error message called arguments-renamed which 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-error if import guarded behind if sys.version_info >= (x, x)

  • Fix incompatibility with Python 3.6.0 caused by typing.Counter and typing.NoReturn usage

    Closes #​4412

  • New checker use-maxsplit-arg. Emitted either when accessing only the first or last element of str.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 checkerconsider-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-format and separate output files for each specified format.

    Closes #​1798

  • Make using-constant-test detect constant tests consisting of list literals like [] and [1, 2, 3].

  • Improved error message of unnecessary-comprehension checker 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-enumerate when 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-interpolation and logging-not-lazy, now works on logger class created from renamed logging import following an upgrade in astroid.

  • Fix false-positive no-member with generic base class

    Closes PyCQA/astroid#942

  • Fix assigning-non-slot false-positive with base that inherits from typing.Generic

    Closes #​4509 Closes PyCQA/astroid#999

  • New checker invalid-all-format. Emitted when __all__ has an invalid format, i.e. isn't a tuple or list.

  • Fix false positive unused-variable and undefined-variable with Pattern Matching in Python 3.10

  • New checker await-outside-async. Emitted when await is used outside an async function.

  • Clarify documentation for typing extension.

    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 slice as subscript for dict.

  • Reduce false-positives around inference of .value and .name properties on Enum subclasses, following an upgrade in astroid

    Closes #​1932 Closes #​2062

  • Fix issue with cached_property that caused invalid-overridden-method error when overriding a property.

    Closes #​4023

  • Fix unused-import false positive for imported modules referenced in attribute lookups in type comments.

    Closes #​4603

v2.8.3

Compare Source

Pin astroid to 2.5.6 for pylint 2.8.3

v2.8.2

Compare Source

  • Keep __pkginfo__.numversion a 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.Z and not pylint-X.Y.Z anymore.

v2.8.1

Compare Source

  • Add numversion back (temporarily) in __pkginfo__ because it broke Pylama and revert the unnecessary pylint.version breaking change.

    Closes #​4399

v2.8.0

Compare Source

  • New refactoring message consider-using-with. This message is emitted if resource-allocating functions or methods of the standard library (like open() or threading.Lock.acquire()) that can be used as a context manager are called without a with block.

    Closes #​3413

  • Resolve false positives on unused variables in decorator functions

    Closes #​4252

  • Add new extension ConfusingConsecutiveElifChecker. This optional checker emits a refactoring message (R5601 confusing-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-typecheck

    Closes #​3891

  • Apply const-naming-style to module constants annotated with typing.Final

  • The packaging is now done via setuptools exclusively. doc, tests, man, elisp and Changelog are 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 with pylint.__version__), other meta-information are still accessible with import importlib;metadata.metadata('pylint').

  • COPYING has been renamed to LICENSE for standardization.

  • Fix false-positive used-before-assignment in function returns.

    Closes #​4301

  • Updated astroid to 2.5.3

    Closes #​2822, #​4206, #​4284

  • Add consider-using-min-max-builtin check for if statement which could be replaced by Python builtin min or max

    Closes #​3406

  • Don't auto-enable postponed evaluation of type annotations with Python 3.10

  • Update astroid to 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-statements consider that assert False is a return node.

    Closes #​4019

  • Run will not fail if score exactly equals config.fail_under.

  • Functions that never returns may declare NoReturn as type hints, so that inconsistent-return-statements is not emitted.

    Closes #​4122, #​4188

  • 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.ClassVar to be identified as class constants. Now, class variables annotated with typing.Final are identified as such.

    Closes #​4277

  • Continuous integration with read the doc has been added.

    Closes #​3850

  • Don't show DuplicateBasesError for attribute access

  • Fix crash when checking setup.cfg for pylint config when there are non-ascii characters in there

    Closes #​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

Compare Source

  • Fix a problem with disabled msgid not being ignored

    Closes #​4265

  • Fix issue with annotated class constants

v2.7.3

Compare Source

  • Introduce logic for checking deprecated attributes in DeprecationMixin.

  • Reduce usage of blacklist/whitelist terminology. Notably, extension-pkg-allow-list is an alternative to extension-pkg-whitelist and the message blacklisted-name is now emitted as disallowed-name. The previous names are accepted to maintain backward compatibility.

  • Move deprecated checker to DeprecatedMixin

    Closes #​4086

  • Bump astroid version to 2.5.2

  • Fix false positive for method-hidden when using private attribute and method

    Closes #​3936

  • use-symbolic-message-instead now also works on legacy messages like C0111 (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_case

    Closes #​4149

  • Add allowed-redefined-builtins option for fine tuning redefined-builtin check.

    Close #​3263

  • Fix issue when executing with python -m pylint

    Closes #​4161

  • Exempt typing.TypedDict from too-few-public-methods check.

    Closes #​4180

  • Fix false-positive no-member for typed annotations without default value.

    Closes #​3167

  • Add --class-const-naming-style for Enum constants and class variables annotated with typing.ClassVar

    Closes #​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

    Closes #​3763, #​4238

  • Improve check if class is subscriptable PEP585

  • Fix documentation and filename handling of --import-graph

  • Fix false-positive for unused-import on class keyword arguments

    Closes #​3202

  • Fix regression with plugins on PYTHONPATH if latter is cwd

    Closes #​4252

v2.7.2

Compare Source

  • Fix False Positive on Enum.__members__.items(), Enum.__members__.values, and Enum.__members__.keys Closes #​4123

  • Properly strip dangerous sys.path entries (not just the first one)

    Closes #​3636

v2.7.1

Compare Source

  • Expose UnittestLinter in pylint.testutils

  • Don't check directories starting with '.' when using register_plugins

    Closes #​4119

v2.7.0

Compare Source

  • Introduce DeprecationMixin for reusable deprecation checks.

    Closes #​4049

  • Fix false positive for builtin-not-iterating when map receives iterable

    Closes #​4078

  • Python 3.6+ is now required.

  • Fix false positive for builtin-not-iterating when zip receives iterable

  • Add nan-comparison check for NaN comparisons

  • Bug fix for empty-comment message line number.

    Closes #​4009

  • Only emit bad-reversed-sequence on dictionaries if below py3.8

    Closes #​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

    Closes #​3347, #​3953, #​3865, #​3275

  • 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-variable caused by chained attributes in metaclass

    Close #​3742

  • Fix false positive for not-async-context-manager when contextlib.asynccontextmanager is used

    Close #​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-use and unused-argument for methods of generic structural types (Protocol[T])

    Closes #​3885

  • Fix bug that lead to duplicate messages when using --jobs 2 or more.

    Close #​3584

  • Adds option check-protected-access-in-special-methods in the ClassChecker to activate/deactivate protected-access message emission for single underscore prefixed attribute in special methods.

    Close #​3120

  • Fix vulnerable regular expressions in pyreverse

    Close #​3811

  • inconsistent-return-statements message is now emitted if one of try/except statement is not returning explicitly while the other do.

    Closes #​3468

  • Fix useless-super-delegation false 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-names in DocstringParameterChecker and adds useless-param-doc and useless-type-doc messages.

    Close #​3800

  • Enforce docparams consistently when docstring is not present

    Close #​2738

  • Fix duplicate-code false positive when lines only contain whitespace and non-alphanumeric characters (e.g. parentheses, bracket, comman, etc.)

  • Improve lint message for singleton-comparison with 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-differs false positive for functions with variadics

    Close #​3737

  • Fix a crash in consider-using-enumerate when encountering range() without arguments

    Close #​3735

  • len-as-conditions is 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-members now matches the qualified name of members

    Close #​2498

  • Add check for bool function to len-as-condition

  • Add simplifiable-condition check for extraneous constants in conditionals using and/or.

  • Add condition-evals-to-constant check 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-generator

    This check warns when a comprehension is used inside an any or all function, 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

Compare Source

  • Fix various scope-related bugs in undefined-variable checker

    Close #​1082, #​3434, #​3461

  • 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-whitespace by using clever options

    Close #​1368

  • missing-kwoa is no longer emitted when dealing with overload functions

    Close #​3655

  • mixed-indentation has been removed, it is no longer useful since TabError is included directly in python3

    Close #​2984 #​3573

  • Add super-with-arguments check 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-under not accepting floats

  • Fix a bug with ignore-docstrings ignoring all lines in a module

  • Fix pre-commit config 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-from check 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-library option 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, the known-standard-library option in pylint now maps to extra-standard-library in isort 5. If you really want what known-standard-library now means in isort 5, you must disable the wrong-import-order check in pylint and run isort manually with a proper isort configuration file.

    Close #​3722

v2.5.3

Compare Source

  • Fix a regression where disable comments that have checker names with numbers in them are not parsed correctly

    Close #​3666

  • property-with-parameters properly handles abstract properties

    Close #​3600

  • continue-in-finally no longer emitted on Python 3.8 where it's now valid

    Close #​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 AttributeError when checking cell-var-from-loop

    Close #​3646

v2.5.2

Compare Source

  • pylint.Run accepts do_exit as a deprecated parameter

    Close #​3590

v2.5.1

Compare Source

  • Fix a crash in method-hidden lookup for unknown base classes

    Close #​3527

  • Revert pylint.Run's exit parameter to do_exit

    This has been inadvertently changed several releases ago to do_exit.

    Close #​3533

  • no-value-for-parameter variadic detection has improved for assign statements

    Close #​3563

  • Allow package files to be properly discovered with multiple jobs

    Close #​3524

  • Allow linting directories without __init__.py which was a regression in 2.5.

    Close #​3528

v2.5.0

Compare Source

  • Fix a false negative for undefined-variable when using class attribute in comprehension.

    Close #​3494

  • Fix a false positive for undefined-variable when using class attribute in decorator or as type hint.

    Close #​511 Close #​1976

  • Remove HTML quoting of messages in JSON output.

    Close #​2769

  • Adjust the invalid-name rule to work with non-ASCII identifiers and add the non-ascii-name rule.

    Close #​2725

  • Positional-only arguments are taken in account for useless-super-delegation

  • unidiomatic-typecheck is no longer emitted for in and not in operators

    Close #​3337

  • Positional-only argument annotations are taken in account for unused-import

    Close #​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-variable on tuple unpacking.

    Close #​3433

  • no-self-use is no longer emitted for typing stubs.

    Close #​3439

  • Fix a false positive for undefined-variable when __class__ is used

    Close #​3090

  • Emit invalid-name for variables defined in loops at module level.

    Close #​2695

  • Add a check for cases where the second argument to isinstance is not a type.

    Close #​3308

  • Add 'notes-rgx' option, to be used for fixme check.

    Close #​2874

  • function-redefined exempts function redefined on a condition.

    Close #​2410

  • typing.overload functions are exempted from docstring checks

    Close #​3350

  • Emit invalid-overridden-method for improper async def overrides.

    Close #​3355

  • Do not allow python -m pylint ... to import user code

    python -m pylint ... adds the current working directory as the first element of sys.path. This opens up a potential security hole where pylint will 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-rgx option for _redeclared-assigned-name check.

    Close #​3341

  • Fixed graph creation for relative paths

  • Add a check for asserts on string literals.

    Close #​3284

  • not in is considered iterating context for some of the Python 3 porting checkers.

  • A new check inconsistent-quotes was 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-*-docstring can look for __doc__ assignments.

    Close #​3301

  • undefined-variable can now find undefined loop iterables

    Close #​498

  • safe_infer can 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-long for multilines when disable=line-too-long comment stands at their end

    Close #​2957

  • Fixed an AttributeError caused by improper handling of dataclasses inference in pyreverse

    Close #​3256

  • Do not exempt bare except from undefined-variable and similar checks

    If a node was wrapped in a TryExcept, pylint was 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. NameError or ImportError)

    Close #​3235

  • No longer emit assignment-from-no-return when a function only raises an exception

    Close #​3218

  • Allow import aliases to exempt import-error when used in type annotations.

    Close #​3178

  • Ellipsis` is exempted from multiple-statements`` for function overloads.

    Close #​3224

  • No longer emit invalid-name for 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.

    Close #​3111 Close #​3132

  • Allow implicit-str-concat-in-sequence to be emitted for string juxtaposition

    Close #​3030

  • implicit-str-concat-in-sequence was renamed implicit-str-concat

  • The json reporter no longer bypasses redirect_stdout. Close #​3227

  • Move NoFileError, OutputLine, FunctionalTestReporter, FunctionalTestFile, LintModuleTest and related methods from test_functional.py to pylint.testutils to 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.getargvalues is no longer marked as deprecated.

  • A new check f-string-without-interpolation was added

    Close #​3190

  • Flag mutable collections.* utilities as dangerous defaults

    Close #​3183

  • docparams extension 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-hidden when 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-stdin option

    Pylint 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-variable and unused-import false positives when using a metaclass via an attribute.

    Close #​1603

  • Emit unused-argument for functions that partially uses their argument list before raising an exception.

    Close #​3246

  • Fixed broad_try_clause extension to check try/finally statements and to check for nested statements (e.g., inside of an if statement).

  • Recognize classes explicitly inheriting from abc.ABC or having an abc.ABCMeta metaclass as abstract. This makes them not trigger W0223.

    Closes #​3098

  • Fix overzealous arguments-differ when overridden function uses variadics

    No 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.

    Close #​1482 Close #​1553

  • Multiple types of string formatting are allowed in logging functions.

    The logging-fstring-interpolation message has been brought back to allow multiple types of string formatting to be used.

    Close #​3361

v2.4.4

Compare Source

  • Exempt all the names found in type annotations from unused-import

    The previous code was assuming that only typing names 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 typing module

    Close #​3191

v2.4.3

Compare Source

v2.4.2

Compare Source

v2.4.1

Compare Source

v2.4.0

Compare Source


Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻️ Rebasing: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this MR and you won't be reminded about this update again.


  • If you want to rebase/retry this MR, check this box

This MR has been generated by Renovate Bot.

Edited by Renovate Bot

Merge request reports

Loading