diff options
| author | cpopa <devnull@localhost> | 2013-10-10 14:49:19 +0300 |
|---|---|---|
| committer | cpopa <devnull@localhost> | 2013-10-10 14:49:19 +0300 |
| commit | 7aa994aad907e9e2b0727fac8e1d81fc953f60db (patch) | |
| tree | eaad50ad864805b4d93500045fe6a1b8606a1bdc /checkers | |
| parent | b24484fd0b3fd43c5714f982a161cd91cf4793b8 (diff) | |
| download | pylint-7aa994aad907e9e2b0727fac8e1d81fc953f60db.tar.gz | |
Mappings aren't accepted by reversed().
Diffstat (limited to 'checkers')
| -rw-r--r-- | checkers/base.py | 37 |
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): |
