Skip to content

Commit 49c4bba

Browse files
committed
Fix crash for unused-private-member when there are nested attributes
1 parent 2ad8247 commit 49c4bba

File tree

4 files changed

+24
-2
lines changed

4 files changed

+24
-2
lines changed

ChangeLog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ Release date: TBA
6060

6161
Closes #4673
6262

63+
* Fix crash for ``unused-private-member`` that occurs when there is a presence of nested attributes
64+
65+
Closes #4755
66+
6367

6468
What's New in Pylint 2.9.6?
6569
===========================

pylint/checkers/classes.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -974,9 +974,10 @@ def _check_unused_private_variables(self, node: astroid.ClassDef) -> None:
974974

975975
def _check_unused_private_attributes(self, node: astroid.ClassDef) -> None:
976976
for assign_attr in node.nodes_of_class(astroid.AssignAttr):
977-
if not is_attr_private(assign_attr.attrname):
977+
if not is_attr_private(assign_attr.attrname) or not isinstance(
978+
assign_attr.expr, astroid.Name
979+
):
978980
continue
979-
980981
# Logic for checking false positive when using __new__,
981982
# Get the returned object names of the __new__ magic function
982983
# Then check if the attribute was consumed in other instance methods

tests/functional/u/unused/unused_private_member.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,3 +201,19 @@ def __inner_4(): # [unused-private-member]
201201

202202
fn_to_return = __inner_1 if flag else __inner_3(__inner_2)
203203
return fn_to_return
204+
205+
206+
# Test cases for crash reported in #4755
207+
# https://github.com/PyCQA/pylint/issues/4755
208+
class Crash4755Context:
209+
def __init__(self):
210+
self.__messages = None # [unused-private-member]
211+
212+
class Crash4755Command:
213+
def __init__(self):
214+
self.context = Crash4755Context()
215+
216+
def method(self):
217+
self.context.__messages = []
218+
for message in self.context.__messages:
219+
print(message)

tests/functional/u/unused/unused_private_member.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ unused-private-member:132:8:FalsePositive4657.__init__:Unused private member `Fa
99
undefined-variable:137:15:FalsePositive4657.attr_c:Undefined variable 'cls':HIGH
1010
unused-private-member:179:8:FalsePositive4673.do_thing.__true_positive:Unused private member `FalsePositive4673.do_thing.__true_positive(in_thing)`:HIGH
1111
unused-private-member:199:8:FalsePositive4673.complicated_example.__inner_4:Unused private member `FalsePositive4673.complicated_example.__inner_4()`:HIGH
12+
unused-private-member:210:8:Crash4755Context.__init__:Unused private member `Crash4755Context.__messages`:HIGH

0 commit comments

Comments
 (0)