summaryrefslogtreecommitdiff
path: root/checkers/base.py
diff options
context:
space:
mode:
Diffstat (limited to 'checkers/base.py')
-rw-r--r--checkers/base.py37
1 files changed, 26 insertions, 11 deletions
diff --git a/checkers/base.py b/checkers/base.py
index 12bc8b3..2ec6fe9 100644
--- a/checkers/base.py
+++ b/checkers/base.py
@@ -700,18 +700,33 @@ functions, methods
except NoSuchArgumentError:
self.add_message('missing-reversed-argument', node=node)
else:
- if not argument:
- return
-
- for methods in REVERSED_METHODS:
- for meth in methods:
- try:
- argument.getattr(meth)
- except astroid.NotFoundError:
+ if argument is None:
+ # nothing was infered
+ return
+
+ if isinstance(argument, astroid.Instance):
+ if (argument._proxied.name == 'dict' and
+ is_builtin_object(argument._proxied)):
+ self.add_message('bad-reversed-sequence', node=node)
+ return
+ elif any(ancestor.name == 'dict' and is_builtin_object(ancestor)
+ for ancestor in argument._proxied.ancestors()):
+ # mappings aren't accepted by reversed()
+ self.add_message('bad-reversed-sequence', node=node)
+ return
+
+ for methods in REVERSED_METHODS:
+ for meth in methods:
+ try:
+ argument.getattr(meth)
+ except astroid.NotFoundError:
+ break
+ else:
break
- else:
- break
- else:
+ else:
+ self.add_message('bad-reversed-sequence', node=node)
+ elif not isinstance(argument, (astroid.List, astroid.Tuple)):
+ # everything else is not a proper sequence for reversed()
self.add_message('bad-reversed-sequence', node=node)
class NameChecker(_BasicChecker):