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

时间:2018-09-06 16:31:35

标签: python python-3.x python-2.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))

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

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

此行为记录在哪里?强制容器具有一定大小没有意义。

2 个答案:

答案 0 :(得分:6)

这是一个老式的类古怪。旧式类有很多文献记载不充分的怪癖,其中大多数是旧行为,无法跟上对Python的更改。

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

使用新型的类:

class A(object):
    ...

答案 1 :(得分:0)

原因是您使用的是旧式类。在python 2中,新型类(这是python 3中唯一的类)的语法为

class T(object):
    ...