Pylint

Latest version: v3.1.0

Safety actively analyzes 613631 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 1 of 19

3.1.0

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

3.0.4

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

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

3.0.2

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

3.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

3.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](https://pylint.readthedocs.io/projects/astroid/en/latest/changelog.html#what-s-new-in-astroid-3-0-0) 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.

json
{
"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:

bash
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/astroid529

- - Optimize ``is_trailing_comma()``.
- Cache ``class_is_abstract()``.

Refs 1954

- Exit immediately if all messages are disabled.

Closes 8715

Page 1 of 19

© 2024 Safety CLI Cybersecurity Inc. All Rights Reserved.