Skip to content

Commit d1c37a9

Browse files
Fix RecursionError in infer_call_result() (#2432)
1 parent 414a45b commit d1c37a9

File tree

3 files changed

+20
-0
lines changed

3 files changed

+20
-0
lines changed

ChangeLog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ What's New in astroid 3.2.1?
1313
============================
1414
Release date: TBA
1515

16+
* Fix ``RecursionError`` in ``infer_call_result()`` for certain ``__call__`` methods.
17+
18+
Closes pylint-dev/pylint#9139
1619

1720

1821
What's New in astroid 3.2.0?

astroid/bases.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,11 @@ def infer_call_result(
326326
for node in self._proxied.igetattr("__call__", context):
327327
if isinstance(node, UninferableBase) or not node.callable():
328328
continue
329+
if isinstance(node, BaseInstance) and node._proxied is self._proxied:
330+
inferred = True
331+
yield node
332+
# Prevent recursion.
333+
continue
329334
for res in node.infer_call_result(caller, context):
330335
inferred = True
331336
yield res

tests/test_inference.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4090,6 +4090,18 @@ class C:
40904090
inferred = next(node.infer())
40914091
self.assertRaises(InferenceError, next, inferred.infer_call_result(node))
40924092

4093+
def test_infer_call_result_same_proxied_class(self) -> None:
4094+
node = extract_node(
4095+
"""
4096+
class A:
4097+
__call__ = A()
4098+
A() #@
4099+
"""
4100+
)
4101+
inferred = next(node.infer())
4102+
fully_evaluated_inference_results = list(inferred.infer_call_result(node))
4103+
assert fully_evaluated_inference_results[0].name == "A"
4104+
40934105
def test_infer_call_result_with_metaclass(self) -> None:
40944106
node = extract_node("def with_metaclass(meta, *bases): return 42")
40954107
inferred = next(node.infer_call_result(caller=node))

0 commit comments

Comments
 (0)