@@ -171,6 +171,15 @@ def function_to_method(n, klass):
171171 return n
172172
173173
174+ def _infer_last (
175+ arg : SuccessfulInferenceResult , context : InferenceContext
176+ ) -> InferenceResult :
177+ res = util .Uninferable
178+ for b in arg .infer (context = context .clone ()):
179+ res = b
180+ return res
181+
182+
174183class Module (LocalsDictNodeNG ):
175184 """Class representing an :class:`ast.Module` node.
176185
@@ -1540,10 +1549,7 @@ def infer_yield_result(self, context: InferenceContext | None = None):
15401549 """
15411550 for yield_ in self .nodes_of_class (node_classes .Yield ):
15421551 if yield_ .value is None :
1543- const = node_classes .Const (None )
1544- const .parent = yield_
1545- const .lineno = yield_ .lineno
1546- yield const
1552+ yield node_classes .Const (None , parent = yield_ , lineno = yield_ .lineno )
15471553 elif yield_ .scope () == self :
15481554 yield from yield_ .value .infer (context = context )
15491555
@@ -1553,6 +1559,8 @@ def infer_call_result(
15531559 context : InferenceContext | None = None ,
15541560 ) -> Iterator [InferenceResult ]:
15551561 """Infer what the function returns when called."""
1562+ if context is None :
1563+ context = InferenceContext ()
15561564 if self .is_generator ():
15571565 if isinstance (self , AsyncFunctionDef ):
15581566 generator_cls : type [bases .Generator ] = bases .AsyncGenerator
@@ -1584,16 +1592,7 @@ def infer_call_result(
15841592 f"caller.args was neither Arguments nor list; got { type (caller .args )} "
15851593 )
15861594 if isinstance (metaclass , ClassDef ):
1587- try :
1588- # Find the first non-None inferred base value
1589- get_base = lambda arg : next (
1590- b
1591- for b in arg .infer (context = context .clone () if context else None )
1592- if not (isinstance (b , node_classes .Const ) and b .value is None )
1593- )
1594- class_bases = [get_base (arg ) for arg in caller .args [1 :]]
1595- except StopIteration as e :
1596- raise InferenceError (node = caller .args [1 :], context = context ) from e
1595+ class_bases = [_infer_last (x , context ) for x in caller .args [1 :]]
15971596 new_class = ClassDef (
15981597 name = "temporary_class" ,
15991598 lineno = 0 ,
@@ -2825,13 +2824,8 @@ def _inferred_bases(self, context: InferenceContext | None = None):
28252824
28262825 for stmt in self .bases :
28272826 try :
2828- # Find the first non-None inferred base value
2829- baseobj = next (
2830- b
2831- for b in stmt .infer (context = context .clone ())
2832- if not (isinstance (b , node_classes .Const ) and b .value is None )
2833- )
2834- except (InferenceError , StopIteration ):
2827+ baseobj = _infer_last (stmt , context )
2828+ except InferenceError :
28352829 continue
28362830 if isinstance (baseobj , bases .Instance ):
28372831 baseobj = baseobj ._proxied
0 commit comments