大致如下:
>>> class A:
def __getitem__(self, item):
if isinstance(item, slice):
return list(range(item.start, item.stop, item.step))
>>> a = A()
>>> a[1:5:2] # works fine
[1, 3]
>>> a[1:5] # won't work :(
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
a[1:5] # won't work :(
File "<pyshell#9>", line 4, in __getitem__
return list(range(item.start, item.stop, item.step))
TypeError: 'NoneType' object cannot be interpreted as an integer
很明显,这里的问题是 -
range
不接受 None
作为一个值。>>> range(1, 5, None)
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
range(1, 5, None)
TypeError: 'NoneType' object cannot be interpreted as an integer
但是对我来说不明显的是解决方案。如何调用range
以便在任何情况下都能正常工作呢?我正在寻找一种优雅的Python方式来完成这件事。
range
对象以获得一个新的range
对象,这有帮助吗? - asmeurerrange(item.start or 0, item.stop or len(self), item.step or 1)
。如果没有定义__len__
,则根据需要替换len(self)
。 - lehiester