What's New in Pylint 2.4
************************

Release:
   2.4

Date:
   2019-09-24


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


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

* "import-outside-toplevel"

  This check warns when modules are imported from places other than a
  module toplevel, e.g. inside a function or a class.

* Added a new check, "consider-using-sys-exit"

  This check is emitted when we detect that a quit() or exit() is
  invoked instead of sys.exit(), which is the preferred way of exiting
  in program.

  Close #2925

* Added a new check, "arguments-out-of-order"

  This check warns if you have arguments with names that match those
  in a function's signature but you are passing them in to the
  function in a different order.

  Close #2975

* Added new checks, "no-else-break" and "no-else-continue"

  These checks highlight unnecessary "else" and "elif" blocks after
  "break" and "continue" statements.

  Close #2327

* Added "unnecessary-comprehension" that detects unnecessary
  comprehensions.

  This check is emitted when "pylint" finds list-, set- or dict-
  comprehensions, that are unnecessary and can be rewritten with the
  list-, set- or dict-constructors.

  Close #2905

* Added a new check, "invalid-overridden-method"

  This check is emitted when we detect that a method is overridden as
  a property or a property is overridden as a method. This can
  indicate a bug in the application code that will trigger a runtime
  error.

  Close #2670

* Added a new check, "redeclared-assigned-name"

  This check is emitted when "pylint" detects that a name was assigned
  one or multiple times in the same assignment, which indicate a
  potential bug.

  Close #2898

* Added a new check, "self-assigning-variable"

  This check is emitted when we detect that a variable is assigned to
  itself, which might indicate a potential bug in the code
  application.

  For example, the following would raise this warning:

     def new_a(attr, attr2):
       a_inst = Aclass()
       a_inst.attr2 = attr2
       # should be: a_inst.attr = attr, but have a typo
       attr = attr
       return a_inst

  Close #2930

* Added a new check "property-with-parameters" which detects when a
  property has more than a single argument.

  Close #3006

* Added "subprocess-run-check" to handle subprocess.run without
  explicitly set "check" keyword.

  Close #2848

* We added a new check message "dict-iter-missing-items". This is
  emitted when trying to iterate through a dict in a for loop without
  calling its .items() method.

  Closes #2761

* We added a new check message "missing-parentheses-for-call-in-test".
  This is emitted in case a call to a function is made inside a test
  but it misses parentheses.

* A new check "class-variable-slots-conflict" was added.

  This check is emitted when "pylint" finds a class variable that
  conflicts with a slot name, which would raise a "ValueError" at
  runtime.

  For example, the following would raise an error:

     class A:
         __slots__ = ('first', 'second')
         first = 1

* A new check "preferred-module" was added.

  This check is emitted when "pylint" finds an imported module that
  has a preferred replacement listed in "preferred-modules".

  For example, you can set the preferred modules as
  "xml:defusedxml,json:ujson" to make "pylint" suggest using
  "defusedxml" instead of "xml" and "ujson" rather than "json".

* A new extension "broad_try_clause" was added.

  This extension enforces a configurable maximum number of statements
  inside of a try clause. This facilitates enforcing PEP 8's
  guidelines about try / except statements and the amount of code in
  the try clause.

  You can enable this extension using "--load-
  plugins=pylint.extensions.broad_try_clause" and you can configure
  the amount of statements in a try statement using "--max-try-
  statements".


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

* Don't emit "protected-access" when a single underscore prefixed
  attribute is used inside a special method

  Close #1802

* "len-as-condition" now only fires when a "len(x)" call is made
  without an explicit comparison.

  The message and description accompanying this checker has been
  changed reflect this new behavior, by explicitly asking to either
  rely on the fact that empty sequence are false or to compare the
  length with a scalar.

  OK:

     if len(x) == 0:
       pass

     while not len(x) == 0:
       pass

     assert len(x) > 5, message

  KO:

     if not len(x):
       pass

     while len(x) and other_cond:
       pass

     assert len(x), message

* A file is now read from stdin if the "--from-stdin" flag is used on
  the command line. In addition to the "--from-stdin" flag a (single)
  file name needs to be specified on the command line, which is needed
  for the report.

* The checker for ungrouped imports is now more permissive.

The import can now be sorted alphabetically by import style. This
makes pylint compatible with isort.

The following imports do not trigger an "ungrouped-imports" anymore

   import unittest
   import zipfile
   from unittest import TestCase
   from unittest.mock import MagicMock

* The checker for missing return documentation is now more flexible.

The following does not trigger a "missing-return-doc" anymore

   def my_func(self):
       """This is a docstring.

       Returns
       -------
       :obj:`list` of :obj:`str`
           List of strings
       """
       return ["hi", "bye"] #@

* "signature-mutators" CLI and config option was added.

With this option, users can choose to ignore "too-many-function-args",
"unexpected-keyword-arg", and "no-value-for-parameter" for functions
decorated with decorators that change the signature of a decorated
function.

For example a test may want to make use of hypothesis. Adding
"hypothesis.extra.numpy.arrays" to "signature_mutators" would mean
that "no-value-for-parameter" would not be raised for:

   @given(img=arrays(dtype=np.float32, shape=(3, 3, 3, 3)))
   def test_image(img):
       ...

* Allow the option of f-strings as a valid logging string formatting
  method.

"logging-fstring--interpolation" has been merged into "logging-format-
interpolation" to allow the "logging-format-style" option to control
which logging string format style is valid. To allow this, a new
"fstr" value is valid for the "logging-format-style" option.

* "--list-msgs-enabled" command was added.

When enabling/disabling several messages and groups in a config file,
it can be unclear which messages are actually enabled and which are
disabled. This new command produces the final resolved lists of
enabled/disabled messages, sorted by symbol but with the ID provided
for use with "--help-msg".
