What's New in Pylint 2.11
*************************

Release:
   2.11

Date:
   2021-09-16


Summary -- Release highlights
=============================

In 2.11, we added a new default checker to advise using f-string as
it's the most efficient way of formatting strings right now. You can
use pyupgrade or flynt to migrate your old "%" and "format()"
automatically.

We added a new extension "SetMembershipChecker" that will advise the
use of set for membership test, as it's more performant than lists or
tuples. The "CodeStyleChecker" also got some love, check it out if
you're not already using it.

We fixed some long standing bugs, false positives, or false negatives
and we added small quality of life options like "min-similarity-lines"
that disable the duplication check when set to 0.

Under the hood the code for both pylint and astroid is progressively
more typed, which could be helpful to you if you're using them as
libraries. In order for this new typing to make more sense and stay
simple, we deprecated some functions or type that will be removed in
the next major version. This is an ongoing effort.

The future "possible-forgotten-f-prefix" check still had too much
false positives, and is delayed again. Check the possible-
forgotten-f-prefix issue if you want to provide knowledge or use case
:)


New checkers
============

* Added "consider-using-f-string": Emitted when .format() or '%' is
  being used to format a string.

  Closes #3592


Removed checkers
================

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


Extensions
==========

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

  Closes #4776

* "CodeStyleChecker"

  * Added "consider-using-assignment-expr": Emitted when an assignment
    is directly followed by an if statement and both can be combined
    by using an assignment expression ":=". Requires Python 3.8

    Closes #4862


Other Changes
=============

* Added "py-version" config key (if "[MASTER]" section). Used for
  version dependant checks. Will default to whatever Python version
  pylint is executed with.

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

* Fix false positive for "consider-using-with" if a context manager is
  assigned to a variable in different paths of control flow (e. g. if-
  else clause).

  Closes #4751

* Fix false positive for "function-redefined" for simple type
  annotations

  Closes #4936

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

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

  Closes #3282

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

  Closes #4945

* Fix false positive "superfluous-parens" for tuples created with
  inner tuples

  Closes #4907

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

  Closes #4849

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

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

  Closes #4901

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

  Closes #4900

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

  Closes #1375 Closes #330

* The "consider-iterating-dictionary" checker now also considers
  membership checks

  Closes #4069
