@@ -206,11 +206,13 @@ def __init__(self) -> None:
206206 # disable_branch_skip is used to disable skipping a branch due to a return/raise/etc. This is useful
207207 # in things like try/except/finally statements.
208208 self .disable_branch_skip = False
209+ self .in_finally = False
209210
210211 def copy (self ) -> DefinedVariableTracker :
211212 result = DefinedVariableTracker ()
212213 result .scopes = [s .copy () for s in self .scopes ]
213214 result .disable_branch_skip = self .disable_branch_skip
215+ result .in_finally = self .in_finally
214216 return result
215217
216218 def _scope (self ) -> Scope :
@@ -579,7 +581,9 @@ def process_try_stmt(self, o: TryStmt) -> None:
579581 self .tracker .end_branch_statement ()
580582
581583 if o .finally_body is not None :
584+ self .tracker .in_finally = True
582585 o .finally_body .accept (self )
586+ self .tracker .in_finally = False
583587
584588 def visit_while_stmt (self , o : WhileStmt ) -> None :
585589 o .expr .accept (self )
@@ -620,7 +624,10 @@ def visit_starred_pattern(self, o: StarredPattern) -> None:
620624 def visit_name_expr (self , o : NameExpr ) -> None :
621625 if o .name in self .builtins and self .tracker .in_scope (ScopeType .Global ):
622626 return
623- if self .tracker .is_possibly_undefined (o .name ):
627+ if (
628+ self .tracker .is_possibly_undefined (o .name )
629+ and self .tracker .in_finally == self .tracker .disable_branch_skip
630+ ):
624631 # A variable is only defined in some branches.
625632 self .variable_may_be_undefined (o .name , o )
626633 # We don't want to report the error on the same variable multiple times.
0 commit comments