2013-07-19 54 views
3

我創建了一個類,它的子類ConfigParser.SafeConfigParser來實現無節制的配置文件。我遇到的問題是,我得到一個意想不到的片型相比,回來我怎麼指望__getitem__迴應:子類'__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)

回答

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中沒有這種東西)的差異可能會有幫助。

+0

我應該想到它與舊式類有關,因爲我痛苦地發現了'SafeConfigParser'多少次分類不關心'@ property'。我會看看Python 3的,也許它會引導我走向正確的方向 - 謝謝! – hexparrot