@@ -482,9 +482,10 @@ def _has_locals_call_after_node(stmt, scope):
482
482
"`'from X import *'` style import." ,
483
483
),
484
484
"W0621" : (
485
- "Redefining name %r from outer scope (line %s)" ,
485
+ "Redefining name %r from outer scope or loop (line %s)" ,
486
486
"redefined-outer-name" ,
487
- "Used when a variable's name hides a name defined in the outer scope." ,
487
+ "Used when a variable's name hides a name defined in an outer scope, "
488
+ "for loop, or except handler." ,
488
489
),
489
490
"W0622" : (
490
491
"Redefining built-in %r" ,
@@ -740,7 +741,7 @@ class VariablesChecker(BaseChecker):
740
741
"""checks for
741
742
* unused variables / imports
742
743
* undefined variables
743
- * redefinition of variable from builtins or from an outer scope
744
+ * redefinition of variable from builtins or from an outer scope, for loop, or except handler
744
745
* use of variable before assignment
745
746
* __all__ consistency
746
747
* self/cls assignment
@@ -1112,6 +1113,19 @@ def visit_global(self, node: nodes.Global) -> None:
1112
1113
self .add_message ("global-statement" , node = node )
1113
1114
1114
1115
def visit_assignname (self , node : nodes .AssignName ) -> None :
1116
+ if self .linter .is_message_enabled ("redefined-outer-name" ) and isinstance (
1117
+ node .parent , nodes .Assign
1118
+ ):
1119
+ for outer_for , outer_variables in self ._loop_variables :
1120
+ if node .name in outer_variables and not in_for_else_branch (
1121
+ outer_for , node
1122
+ ):
1123
+ self .add_message (
1124
+ "redefined-outer-name" ,
1125
+ args = (node .name , outer_for .fromlineno ),
1126
+ node = node ,
1127
+ )
1128
+ break
1115
1129
if isinstance (node .assign_type (), nodes .AugAssign ):
1116
1130
self .visit_name (node )
1117
1131
0 commit comments