diff options
author | Claudiu Popa <pcmanticore@gmail.com> | 2015-10-03 13:54:08 +0300 |
---|---|---|
committer | Claudiu Popa <pcmanticore@gmail.com> | 2015-10-03 13:54:08 +0300 |
commit | 211f96f28c1300de1a89b67b527b1a7b499dcc0f (patch) | |
tree | 420cb387bce892b0260ff7bcf7600826703e7b24 | |
parent | ecaf8734210c7a2a5e8d089af10ab37dfc8158f4 (diff) | |
download | astroid-211f96f28c1300de1a89b67b527b1a7b499dcc0f.tar.gz |
Skip objects which aren't callable when inferring an instance's call result.
-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): |