@@ -329,7 +329,7 @@ def is_iterable(n):
329329
330330 try :
331331 inferred = next (arg .infer (context ))
332- except (InferenceError , NameInferenceError ) as exc :
332+ except (InferenceError , NameInferenceError , StopIteration ) as exc :
333333 raise UseInferenceDefault from exc
334334 if isinstance (inferred , nodes .Dict ):
335335 items = inferred .items
@@ -432,11 +432,11 @@ def infer_super(node, context=None):
432432 else :
433433 try :
434434 mro_pointer = next (node .args [0 ].infer (context = context ))
435- except InferenceError as exc :
435+ except ( InferenceError , StopIteration ) as exc :
436436 raise UseInferenceDefault from exc
437437 try :
438438 mro_type = next (node .args [1 ].infer (context = context ))
439- except InferenceError as exc :
439+ except ( InferenceError , StopIteration ) as exc :
440440 raise UseInferenceDefault from exc
441441
442442 if mro_pointer is util .Uninferable or mro_type is util .Uninferable :
@@ -458,7 +458,7 @@ def _infer_getattr_args(node, context):
458458 try :
459459 obj = next (node .args [0 ].infer (context = context ))
460460 attr = next (node .args [1 ].infer (context = context ))
461- except InferenceError as exc :
461+ except ( InferenceError , StopIteration ) as exc :
462462 raise UseInferenceDefault from exc
463463
464464 if obj is util .Uninferable or attr is util .Uninferable :
@@ -496,7 +496,7 @@ def infer_getattr(node, context=None):
496496 # Try to infer the default and return it instead.
497497 try :
498498 return next (node .args [2 ].infer (context = context ))
499- except InferenceError as exc :
499+ except ( StopIteration , InferenceError ) as exc :
500500 raise UseInferenceDefault from exc
501501
502502 raise UseInferenceDefault
@@ -544,7 +544,7 @@ def infer_callable(node, context=None):
544544 argument = node .args [0 ]
545545 try :
546546 inferred = next (argument .infer (context = context ))
547- except InferenceError :
547+ except ( InferenceError , StopIteration ) :
548548 return util .Uninferable
549549 if inferred is util .Uninferable :
550550 return util .Uninferable
@@ -564,7 +564,7 @@ def infer_property(node, context=None):
564564 getter = node .args [0 ]
565565 try :
566566 inferred = next (getter .infer (context = context ))
567- except InferenceError as exc :
567+ except ( InferenceError , StopIteration ) as exc :
568568 raise UseInferenceDefault from exc
569569
570570 if not isinstance (inferred , (nodes .FunctionDef , nodes .Lambda )):
@@ -592,7 +592,7 @@ def infer_bool(node, context=None):
592592 argument = node .args [0 ]
593593 try :
594594 inferred = next (argument .infer (context = context ))
595- except InferenceError :
595+ except ( InferenceError , StopIteration ) :
596596 return util .Uninferable
597597 if inferred is util .Uninferable :
598598 return util .Uninferable
@@ -682,7 +682,7 @@ def infer_issubclass(callnode, context=None):
682682
683683 try :
684684 obj_type = next (obj_node .infer (context = context ))
685- except InferenceError as exc :
685+ except ( InferenceError , StopIteration ) as exc :
686686 raise UseInferenceDefault from exc
687687 if not isinstance (obj_type , nodes .ClassDef ):
688688 raise UseInferenceDefault ("TypeError: arg 1 must be class" )
@@ -749,13 +749,19 @@ def _class_or_tuple_to_container(node, context=None):
749749 # Move inferences results into container
750750 # to simplify later logic
751751 # raises InferenceError if any of the inferences fall through
752- node_infer = next (node .infer (context = context ))
752+ try :
753+ node_infer = next (node .infer (context = context ))
754+ except StopIteration as e :
755+ raise InferenceError (node = node , context = context ) from e
753756 # arg2 MUST be a type or a TUPLE of types
754757 # for isinstance
755758 if isinstance (node_infer , nodes .Tuple ):
756- class_container = [
757- next (node .infer (context = context )) for node in node_infer .elts
758- ]
759+ try :
760+ class_container = [
761+ next (node .infer (context = context )) for node in node_infer .elts
762+ ]
763+ except StopIteration as e :
764+ raise InferenceError (node = node , context = context ) from e
759765 class_container = [
760766 klass_node for klass_node in class_container if klass_node is not None
761767 ]
@@ -865,7 +871,7 @@ def _build_dict_with_elements(elements):
865871 values = call .positional_arguments [0 ]
866872 try :
867873 inferred_values = next (values .infer (context = context ))
868- except InferenceError :
874+ except ( InferenceError , StopIteration ) :
869875 return _build_dict_with_elements ([])
870876 if inferred_values is util .Uninferable :
871877 return _build_dict_with_elements ([])
0 commit comments