使用__setitem__还需要在python 2中实现__len__

pix*_*lou 6 python python-2.x python-3.x

这个非常简单的片段在python 2上失败但是传递了python 3:

class A:
    def __init__(self, value):
        self.value = value

    def __setitem__(self, key, value):
        pass

r = A(1)
r[80:-10] = list(range(10))
Run Code Online (Sandbox Code Playgroud)

在python2上,解释器调用__len__不存在,因此失败:

Traceback (most recent call last):
  File "prog.py", line 9, in <module>
AttributeError: A instance has no attribute '__len__'
Run Code Online (Sandbox Code Playgroud)

这种行为记录在哪里?强制容器具有尺寸是没有意义的.

use*_*ica 6

这是一种旧式的怪癖.旧式类有许多记录不完整的怪癖,其中大多数旧行为都没有跟上Python的变化.

在这里,types.InstanceType 有一个__setslice__,负责查找旧式的类__setitem____setslice__.由于__setslice__存在,Python会尝试通过__setslice__,这需要len首先调用负片索引.您的(旧式)类没有__len__,因此调用失败.

使用新式的类:

class A(object):
    ...
Run Code Online (Sandbox Code Playgroud)