From 0c7dc2248c66da8d8884985ec5d96f2d243b1849 Mon Sep 17 00:00:00 2001 From: Claudiu Popa Date: Thu, 26 Nov 2015 17:18:16 +0200 Subject: Added a new warning, 'unsupported-delete-operation' It is emitted when item deletion is tried on an object which doesn't have this ability. Closes issue #592. --- .../functional/unsupported_delete_operation.py | 94 ++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 pylint/test/functional/unsupported_delete_operation.py (limited to 'pylint/test/functional/unsupported_delete_operation.py') diff --git a/pylint/test/functional/unsupported_delete_operation.py b/pylint/test/functional/unsupported_delete_operation.py new file mode 100644 index 0000000..297cc15 --- /dev/null +++ b/pylint/test/functional/unsupported_delete_operation.py @@ -0,0 +1,94 @@ +""" +Checks that value used in a subscript support deletion +(i.e. defines __delitem__ method). +""" +# pylint: disable=missing-docstring,pointless-statement,expression-not-assigned,wrong-import-position +# pylint: disable=too-few-public-methods,import-error,invalid-name,wrong-import-order +import six + +# primitives +numbers = [1, 2, 3] +del numbers[0] + + +del bytearray(b"123")[0] +del dict(a=1, b=2)['a'] +del (1, 2, 3)[0] # [unsupported-delete-operation] + +# list/dict comprehensions are fine +del [x for x in range(10)][0] +del {x: 10 - x for x in range(10)}[0] + + +# instances +class NonSubscriptable(object): + pass + +class Subscriptable(object): + def __delitem__(self, key): + pass + +del NonSubscriptable()[0] # [unsupported-delete-operation] +del NonSubscriptable[0] # [unsupported-delete-operation] +del Subscriptable()[0] +del Subscriptable[0] # [unsupported-delete-operation] + +# generators are not subscriptable +def powers_of_two(): + k = 0 + while k < 10: + yield 2 ** k + k += 1 + +del powers_of_two()[0] # [unsupported-delete-operation] +del powers_of_two[0] # [unsupported-delete-operation] + + +# check that primitive non subscriptable types are catched +del True[0] # [unsupported-delete-operation] +del None[0] # [unsupported-delete-operation] +del 8.5[0] # [unsupported-delete-operation] +del 10[0] # [unsupported-delete-operation] + +# sets are not subscriptable +del {x ** 2 for x in range(10)}[0] # [unsupported-delete-operation] +del set(numbers)[0] # [unsupported-delete-operation] +del frozenset(numbers)[0] # [unsupported-delete-operation] + +# skip instances with unknown base classes +from some_missing_module import LibSubscriptable + +class MaybeSubscriptable(LibSubscriptable): + pass + +del MaybeSubscriptable()[0] + +# subscriptable classes (through metaclasses) + +class MetaSubscriptable(type): + def __delitem__(cls, key): + pass + +class SubscriptableClass(six.with_metaclass(MetaSubscriptable, object)): + pass + +del SubscriptableClass[0] +del SubscriptableClass()[0] # [unsupported-delete-operation] + +# functions are not subscriptable +def test(*args, **kwargs): + return args, kwargs + +del test()[0] # [unsupported-delete-operation] +del test[0] # [unsupported-delete-operation] + +# deque +from collections import deque +deq = deque(maxlen=10) +deq.append(42) +del deq[0] + +# tuples assignment +values = [1, 2, 3, 4] +del (values[0], values[1]) +del (values[0], SubscriptableClass()[0]) # [unsupported-delete-operation] -- cgit v1.2.1