diff options
-rw-r--r-- | astroid/bases.py | 2 | ||||
-rw-r--r-- | astroid/tests/unittest_inference.py | 16 |
2 files changed, 17 insertions, 1 deletions
diff --git a/astroid/bases.py b/astroid/bases.py index 72fd0d8..c2ea55e 100644 --- a/astroid/bases.py +++ b/astroid/bases.py @@ -215,7 +215,7 @@ class Instance(Proxy): """infer what a class instance is returning when called""" inferred = False for node in self._proxied.igetattr('__call__', context): - if node is util.YES: + if node is util.YES or not node.callable(): continue for res in node.infer_call_result(caller, context): inferred = True diff --git a/astroid/tests/unittest_inference.py b/astroid/tests/unittest_inference.py index 644e282..841d9ff 100644 --- a/astroid/tests/unittest_inference.py +++ b/astroid/tests/unittest_inference.py @@ -2995,6 +2995,22 @@ class InferenceTest(resources.SysPathSetup, unittest.TestCase): self.assertIsInstance(inferred, Instance) self.assertEqual(inferred.name, 'Sub') + def test_infer_call_result_invalid_dunder_call_on_instance(self): + ast_nodes = test_utils.extract_node(''' + class A: + __call__ = 42 + class B: + __call__ = A() + class C: + __call = None + A() #@ + B() #@ + C() #@ + ''') + for node in ast_nodes: + inferred = next(node.infer()) + self.assertRaises(InferenceError, next, inferred.infer_call_result(node)) + class GetattrTest(unittest.TestCase): |