3

我创建了一个子类 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()切片操作——但这​​使得通过 确定用户的意图特别困难,if option.start is None在前一种情况下失败。

什么部分SafeConfigParser正在改变这种行为,我可以做些什么来(None, None, None)代替(0, sys.maxint, None)

4

1 回答 1

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(不使用旧式类,因为 Python 3 中没有这样的东西)可能会有所帮助。

于 2013-07-19T18:20:52.890 回答