Skip to content

Commit 3f3f65f

Browse files
committed
Add tuple unpacking detection and update tests
1 parent 2dbae85 commit 3f3f65f

2 files changed

Lines changed: 14 additions & 2 deletions

File tree

src/community_of_python_flake8_plugin/checks/temp_var.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,25 @@ def extract_names(expression: ast.expr) -> typing.Iterable[str]:
1818
for elt in expression.elts:
1919
yield from extract_names(elt)
2020

21+
def is_tuple_unpacking(assign_node: ast.Assign) -> bool:
22+
"""Check if this is a tuple unpacking assignment."""
23+
if not assign_node.targets:
24+
return False
25+
26+
target = assign_node.targets[0]
27+
return isinstance(target, ast.Tuple)
28+
2129
@typing.final
2230
class UsageCollector(ast.NodeVisitor):
2331
def visit_Name(self, name_node: ast.Name) -> None:
2432
variable_usage[name_node.id].append(name_node)
2533
self.generic_visit(name_node)
2634

2735
def visit_Assign(self, assign_node: ast.Assign) -> None:
28-
for target in assign_node.targets:
29-
assigned_variable_names.update(extract_names(target))
36+
# Skip collecting variables from tuple unpacking assignments
37+
if not is_tuple_unpacking(assign_node):
38+
for target in assign_node.targets:
39+
assigned_variable_names.update(extract_names(target))
3040
self.generic_visit(assign_node)
3141

3242
def visit_AugAssign(self, aug_assign_node: ast.AugAssign) -> None:

tests/test_plugin.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,8 @@ def test_naming_validations(input_source: str, expected_output: list[str]) -> No
282282
),
283283
# No violation: Variable used in loop
284284
("def fetch_item():\n for _, one_value in values: print(f'{one_value}')", []),
285+
# No violation: Tuple unpacking with underscore variables
286+
("def parse_module():\n parent, _, _child = module_name.rpartition('.')\n return parent", []),
285287
],
286288
)
287289
def test_variable_usage_validations(input_source: str, expected_output: list[str]) -> None:

0 commit comments

Comments
 (0)