跨越不同版本的Python __getitem__行为

时间:2014-07-31 05:58:16

标签: python python-2.7 magic-methods

class A(object):
    def __getitem__(self, item):
        print item

a = A()
a[0:-1]

Windows上的python 2.7.3,2.7.7,2.7.8,3.3.2上的输出:

slice(0, -1, None)

win 32上的python 2.7.6(32位)输出:

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

在python 2.7.6中,切片对象试图获取实例的长度,以便它可以转换&#39; -1&#39;真正的价值。例如,如果实例的长度为10,则输出将为&#39; slice(0,9,None)&#39;。

这种行为似乎很奇怪。任何人都可以验证我的观察是否正确吗?如果是,那么这背后是否有任何官方文件?我们如何处理这种行为以支持我们在所有版本的python上的项目?

1 个答案:

答案 0 :(得分:0)

看起来像是存在于2.7.3和2.7.8之间的错误

Python 2.7.8 (default, Jul  1 2014, 17:30:21) 
[GCC 4.9.0 20140604 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class A(object):
...     def __getitem__(self, item):
...         print item
... 
>>> a = A()
>>> a[0:-1]
slice(0, -1, None)

对战

Python 2.7.3 (default, Feb 27 2014, 19:58:35) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class A(object):
...     def __getitem__(self, item):
...         print item
... 
>>> a = A()
>>> a[0:-1]
slice(0, -1, None)

它可能在Windows上。在Windows上尝试2.7.8,看看你是否可以在那里重现它。