我创建了一个继承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)
答案 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中没有这样的东西)可能会有所帮助。