diff options
author | Marc Mueller <30130371+cdce8p@users.noreply.github.com> | 2021-03-06 03:31:34 +0100 |
---|---|---|
committer | Pierre Sassoulas <pierre.sassoulas@gmail.com> | 2021-03-28 20:30:23 +0200 |
commit | 7905ec1f35d35aedb0a299598eebc9c98fe73f8a (patch) | |
tree | 64d9c49d306a2449a73cd31057da6131238a2a7e | |
parent | 12acc439bdbece347334b9e1efbdc7245da5001d (diff) | |
download | pylint-git-7905ec1f35d35aedb0a299598eebc9c98fe73f8a.tar.gz |
Fix false-positive for unused-import on class keyword arguments
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | pylint/checkers/variables.py | 8 | ||||
-rw-r--r-- | tests/functional/u/unused/unused_import_class_def_keyword.py | 38 |
3 files changed, 50 insertions, 0 deletions
@@ -77,6 +77,10 @@ Release date: TBA * Improve check if class is subscriptable PEP585 +* Fix false-positive for ``unused-import`` on class keyword arguments + + Closes #3202 + What's New in Pylint 2.7.2? =========================== diff --git a/pylint/checkers/variables.py b/pylint/checkers/variables.py index 875257155..9fc523576 100644 --- a/pylint/checkers/variables.py +++ b/pylint/checkers/variables.py @@ -976,6 +976,14 @@ class VariablesChecker(BaseChecker): ): continue + # Ignore inner class scope for keywords in class definition + if ( + current_consumer.scope_type == "class" + and isinstance(node.parent, astroid.Keyword) + and isinstance(node.parent.parent, astroid.ClassDef) + ): + continue + # if the name node is used as a function default argument's value or as # a decorator, then start from the parent frame of the function instead # of the function frame - and thus open an inner class scope diff --git a/tests/functional/u/unused/unused_import_class_def_keyword.py b/tests/functional/u/unused/unused_import_class_def_keyword.py new file mode 100644 index 000000000..0d6b59987 --- /dev/null +++ b/tests/functional/u/unused/unused_import_class_def_keyword.py @@ -0,0 +1,38 @@ +""" +Test false-positive for unused-import on class keyword arguments + + https://github.com/PyCQA/pylint/issues/3202 +""" +# pylint: disable=missing-docstring,too-few-public-methods,invalid-name,import-error + +# Imports don't exist! Only check `unused-import` +from const import DOMAIN +from const import DOMAIN_2 +from const import DOMAIN_3 + + +class Child: + def __init_subclass__(cls, **kwargs): + pass + +class Parent(Child, domain=DOMAIN): + pass + + +# Alternative 1 +class Parent_2(Child, domain=DOMAIN_2): + DOMAIN_2 = DOMAIN_2 + + +# Alternative 2 +class A: + def __init__(self, arg): + pass + +class B: + CONF = "Hello World" + SCHEMA = A(arg=CONF) + + +# Test normal instantiation +A(arg=DOMAIN_3) |