子类'__getitem__返回意外切片

时间:2013-07-19 17:48:18

标签: python python-2.7 subclass slice

我创建了一个继承ConfigParser.SafeConfigParser的类来实现无段配置文件。我遇到的问题是,与我期望__getitem__的回应相比,我得到了意想不到的切片类型:

import ConfigParser

class foo(ConfigParser.SafeConfigParser):
    def __getitem__(self, option):
        return option

class bar(object):
    def __getitem__(self,option):
        return option

a = foo()
b = bar()
print a[:]
print b[:]

我的回答让我感到困惑:

slice(0, 2147483647, None)
slice(None, None, None)

在这两种情况下我都期望(None, None, None)。我可以猜测它的行为是熟悉的 - 例如,如果我正在使用简单的list()切片操作 - 但是这使得通过{{1}确定用户的意图特别困难在前一种情况下失败了。

if option.start is None的哪一部分正在改变此行为,我该怎么做以接收SafeConfigParser而不是(None, None, None)

1 个答案:

答案 0 :(得分:3)

SafeConfigParser是一个旧式的课程,因此foo也是如此。您的bar是一种新式的类(源自object)。

>>> type(ConfigParser.SafeConfigParser)
<type 'classobj'>

>>> type(foo)
<type 'classobj'>

>>> type(bar)
<type 'type'>

旧式课程与新式课程有许多不同之处;很明显,这是其中之一,大概是为了向后兼容(即因为这是切片的行为方式)。它与SafeConfigParser 本身无关,如您所见:

class baz:    # old-style class in Python 2.x where x >= 2
    def __getitem__(self, option):
        return option

c = baz()
print c[:]    # slice(0, 2147483647, None)

为了解决这个问题,我想您可以尝试更新ConfigParser以使用新式课程。这可能相当容易; Python 3的configparser的差异(它不使用旧式的clasess,因为Python 3中没有这样的东西)可能会有所帮助。