【问题标题】:How does list slicing hook into __getitem__? [duplicate]列表切片如何挂钩到 __getitem__? [复制]
【发布时间】:2014-08-20 15:25:54
【问题描述】:
>>> class List(list):
...     def __getitem__(self, i):
...         print i, type(i)
...         return super(List, self).__getitem__(i)
...     
>>> x = List([0,1,2,3])
>>> x[1:3:]
slice(1, 3, None) <type 'slice'>
[1, 2]
>>> x[1:3]
[1, 2]

为什么第二种情况不使用List.__getitem__?它用什么代替?

>>> x[::]
slice(None, None, None) <type 'slice'>
[0, 1, 2, 3]
>>> x[:]
[0, 1, 2, 3]

同样,为什么这里的差异不是这两个切片操作?

【问题讨论】:

  • 顺便说一句,这是 v2.7.6 所以__getslice__ (据称)已弃用
  • 仅供参考,无法在 3.4.0 中重新创建(即,两种情况我都得到 slice(1, 3, None) &lt;type 'slice'&gt;)。
  • 是的 py3 表现得很好
  • FWIW,因为它是一个子类,你可以通过定义__getslice__ = lambda self, i, j: self.__getitem__(slice(i, j))使其保持一致。
  • __delslice____setslice__ 以及 的版本信息检查

标签: python list slice python-2.x magic-methods


【解决方案1】:

language reference 说明了一切。具体来说:

2.0 版后已弃用:支持切片对象作为参数__getitem__() 方法。 (但是,CPython 中的内置类型目前仍然实现 __getslice__()因此,在实现切片时,您必须在派生类中重写它。

和:

调用以实现 self[i:j] ...

的评估

注意它不能处理self[i:j:] ...

【讨论】:

  • 这是否意味着您必须在 both getslice 和 getitem 中处理切片?烦人..
  • 是的,这就是它的意思——但仅适用于内置类型的子类。幸运的是,如果您希望更明确一点,它就像 def __getslice__(self, i, j): return self[i:j:None]self.__getitem__(slice(i, j)) 一样简单......
  • @downvoter -- 如果您对这是不正确或不清楚的地方发表评论,我很乐意尝试解决您的问题并改进此答案:-)
  • @glglgl -- 感谢您的编辑。我复制/粘贴太快了:-)
  • @mgilson 没问题,不客气 :-)
【解决方案2】:

这是python2.7 documentation 中描述切片如何工作的部分:

切片现在选择索引为 k 的所有项目,使得 i

【讨论】:

  • 我不认为这是@wim 所问的......
猜你喜欢
  • 2013-11-30
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
相关资源
最近更新 更多