**************************
 What's New in Pylint 2.2
**************************

:Release: 2.2
:Date: 2018-11-25

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


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

* String checker now reports format string type mismatches.

* ``duplicate-string-formatting-argument`` was added for detecting duplicate string
  formatting arguments that should be passed instead as named arguments.

* ``logging-format-style`` is a new option for the logging checker for usage of
  str.format() style format strings in calls to loggers.

  It accepts two options: ``--logging-format-style=old`` for using `%` style formatting,
  which is the assumed default, and ``--logging-format-style=new`` for using `{}` style formatting.

* ``implicit-str-concat-in-sequence`` detects string concatenation inside lists, sets & tuples.

  Example of code that would generate such warning:

  .. code-block:: python

    woops = ('a', 'b' 'c')


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

* `try-except-raise` checker now handles multilevel inheritance hirerachy for exceptions correctly.

  Close #2484

* Ignore import x.y.z as z cases for checker `useless-import-alias`.

* `unnecessary-pass` is now also emitted when a function or class contains only docstring and pass statement,
  in which case, docstring is enough for empty definition.

* Fix false positive ``undefined-variable`` and ``used-before-assignment`` with nonlocal keyword usage.

* Fix exceptions being raised when one of the params is not a ClassDef for :func:`checkers.utils.is_subclass_of`.

* ``pylint`` now picks the latest value from the inferred values of the exception that gets
  raised, when looking for ``raising-non-exception``. This helps when reusing a variable name
  for multiple types, since ``pylint`` was picking just the first inferred value, leading
  to spurious false positives.

  Close #2431

* ``pylint`` used to emit a ``not-an-iterable`` error when looking at coroutines built
  with ``asyncio.coroutine``. This is no longer the case as we handle coroutines explicitly.

  Close #996

* ``pylint`` used to emit a ``unused-variable`` error if unused import was found in the function. Now instead of
  ``unused-variable``, ``unused-import`` is emitted.

  Close #2421
