diff options
author | Dmitry Pribysh <dmand@yandex.ru> | 2015-10-08 16:22:42 +0300 |
---|---|---|
committer | Dmitry Pribysh <dmand@yandex.ru> | 2015-10-08 16:22:42 +0300 |
commit | f9550ad341a5155f32f895d068c8bbcd29e07606 (patch) | |
tree | d9f0a07271ae7b2a7c8a862831710c6e0f14eed7 /pylint/checkers/typecheck.py | |
parent | 892108e5313120e0040cb1f260612030e9ed61d6 (diff) | |
download | pylint-f9550ad341a5155f32f895d068c8bbcd29e07606.tar.gz |
Handle more corner cases in iterable/mapping checker
Diffstat (limited to 'pylint/checkers/typecheck.py')
-rw-r--r-- | pylint/checkers/typecheck.py | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/pylint/checkers/typecheck.py b/pylint/checkers/typecheck.py index d54c5d3..83d9742 100644 --- a/pylint/checkers/typecheck.py +++ b/pylint/checkers/typecheck.py @@ -90,7 +90,13 @@ def _is_comprehension(node): return isinstance(node, comprehensions) +def _is_class_def(node): + return isinstance(node, astroid.ClassDef) + + def _is_iterable(value): + if _is_class_def(value): + return False try: value.getattr('__iter__') return True @@ -106,6 +112,8 @@ def _is_iterable(value): def _is_iterator(value): + if _is_class_def(value): + return False try: value.getattr('__iter__') if six.PY2: @@ -118,6 +126,8 @@ def _is_iterator(value): def _is_old_style_iterator(value): + if _is_class_def(value): + return False try: value.getattr('__getitem__') value.getattr('__len__') @@ -127,10 +137,12 @@ def _is_old_style_iterator(value): def _is_mapping(value): + if _is_class_def(value): + return False try: value.getattr('__getitem__') value.getattr('__iter__') - value.getattr('__len__') + value.getattr('keys') return True except astroid.NotFoundError: return False @@ -873,7 +885,7 @@ class IterableChecker(BaseChecker): def _check_iterable(self, node, root_node): # for/set/dict-comprehensions can't be infered with astroid, - # so we check for them before the inference + # so we check for them before checking infered value if _is_comprehension(node): return infered = helpers.safe_infer(node) |