这是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停止自动决定切片索引?
答案 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 __()而不是。
(强调我的)