summaryrefslogtreecommitdiff
path: root/pylint/checkers/typecheck.py
diff options
context:
space:
mode:
Diffstat (limited to 'pylint/checkers/typecheck.py')
-rw-r--r--pylint/checkers/typecheck.py24
1 files changed, 23 insertions, 1 deletions
diff --git a/pylint/checkers/typecheck.py b/pylint/checkers/typecheck.py
index a37a442..f8067ba 100644
--- a/pylint/checkers/typecheck.py
+++ b/pylint/checkers/typecheck.py
@@ -37,7 +37,8 @@ from pylint.checkers.utils import (
is_super, check_messages, decorated_with_property,
decorated_with, node_ignores_exception,
is_iterable, is_mapping, supports_membership_test,
- is_comprehension, is_inside_abstract_class)
+ is_comprehension, is_inside_abstract_class,
+ supports_subscript)
from pylint import utils
@@ -153,6 +154,10 @@ MSGS = {
'unsupported-membership-test',
'Emitted when an instance in membership test expression doesn\'t'
'implement membership protocol (__contains__/__iter__/__getitem__)'),
+ 'E1136': ("Value '%s' is unsubscriptable",
+ 'unsubscriptable-value',
+ "Emitted when a subscripted value doesn't support subscription"
+ "(i.e. doesn't define __getitem__ method)"),
}
# builtin sequence types in Python 2 and 3.
@@ -817,6 +822,23 @@ accessed. Python regular expressions are accepted.'}
if operator in ['in', 'not in']:
self._check_membership_test(right)
+ @check_messages('unsubscriptable-value')
+ def visit_subscript(self, node):
+ if isinstance(node.value, (astroid.ListComp, astroid.DictComp)):
+ return
+ if isinstance(node.value, astroid.SetComp):
+ self.add_message('unsubscriptable-value',
+ args=node.value.as_string(),
+ node=node.value)
+ infered = helpers.safe_infer(node.value)
+ if infered is None or infered is astroid.YES:
+ return
+ if not supports_subscript(infered):
+ self.add_message('unsubscriptable-value',
+ args=node.value.as_string(),
+ node=node.value)
+
+
class IterableChecker(BaseChecker):
"""