如何实现__delitem__来处理所有可能的情景片?(How to implement __del

2019-07-01 11:17发布

我在一类和嵌入式清单的工作。

class a:
    def __init__(self, n):
        self.l = [1] * n
    def __getitem__(self, i):
        return self.l[i]
    def __delitem__(self, i):
        print type(i)
        print i

我想用del运营商与片的完整语法:

p = a(10)
del p[1:5:2]

所述__delitem__接收slice对象如果参数不是一个单一的索引。 我如何使用slice对象通过指定的元素进行迭代?

Answer 1:

indices切片对象的方法,给出的序列的长度,提供了可以喂到切片的规范解释xrange

def __delitem__(self, item):
    if isinstance(item, slice):
        for i in xrange(*item.indices(len(self.l))):
            print i
    else:
        print operator.index(item)

采用slice.indices可以确保你在正确的情况下的行为所指出的沙丘 。 另外请注意,您可以通过切片对象list.__delitem__ ,所以如果你只需要做一些预处理和委托实际删除底层列表,“天真” del self.l[i]实际上将正常工作。

operator.index将确保如果你早点例外__delitem__收到一个不能被转换为索引的非切片对象。



Answer 2:

slice对象有startstopstep属性,你可以用它来获得上述组件。 例如:

def __delitem__(self, i):
    if isinstance(i, slice):
        for j in xrange(i.start, i.stop, i.step):
            print j
    else:
        print i


文章来源: How to implement __delitem__ to handle all possible slice scenarios?
标签: python slice