diff options
Diffstat (limited to 'pylint/checkers/classes.py')
-rw-r--r-- | pylint/checkers/classes.py | 33 |
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__'): |