summaryrefslogtreecommitdiff
path: root/pylint/test/functional/unsubscriptable_value.py
diff options
context:
space:
mode:
Diffstat (limited to 'pylint/test/functional/unsubscriptable_value.py')
-rw-r--r--pylint/test/functional/unsubscriptable_value.py84
1 files changed, 84 insertions, 0 deletions
diff --git a/pylint/test/functional/unsubscriptable_value.py b/pylint/test/functional/unsubscriptable_value.py
new file mode 100644
index 0000000..ed94244
--- /dev/null
+++ b/pylint/test/functional/unsubscriptable_value.py
@@ -0,0 +1,84 @@
+"""
+Checks that value used in a subscript supports subscription
+(i.e. defines __getitem__ method).
+"""
+# pylint: disable=missing-docstring,pointless-statement,expression-not-assigned
+# pylint: disable=too-few-public-methods,import-error,invalid-name
+import six
+
+# primitives
+numbers = [1, 2, 3]
+numbers[0]
+"123"[0]
+u"123"[0]
+b"123"[0]
+bytearray(b"123")[0]
+dict(a=1, b=2)['a']
+(1, 2, 3)[0]
+
+# list/dict comprehensions are fine
+[x for x in range(10)][0]
+{x: 10 - x for x in range(10)}[0]
+
+
+# instances
+class NonSubscriptable(object):
+ pass
+
+class Subscriptable(object):
+ def __getitem__(self, key):
+ return key + key
+
+NonSubscriptable()[0] # [unsubscriptable-value]
+NonSubscriptable[0] # [unsubscriptable-value]
+Subscriptable()[0]
+Subscriptable[0] # [unsubscriptable-value]
+
+# generators are not subscriptable
+def powers_of_two():
+ k = 0
+ while k < 10:
+ yield 2 ** k
+ k += 1
+
+powers_of_two()[0] # [unsubscriptable-value]
+powers_of_two[0] # [unsubscriptable-value]
+
+
+# check that primitive non subscriptable types are catched
+True[0] # [unsubscriptable-value]
+None[0] # [unsubscriptable-value]
+8.5[0] # [unsubscriptable-value]
+10[0] # [unsubscriptable-value]
+
+# sets are not subscriptable
+{x ** 2 for x in range(10)}[0] # [unsubscriptable-value]
+set(numbers)[0] # [unsubscriptable-value]
+frozenset(numbers)[0] # [unsubscriptable-value]
+
+# skip instances with unknown base classes
+from some_missing_module import LibSubscriptable
+
+class MaybeSubscriptable(LibSubscriptable):
+ pass
+
+MaybeSubscriptable()[0]
+
+# subscriptable classes (through metaclasses)
+
+class MetaSubscriptable(type):
+ def __getitem__(cls, key):
+ return key + key
+
+class SubscriptableClass(six.with_metaclass(MetaSubscriptable, object)):
+ pass
+
+SubscriptableClass[0]
+SubscriptableClass()[0] # [unsubscriptable-value]
+
+# functions are not subscriptable
+def test(*args, **kwargs):
+ return args, kwargs
+
+test()[0]
+test[0] # [unsubscriptable-value]