summaryrefslogtreecommitdiff
path: root/pylint/checkers/classes.py
diff options
context:
space:
mode:
Diffstat (limited to 'pylint/checkers/classes.py')
-rw-r--r--pylint/checkers/classes.py33
1 files changed, 26 insertions, 7 deletions
diff --git a/pylint/checkers/classes.py b/pylint/checkers/classes.py
index 3d9144d..5e941c5 100644
--- a/pylint/checkers/classes.py
+++ b/pylint/checkers/classes.py
@@ -140,6 +140,28 @@ def _has_bare_super_call(fundef_node):
return True
return False
+def _safe_infer_call_result(node, caller, context=None):
+ """
+ Safely infer the return value of a function.
+
+ Returns None if inference failed or if there is some ambiguity (more than
+ one node has been inferred). Otherwise returns infered value.
+ """
+ try:
+ inferit = node.infer_call_result(caller, context=context)
+ value = next(inferit)
+ except astroid.InferenceError:
+ return # inference failed
+ except StopIteration:
+ return # no values infered
+ try:
+ next(inferit)
+ return # there is ambiguity on the inferred node
+ except astroid.InferenceError:
+ return # there is some kind of ambiguity
+ except StopIteration:
+ return value
+
MSGS = {
'F0202': ('Unable to check methods signature (%s / %s)',
'method-check-failed',
@@ -1066,13 +1088,10 @@ class SpecialMethodsChecker(BaseChecker):
return False
def _check_iter(self, node):
- try:
- infered = node.infer_call_result(node)
- except astroid.InferenceError:
- return
-
- if not all(map(self._is_iterator, infered)):
- self.add_message('non-iterator-returned', node=node)
+ infered = _safe_infer_call_result(node, node)
+ if infered is not None:
+ if not self._is_iterator(infered):
+ self.add_message('non-iterator-returned', node=node)
def _ancestors_to_call(klass_node, method='__init__'):