diff options
author | yushao2 <36848472+yushao2@users.noreply.github.com> | 2021-09-15 01:26:44 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-14 19:26:44 +0200 |
commit | 272596b80c8f9cb6ddb6e3f893298f20242a9c32 (patch) | |
tree | 9455f789eda9e34611ece1455787e1e9cfff5433 | |
parent | af407c73064c1a9cb3cce5f056fa1e26c9e7b540 (diff) | |
download | pylint-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-- | ChangeLog | 4 | ||||
-rw-r--r-- | doc/whatsnew/2.11.rst | 4 | ||||
-rw-r--r-- | pylint/checkers/classes.py | 14 | ||||
-rw-r--r-- | tests/functional/u/unused/unused_private_member.py | 19 | ||||
-rw-r--r-- | tests/functional/u/unused/unused_private_member.txt | 6 |
5 files changed, 39 insertions, 8 deletions
@@ -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 |