Python,__ getitem__,切片和负索引

时间:2015-06-16 17:15:58

标签: python slice python-2.x

这是Python在切片中传递负数的行为示例:

>>> class test:
...     def __getitem__(self, sl):
...          print sl.start, sl.stop, sl.step
...
>>> t = test()
>>> t[0:0:0]
0 0 0
>>> t[-1:0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: test instance has no attribute '__len__'
>>> def __len__(self): return 100
...
>>> test.__len__ = __len__
>>> t[-1:0]
99 0 None
>>>

我想用负面索引自己处理。如何让Python停止自动决定切片索引?

1 个答案:

答案 0 :(得分:2)

在Python 2.x中,您需要通过继承object来使用新式类,然后获得切片的原始参数:

>>> class C(object):
...   def __getitem__(self, key):
...     print key
...
>>> c = C()
>>> c[-1:2]
slice(-1, 2, None)

在2.x之前,有一个专用的切片方法__getslice__,在Python 2.x中仍然支持,并使用__len__进行插值:

  

被要求实施对自我[i:j]的评价。返回的对象应与self类型相同。请注意,切片表达式中缺少的i或j分别由零或sys.maxsize替换。 如果在切片中使用负索引,则将序列的长度添加到该索引。如果实例未实现__len __()方法,则会引发AttributeError 。不保证以这种方式调整的指数仍不是负面的。不修改大于序列长度的索引。 如果找不到__getslice __(),则会创建切片对象,并传递给__getitem __()而不是

(强调我的)