diff options
author | Kayran Schmidt <59456929+yumasheta@users.noreply.github.com> | 2021-09-07 14:35:00 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-07 14:35:00 +0200 |
commit | 9683362fa51e51c5b58fb4f66db8b422055adc27 (patch) | |
tree | d8e7fa22c7e829213a547066ab99648e915237f0 | |
parent | cf33d82635569da924d82538f806a5242481f06f (diff) | |
download | pylint-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-- | ChangeLog | 4 | ||||
-rw-r--r-- | pylint/checkers/classes.py | 5 | ||||
-rw-r--r-- | tests/functional/u/unused/unused_private_member.py | 18 | ||||
-rw-r--r-- | tests/functional/u/unused/unused_private_member.txt | 5 |
4 files changed, 29 insertions, 3 deletions
@@ -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 |