aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryushao2 <36848472+yushao2@users.noreply.github.com>2021-09-15 01:26:44 +0800
committerGitHub <noreply@github.com>2021-09-14 19:26:44 +0200
commit272596b80c8f9cb6ddb6e3f893298f20242a9c32 (patch)
tree9455f789eda9e34611ece1455787e1e9cfff5433
parentaf407c73064c1a9cb3cce5f056fa1e26c9e7b540 (diff)
downloadpylint-272596b80c8f9cb6ddb6e3f893298f20242a9c32.tar.gz
Fix false positive ``unused-private-member`` for accessing attributes in a class using ``cls`` (#4965)
* Fix false positive ``unused-private-member`` for accessing attributes in a class using ``cls`` Co-authored-by: Pierre Sassoulas <pierre.sassoulas@gmail.com>
-rw-r--r--ChangeLog4
-rw-r--r--doc/whatsnew/2.11.rst4
-rw-r--r--pylint/checkers/classes.py14
-rw-r--r--tests/functional/u/unused/unused_private_member.py19
-rw-r--r--tests/functional/u/unused/unused_private_member.txt6
5 files changed, 39 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index d3f05dba1..9a46cdfc9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -63,6 +63,10 @@ Release date: TBA
Closes #4907
+* Fix false positive ``unused-private-member`` for accessing attributes in a class using ``cls``
+
+ Closes #4849
+
* Fix false positive ``unused-private-member`` for private staticmethods accessed in classmethods.
Closes #4849
diff --git a/doc/whatsnew/2.11.rst b/doc/whatsnew/2.11.rst
index 0a239025f..f04020796 100644
--- a/doc/whatsnew/2.11.rst
+++ b/doc/whatsnew/2.11.rst
@@ -70,6 +70,10 @@ Other Changes
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
diff --git a/pylint/checkers/classes.py b/pylint/checkers/classes.py
index 3ce95033e..4e208f064 100644
--- a/pylint/checkers/classes.py
+++ b/pylint/checkers/classes.py
@@ -1003,11 +1003,15 @@ a metaclass class method.",
if attribute.attrname != assign_attr.attrname:
continue
- if assign_attr.expr.name == "cls" and attribute.expr.name in [
- "cls",
- "self",
- ]:
- # If assigned to cls.attrib, can be accessed by cls/self
+ if (
+ assign_attr.expr.name
+ in [
+ "cls",
+ node.name,
+ ]
+ and attribute.expr.name in ["cls", "self", node.name]
+ ):
+ # If assigned to cls or class name, can be accessed by cls/self/class name
break
if (
diff --git a/tests/functional/u/unused/unused_private_member.py b/tests/functional/u/unused/unused_private_member.py
index 9c3d37303..319a06d88 100644
--- a/tests/functional/u/unused/unused_private_member.py
+++ b/tests/functional/u/unused/unused_private_member.py
@@ -242,6 +242,25 @@ class FalsePositive4681:
FalsePositive4681.__instance = False # This should be fine
FalsePositive4681.__should_cause_error = False # [unused-private-member]
+# Accessing attributes of the class using `cls` should not result in a false positive
+# as long as it is used within the class
+class FalsePositive4681b:
+ __instance = None
+
+ @classmethod # Use class method here
+ def instance(cls):
+ if cls.__instance is None:
+ cls()
+ return cls.__instance
+
+ def __init__(self):
+ try:
+ FalsePositive4681b.__instance = 42 # This should be fine
+ except Exception: # pylint: disable=broad-except
+ print("Error")
+ FalsePositive4681b.__instance = False # This should be fine
+
+
# https://github.com/PyCQA/pylint/issues/4849
# Accessing private static methods from classmethods via `cls` should not result in a
# false positive
diff --git a/tests/functional/u/unused/unused_private_member.txt b/tests/functional/u/unused/unused_private_member.txt
index 1d5baa9dc..08adc8c15 100644
--- a/tests/functional/u/unused/unused_private_member.txt
+++ b/tests/functional/u/unused/unused_private_member.txt
@@ -14,6 +14,6 @@ unused-private-member:212:8:Crash4755Context.__init__:Unused private member `Cra
unused-private-member:229:4:FalsePositive4681:Unused private member `FalsePositive4681.__should_cause_error`:HIGH
unused-private-member:239:12:FalsePositive4681.__init__:Unused private member `FalsePositive4681.__should_cause_error`:HIGH
unused-private-member:243:12:FalsePositive4681.__init__:Unused private member `FalsePositive4681.__should_cause_error`:HIGH
-unused-private-member:255:4:FalsePositive4849.__unused_private_method:Unused private member `FalsePositive4849.__unused_private_method()`:HIGH
-unused-private-member:272:4:Pony.__init_defaults:Unused private member `Pony.__init_defaults(self)`:HIGH
-unused-private-member:277:4:Pony.__get_fur_color:Unused private member `Pony.__get_fur_color(self)`:HIGH
+unused-private-member:274:4:FalsePositive4849.__unused_private_method:Unused private member `FalsePositive4849.__unused_private_method()`:HIGH
+unused-private-member:291:4:Pony.__init_defaults:Unused private member `Pony.__init_defaults(self)`:HIGH
+unused-private-member:296:4:Pony.__get_fur_color:Unused private member `Pony.__get_fur_color(self)`:HIGH