Skip to content

chore(deps): update python linters (major)

Vincent Meurisse requested to merge renovate/major-python-linters into main

This MR contains the following updates:

Package Type Update Change
black (changelog) dev-dependencies major 23.3.0 -> 24.4.2
pylint (changelog) dev-dependencies major 2.12.2 -> 3.1.0

Release Notes

psf/black (black)

v24.4.2

Compare Source

This is a bugfix release to fix two regressions in the new f-string parser introduced in 24.4.1.

Parser
  • Fix regression where certain complex f-strings failed to parse (#​4332)
Performance
  • Fix bad performance on certain complex string literals (#​4331)

v24.4.1

Compare Source

Highlights
  • Add support for the new Python 3.12 f-string syntax introduced by PEP 701 (#​3822)
Stable style
  • Fix crash involving indented dummy functions containing newlines (#​4318)
Parser
  • Add support for type parameter defaults, a new syntactic feature added to Python 3.13 by PEP 696 (#​4327)
Integrations
  • Github Action now works even when git archive is skipped (#​4313)

v24.4.0

Compare Source

Stable style
  • Fix unwanted crashes caused by AST equivalency check (#​4290)
Preview style
  • if guards in case blocks are now wrapped in parentheses when the line is too long. (#​4269)
  • Stop moving multiline strings to a new line unless inside brackets (#​4289)
Integrations
  • Add a new option use_pyproject to the GitHub Action psf/black. This will read the Black version from pyproject.toml. (#​4294)

v24.3.0

Compare Source

Highlights

This release is a milestone: it fixes Black's first CVE security vulnerability. If you run Black on untrusted input, or if you habitually put thousands of leading tab characters in your docstrings, you are strongly encouraged to upgrade immediately to fix CVE-2024-21503.

This release also fixes a bug in Black's AST safety check that allowed Black to make incorrect changes to certain f-strings that are valid in Python 3.12 and higher.

Stable style
  • Don't move comments along with delimiters, which could cause crashes (#​4248)
  • Strengthen AST safety check to catch more unsafe changes to strings. Previous versions of Black would incorrectly format the contents of certain unusual f-strings containing nested strings with the same quote type. Now, Black will crash on such strings until support for the new f-string syntax is implemented. (#​4270)
  • Fix a bug where line-ranges exceeding the last code line would not work as expected (#​4273)
Performance
  • Fix catastrophic performance on docstrings that contain large numbers of leading tab characters. This fixes CVE-2024-21503. (#​4278)
Documentation
  • Note what happens when --check is used with --quiet (#​4236)

v24.2.0

Compare Source

Stable style
  • Fixed a bug where comments where mistakenly removed along with redundant parentheses (#​4218)
Preview style
  • Move the hug_parens_with_braces_and_square_brackets feature to the unstable style due to an outstanding crash and proposed formatting tweaks (#​4198)
  • Fixed a bug where base expressions caused inconsistent formatting of ** in tenary expression (#​4154)
  • Checking for newline before adding one on docstring that is almost at the line limit (#​4185)
  • Remove redundant parentheses in case statement if guards (#​4214).
Configuration
  • Fix issue where Black would ignore input files in the presence of symlinks (#​4222)
  • Black now ignores pyproject.toml that is missing a tool.black section when discovering project root and configuration. Since Black continues to use version control as an indicator of project root, this is expected to primarily change behavior for users in a monorepo setup (desirably). If you wish to preserve previous behavior, simply add an empty [tool.black] to the previously discovered pyproject.toml (#​4204)
Output
  • Black will swallow any SyntaxWarnings or DeprecationWarnings produced by the ast module when performing equivalence checks (#​4189)
Integrations
  • Add a JSONSchema and provide a validate-pyproject entry-point (#​4181)

v24.1.1

Compare Source

Bugfix release to fix a bug that made Black unusable on certain file systems with strict limits on path length.

Preview style
  • Consistently add trailing comma on typed parameters (#​4164)
Configuration
  • Shorten the length of the name of the cache file to fix crashes on file systems that do not support long paths (#​4176)

v24.1.0

Compare Source

Highlights

This release introduces the new 2024 stable style (#​4106), stabilizing the following changes:

  • Add parentheses around if-else expressions (#​2278)
  • Dummy class and function implementations consisting only of ... are formatted more compactly (#​3796)
  • If an assignment statement is too long, we now prefer splitting on the right-hand side (#​3368)
  • Hex codes in Unicode escape sequences are now standardized to lowercase (#​2916)
  • Allow empty first lines at the beginning of most blocks (#​3967, #​4061)
  • Add parentheses around long type annotations (#​3899)
  • Enforce newline after module docstrings (#​3932, #​4028)
  • Fix incorrect magic trailing comma handling in return types (#​3916)
  • Remove blank lines before class docstrings (#​3692)
  • Wrap multiple context managers in parentheses if combined in a single with statement (#​3489)
  • Fix bug in line length calculations for power operations (#​3942)
  • Add trailing commas to collection literals even if there's a comment after the last entry (#​3393)
  • When using --skip-magic-trailing-comma or -C, trailing commas are stripped from subscript expressions with more than 1 element (#​3209)
  • Add extra blank lines in stubs in a few cases (#​3564, #​3862)
  • Accept raw strings as docstrings (#​3947)
  • Split long lines in case blocks (#​4024)
  • Stop removing spaces from walrus operators within subscripts (#​3823)
  • Fix incorrect formatting of certain async statements (#​3609)
  • Allow combining # fmt: skip with other comments (#​3959)

There are already a few improvements in the --preview style, which are slated for the 2025 stable style. Try them out and share your feedback. In the past, the preview style has included some features that we were not able to stabilize. This year, we're adding a separate --unstable style for features with known problems. Now, the --preview style only includes features that we actually expect to make it into next year's stable style.

Stable style

Several bug fixes were made in features that are moved to the stable style in this release:

  • Fix comment handling when parenthesising conditional expressions (#​4134)
  • Fix bug where spaces were not added around parenthesized walruses in subscripts, unlike other binary operators (#​4109)
  • Remove empty lines before docstrings in async functions (#​4132)
  • Address a missing case in the change to allow empty lines at the beginning of all blocks, except immediately before a docstring (#​4130)
  • For stubs, fix logic to enforce empty line after nested classes with bodies (#​4141)
Preview style
  • Add --unstable style, covering preview features that have known problems that would block them from going into the stable style. Also add the --enable-unstable-feature flag; for example, use --enable-unstable-feature hug_parens_with_braces_and_square_brackets to apply this preview feature throughout 2024, even if a later Black release downgrades the feature to unstable (#​4096)
  • Format module docstrings the same as class and function docstrings (#​4095)
  • Fix crash when using a walrus in a dictionary (#​4155)
  • Fix unnecessary parentheses when wrapping long dicts (#​4135)
  • Stop normalizing spaces before # fmt: skip comments (#​4146)
Configuration
  • Print warning when configuration in pyproject.toml contains an invalid key (#​4165)
  • Fix symlink handling, properly ignoring symlinks that point outside of root (#​4161)
  • Fix cache mtime logic that resulted in false positive cache hits (#​4128)
  • Remove the long-deprecated --experimental-string-processing flag. This feature can currently be enabled with --preview --enable-unstable-feature string_processing. (#​4096)
Integrations
  • Revert the change to run Black's pre-commit integration only on specific git hooks (#​3940) for better compatibility with older versions of pre-commit (#​4137)

v23.12.1

Compare Source

Packaging
  • Fixed a bug that included dependencies from the d extra by default (#​4108)

v23.12.0

Compare Source

Highlights

It's almost 2024, which means it's time for a new edition of Black's stable style! Together with this release, we'll put out an alpha release 24.1a1 showcasing the draft 2024 stable style, which we'll finalize in the January release. Please try it out and share your feedback.

This release (23.12.0) will still produce the 2023 style. Most but not all of the changes in --preview mode will be in the 2024 stable style.

Stable style
  • Fix bug where # fmt: off automatically dedents when used with the --line-ranges option, even when it is not within the specified line range. (#​4084)
  • Fix feature detection for parenthesized context managers (#​4104)
Preview style
  • Prefer more equal signs before a break when splitting chained assignments (#​4010)
  • Standalone form feed characters at the module level are no longer removed (#​4021)
  • Additional cases of immediately nested tuples, lists, and dictionaries are now indented less (#​4012)
  • Allow empty lines at the beginning of all blocks, except immediately before a docstring (#​4060)
  • Fix crash in preview mode when using a short --line-length (#​4086)
  • Keep suites consisting of only an ellipsis on their own lines if they are not functions or class definitions (#​4066) (#​4103)
Configuration
  • --line-ranges now skips Black's internal stability check in --safe mode. This avoids a crash on rare inputs that have many unformatted same-content lines. (#​4034)
Packaging
Integrations

v23.11.0

Compare Source

Highlights
  • Support formatting ranges of lines with the new --line-ranges command-line option (#​4020)
Stable style
  • Fix crash on formatting bytes strings that look like docstrings (#​4003)
  • Fix crash when whitespace followed a backslash before newline in a docstring (#​4008)
  • Fix standalone comments inside complex blocks crashing Black (#​4016)
  • Fix crash on formatting code like await (a ** b) (#​3994)
  • No longer treat leading f-strings as docstrings. This matches Python's behaviour and fixes a crash (#​4019)
Preview style
  • Multiline dicts and lists that are the sole argument to a function are now indented less (#​3964)
  • Multiline unpacked dicts and lists as the sole argument to a function are now also indented less (#​3992)
  • In f-string debug expressions, quote types that are visible in the final string are now preserved (#​4005)
  • Fix a bug where long case blocks were not split into multiple lines. Also enable general trailing comma rules on case blocks (#​4024)
  • Keep requiring two empty lines between module-level docstring and first function or class definition (#​4028)
  • Add support for single-line format skip with other comments on the same line (#​3959)
Configuration
  • Consistently apply force exclusion logic before resolving symlinks (#​4015)
  • Fix a bug in the matching of absolute path names in --include (#​3976)
Performance
  • Fix mypyc builds on arm64 on macOS (#​4017)
Integrations
  • Black's pre-commit integration will now run only on git hooks appropriate for a code formatter (#​3940)

v23.10.1

Compare Source

Highlights
  • Maintenance release to get a fix out for GitHub Action edge case (#​3957)
Preview style
  • Fix merging implicit multiline strings that have inline comments (#​3956)
  • Allow empty first line after block open before a comment or compound statement (#​3967)
Packaging
  • Change Dockerfile to hatch + compile black (#​3965)
Integrations
  • The summary output for GitHub workflows is now suppressible using the summary parameter. (#​3958)
  • Fix the action failing when Black check doesn't pass (#​3957)
Documentation

v23.10.0

Compare Source

Stable style
  • Fix comments getting removed from inside parenthesized strings (#​3909)
Preview style
  • Fix long lines with power operators getting split before the line length (#​3942)
  • Long type hints are now wrapped in parentheses and properly indented when split across multiple lines (#​3899)
  • Magic trailing commas are now respected in return types. (#​3916)
  • Require one empty line after module-level docstrings. (#​3932)
  • Treat raw triple-quoted strings as docstrings (#​3947)
Configuration
  • Fix cache versioning logic when BLACK_CACHE_DIR is set (#​3937)
Parser
  • Fix bug where attributes named type were not accepted inside match statements (#​3950)
  • Add support for PEP 695 type aliases containing lambdas and other unusual expressions (#​3949)
Output
  • Black no longer attempts to provide special errors for attempting to format Python 2 code (#​3933)
  • Black will more consistently print stacktraces on internal errors in verbose mode (#​3938)
Integrations
  • The action output displayed in the job summary is now wrapped in Markdown (#​3914)

v23.9.1

Compare Source

Due to various issues, the previous release (23.9.0) did not include compiled mypyc wheels, which make Black significantly faster. These issues have now been fixed, and this release should come with compiled wheels once again.

There will be no wheels for Python 3.12 due to a bug in mypyc. We will provide 3.12 wheels in a future release as soon as the mypyc bug is fixed.

Packaging
Performance
  • Store raw tuples instead of NamedTuples in Black's cache, improving performance and decreasing the size of the cache (#​3877)

v23.9.0

Compare Source

Preview style
  • More concise formatting for dummy implementations (#​3796)
  • In stub files, add a blank line between a statement with a body (e.g an if sys.version_info > (3, x):) and a function definition on the same level (#​3862)
  • Fix a bug whereby spaces were removed from walrus operators within subscript(#​3823)
Configuration
  • Black now applies exclusion and ignore logic before resolving symlinks (#​3846)
Performance
  • Avoid importing IPython if notebook cells do not contain magics (#​3782)
  • Improve caching by comparing file hashes as fallback for mtime and size (#​3821)
Blackd
  • Fix an issue in blackd with single character input (#​3558)
Integrations
  • Black now has an official pre-commit mirror. Swapping https://github.com/psf/black to https://github.com/psf/black-pre-commit-mirror in your .pre-commit-config.yaml will make Black about 2x faster (#​3828)
  • The .black.env folder specified by ENV_PATH will now be removed on the completion of the GitHub Action (#​3759)

v23.7.0

Compare Source

Highlights
  • Runtime support for Python 3.7 has been removed. Formatting 3.7 code will still be supported until further notice (#​3765)
Stable style
  • Fix a bug where an illegal trailing comma was added to return type annotations using PEP 604 unions (#​3735)
  • Fix several bugs and crashes where comments in stub files were removed or mishandled under some circumstances (#​3745)
  • Fix a crash with multi-line magic comments like type: ignore within parentheses (#​3740)
  • Fix error in AST validation when Black removes trailing whitespace in a type comment (#​3773)
Preview style
  • Implicitly concatenated strings used as function args are no longer wrapped inside parentheses (#​3640)
  • Remove blank lines between a class definition and its docstring (#​3692)
Configuration
  • The --workers argument to Black can now be specified via the BLACK_NUM_WORKERS environment variable (#​3743)
  • .pytest_cache, .ruff_cache and .vscode are now excluded by default (#​3691)
  • Fix Black not honouring pyproject.toml settings when running --stdin-filename and the pyproject.toml found isn't in the current working directory (#​3719)
  • Black will now error if exclude and extend-exclude have invalid data types in pyproject.toml, instead of silently doing the wrong thing (#​3764)
Packaging
  • Upgrade mypyc from 0.991 to 1.3 (#​3697)
  • Remove patching of Click that mitigated errors on Python 3.6 with LANG=C (#​3768)
Parser
  • Add support for the new PEP 695 syntax in Python 3.12 (#​3703)
Performance
  • Speed up Black significantly when the cache is full (#​3751)
  • Avoid importing IPython in a case where we wouldn't need it (#​3748)
Output
  • Use aware UTC datetimes internally, avoids deprecation warning on Python 3.12 (#​3728)
  • Change verbose logging to exactly mirror Black's logic for source discovery (#​3749)
Blackd
  • The blackd argument parser now shows the default values for options in their help text (#​3712)
Integrations
Documentation
  • Add a CITATION.cff file to the root of the repository, containing metadata on how to cite this software (#​3723)
  • Update the classes and exceptions documentation in Developer reference to match the latest code base (#​3755)
pylint-dev/pylint (pylint)

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 https://github.com/PyCQA/pylint/issues/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


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 is behind base branch, or you tick the rebase/retry checkbox.

👻 Immortal: This MR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this MR, check this box

This MR has been generated by Renovate Bot.

Edited by Vincent Meurisse

Merge request reports