summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Mueller <30130371+cdce8p@users.noreply.github.com>2021-03-06 03:31:34 +0100
committerPierre Sassoulas <pierre.sassoulas@gmail.com>2021-03-28 20:30:23 +0200
commit7905ec1f35d35aedb0a299598eebc9c98fe73f8a (patch)
tree64d9c49d306a2449a73cd31057da6131238a2a7e
parent12acc439bdbece347334b9e1efbdc7245da5001d (diff)
downloadpylint-git-7905ec1f35d35aedb0a299598eebc9c98fe73f8a.tar.gz
Fix false-positive for unused-import on class keyword arguments
-rw-r--r--ChangeLog4
-rw-r--r--pylint/checkers/variables.py8
-rw-r--r--tests/functional/u/unused/unused_import_class_def_keyword.py38
3 files changed, 50 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index bc0060406..56262f3be 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)