diff options
Diffstat (limited to 'pylint/test/functional/unsubscriptable_value.py')
-rw-r--r-- | pylint/test/functional/unsubscriptable_value.py | 84 |
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] |