@@ -650,29 +650,30 @@ def get_next_to_consume(self, node: nodes.Name) -> list[nodes.NodeNG] | None:
650650 def _inferred_to_define_name_raise_or_return (
651651 self ,
652652 name : str ,
653- node : nodes .NodeNG ,
653+ node : nodes .Try | nodes . With | nodes . For | nodes . While | nodes . Match | nodes . If ,
654654 ) -> bool :
655655 """Return True if there is a path under this `if_node`
656656 that is inferred to define `name`, raise, or return.
657657 """
658- # Handle try and with
659- if isinstance (node , nodes .Try ):
660- # Allow either a path through try/else/finally OR a path through ALL except handlers
661- try_except_node = node
662- if node .finalbody :
663- try_except_node = next (
664- (child for child in node .nodes_of_class (nodes .Try )),
665- None ,
658+ match node :
659+ case nodes .Try ():
660+ # Allow either a path through try/else/finally OR a path through ALL except handlers
661+ try_except_node = node
662+ if node .finalbody :
663+ try_except_node = next (
664+ (child for child in node .nodes_of_class (nodes .Try )),
665+ None ,
666+ )
667+ handlers = try_except_node .handlers if try_except_node else []
668+ return NamesConsumer ._defines_name_raises_or_returns_recursive (
669+ name , node
670+ ) or all (
671+ NamesConsumer ._defines_name_raises_or_returns_recursive (
672+ name , handler
673+ )
674+ for handler in handlers
666675 )
667- handlers = try_except_node .handlers if try_except_node else []
668- return NamesConsumer ._defines_name_raises_or_returns_recursive (
669- name , node
670- ) or all (
671- NamesConsumer ._defines_name_raises_or_returns_recursive (name , handler )
672- for handler in handlers
673- )
674676
675- match node :
676677 case nodes .With () | nodes .For () | nodes .While ():
677678 return NamesConsumer ._defines_name_raises_or_returns_recursive (
678679 name , node
@@ -684,12 +685,17 @@ def _inferred_to_define_name_raise_or_return(
684685 for case in node .cases
685686 )
686687 case nodes .If ():
687- pass
688+ return self ._inferred_to_define_name_raise_or_return_for_if_node (
689+ name , node
690+ )
688691 case _: # pragma: no cover
689692 # The function is only called for Try, With, For, While, Match and
690693 # If nodes. All of which are being handled above.
691694 raise AssertionError
692695
696+ def _inferred_to_define_name_raise_or_return_for_if_node (
697+ self , name : str , node : nodes .If
698+ ) -> bool :
693699 # Be permissive if there is a break or a continue
694700 if any (node .nodes_of_class (nodes .Break , nodes .Continue )):
695701 return True
0 commit comments