Skip to content

Commit ca5b4af

Browse files
Fix unreleased false positives with used-before-assignment (#7921)
Cases with NamedExpr and Starred relating to definitions under "always false" conditions added in #6677
1 parent b94fdb2 commit ca5b4af

File tree

3 files changed

+20
-11
lines changed

3 files changed

+20
-11
lines changed

pylint/checkers/variables.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -900,21 +900,16 @@ def _defines_name_raises_or_returns(name: str, node: nodes.NodeNG) -> bool:
900900
if isinstance(node, nodes.Assign):
901901
for target in node.targets:
902902
for elt in utils.get_all_elements(target):
903+
if isinstance(elt, nodes.Starred):
904+
elt = elt.value
903905
if isinstance(elt, nodes.AssignName) and elt.name == name:
904906
return True
905907
if isinstance(node, nodes.If):
906-
# Check for assignments inside the test
907-
if isinstance(node.test, nodes.NamedExpr) and node.test.target.name == name:
908+
if any(
909+
child_named_expr.target.name == name
910+
for child_named_expr in node.nodes_of_class(nodes.NamedExpr)
911+
):
908912
return True
909-
if isinstance(node.test, nodes.Call):
910-
for arg_or_kwarg in node.test.args + [
911-
kw.value for kw in node.test.keywords
912-
]:
913-
if (
914-
isinstance(arg_or_kwarg, nodes.NamedExpr)
915-
and arg_or_kwarg.target.name == name
916-
):
917-
return True
918913
return False
919914

920915
@staticmethod

tests/functional/u/undefined/undefined_variable_py38.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,7 @@ def expression_in_ternary_operator_inside_container_wrong_position():
186186
NEVER_DEFINED = 1
187187
print(defined)
188188
print(NEVER_DEFINED) # [used-before-assignment]
189+
190+
if (still_defined := False) == 1:
191+
NEVER_DEFINED_EITHER = 1
192+
print(still_defined)

tests/functional/u/used/used_before_assignment.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,13 @@ def redefine_time_import_with_global():
106106
if VAR11:
107107
VAR12 = False
108108
print(VAR12)
109+
110+
def turn_on2(**kwargs):
111+
"""https://github.com/PyCQA/pylint/issues/7873"""
112+
if "brightness" in kwargs:
113+
brightness = kwargs["brightness"]
114+
var, *args = (1, "set_dimmer_state", brightness)
115+
else:
116+
var, *args = (1, "restore_dimmer_state")
117+
118+
print(var, *args)

0 commit comments

Comments
 (0)