@@ -171,6 +171,15 @@ def function_to_method(n, klass):
171
171
return n
172
172
173
173
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
+
174
183
class Module (LocalsDictNodeNG ):
175
184
"""Class representing an :class:`ast.Module` node.
176
185
@@ -1540,10 +1549,7 @@ def infer_yield_result(self, context: InferenceContext | None = None):
1540
1549
"""
1541
1550
for yield_ in self .nodes_of_class (node_classes .Yield ):
1542
1551
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 )
1547
1553
elif yield_ .scope () == self :
1548
1554
yield from yield_ .value .infer (context = context )
1549
1555
@@ -1553,6 +1559,8 @@ def infer_call_result(
1553
1559
context : InferenceContext | None = None ,
1554
1560
) -> Iterator [InferenceResult ]:
1555
1561
"""Infer what the function returns when called."""
1562
+ if context is None :
1563
+ context = InferenceContext ()
1556
1564
if self .is_generator ():
1557
1565
if isinstance (self , AsyncFunctionDef ):
1558
1566
generator_cls : type [bases .Generator ] = bases .AsyncGenerator
@@ -1584,16 +1592,7 @@ def infer_call_result(
1584
1592
f"caller.args was neither Arguments nor list; got { type (caller .args )} "
1585
1593
)
1586
1594
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 :]]
1597
1596
new_class = ClassDef (
1598
1597
name = "temporary_class" ,
1599
1598
lineno = 0 ,
@@ -2825,13 +2824,8 @@ def _inferred_bases(self, context: InferenceContext | None = None):
2825
2824
2826
2825
for stmt in self .bases :
2827
2826
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 :
2835
2829
continue
2836
2830
if isinstance (baseobj , bases .Instance ):
2837
2831
baseobj = baseobj ._proxied
0 commit comments