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)
这种行为记录在哪里?强制容器具有尺寸是没有意义的.
这是一种旧式的怪癖.旧式类有许多记录不完整的怪癖,其中大多数旧行为都没有跟上Python的变化.
在这里,types.InstanceType 有一个__setslice__,负责查找旧式的类__setitem__和__setslice__.由于__setslice__存在,Python会尝试通过__setslice__,这需要len首先调用负片索引.您的(旧式)类没有__len__,因此调用失败.
使用新式的类:
class A(object):
...
Run Code Online (Sandbox Code Playgroud)