summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKayran Schmidt <59456929+yumasheta@users.noreply.github.com>2021-09-07 14:35:00 +0200
committerGitHub <noreply@github.com>2021-09-07 14:35:00 +0200
commit9683362fa51e51c5b58fb4f66db8b422055adc27 (patch)
treed8e7fa22c7e829213a547066ab99648e915237f0
parentcf33d82635569da924d82538f806a5242481f06f (diff)
downloadpylint-git-9683362fa51e51c5b58fb4f66db8b422055adc27.tar.gz
fix false positive W0238 with private staticmethod used from classmethod (#4949)
Co-authored-by: Pierre Sassoulas <pierre.sassoulas@gmail.com>
-rw-r--r--ChangeLog4
-rw-r--r--pylint/checkers/classes.py5
-rw-r--r--tests/functional/u/unused/unused_private_member.py18
-rw-r--r--tests/functional/u/unused/unused_private_member.txt5
4 files changed, 29 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 224728f39..c16702cee 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -63,6 +63,10 @@ Release date: TBA
Closes #4907
+* Fix false positive ``unused-private-member`` for private staticmethods accessed in classmethods.
+
+ 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 59e474220..f92490594 100644
--- a/pylint/checkers/classes.py
+++ b/pylint/checkers/classes.py
@@ -926,9 +926,12 @@ a metaclass class method.",
continue
if isinstance(attribute.expr, nodes.Name) and attribute.expr.name in (
"self",
+ "cls",
node.name,
):
- # self.__attrname / node_name.__attrname
+ # self.__attrname
+ # cls.__attrname
+ # node_name.__attrname
break
if isinstance(attribute.expr, nodes.Call):
# type(self).__attrname
diff --git a/tests/functional/u/unused/unused_private_member.py b/tests/functional/u/unused/unused_private_member.py
index 1acdd9124..9c3d37303 100644
--- a/tests/functional/u/unused/unused_private_member.py
+++ b/tests/functional/u/unused/unused_private_member.py
@@ -242,6 +242,24 @@ class FalsePositive4681:
FalsePositive4681.__instance = False # This should be fine
FalsePositive4681.__should_cause_error = False # [unused-private-member]
+# https://github.com/PyCQA/pylint/issues/4849
+# Accessing private static methods from classmethods via `cls` should not result in a
+# false positive
+class FalsePositive4849:
+ @staticmethod
+ def __private_method():
+ """Is private and does nothing."""
+
+ # This should already be covered by `HasUnusedInClass`
+ @staticmethod
+ def __unused_private_method(): # [unused-private-member]
+ """Is not used."""
+
+ @classmethod
+ def use_private_method(cls):
+ """Calls private method."""
+ cls.__private_method() # This should pass
+
class Pony:
"""https://github.com/PyCQA/pylint/issues/4837"""
diff --git a/tests/functional/u/unused/unused_private_member.txt b/tests/functional/u/unused/unused_private_member.txt
index 391316d35..1d5baa9dc 100644
--- a/tests/functional/u/unused/unused_private_member.txt
+++ b/tests/functional/u/unused/unused_private_member.txt
@@ -14,5 +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:254:4:Pony.__init_defaults:Unused private member `Pony.__init_defaults(self)`:HIGH
-unused-private-member:259:4:Pony.__get_fur_color:Unused private member `Pony.__get_fur_color(self)`: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