Python字典类&x27;键错误';

Python字典类&x27;键错误';,python,dictionary,Python,Dictionary,我有以下类,用于存储其他对象要访问的设置: #!/usr/bin/env python class Settings: """Singleton settings class"""

我有以下类,用于存储其他对象要访问的设置:

#!/usr/bin/env python                                                           

class Settings:                                                                    
    """Singleton settings class"""                                              

    settings = {                                                                   
                   'SectionA': {'a': 1, 'b': 2, 'c': 3},                           
                   'SectionB': {'d': 4, 'e': 5, 'f': 6}                            
               }                                                                   

    def __getitem__(self, key): return self.settings[key]                          
    def __setitem__(self, key, item): self.settings[key] = item                    
    def keys(self): return self.settings.keys()                                    

s = Settings()                                                                     
print s.keys()                                                                     
print s['SectionA']                                                                
print s['SectionB']                                                                

for key in s: print s[key]    
我不明白它为什么会产生以下输出,或者如何绕过它,非常感谢您的帮助:

foo@bar:~$ python Settings.py
['SectionB', 'SectionA']
{'a': 1, 'c': 3, 'b': 2}
{'e': 5, 'd': 4, 'f': 6}
Traceback (most recent call last):
  File "Settings.py", line 20, in <module>
    for key in s: print s
  File "Settings.py", line 11, in __getitem__
    def __getitem__(self, key): return self.settings[key]
KeyError: 0
foo@bar:~$
foo@bar:~$python Settings.py
['SectionB','SectionA']
{'a':1,'c':3,'b':2}
{'e':5,'d':4,'f':6}
回溯(最近一次呼叫最后一次):
文件“Settings.py”,第20行,在
对于输入s:打印s
文件“Settings.py”,第11行,在__
def\uu getitem\uu(self,key):返回self.settings[key]
关键错误:0
foo@bar:~$

这是因为当您在Settings类上进行迭代时,它显然会尝试按索引进行迭代,就像列表一样。第一个索引是
0
,它给出了一个键错误,因为它不在您的dict中。您必须定义特殊的方法来覆盖
for key in s
语法中的键,以便在键上迭代

def __iter__(self): return iter(self.settings)
编辑:另一件事是,您正在使用不推荐使用的旧式类。您应该将其更改为
设置(对象)

此功能:

class Settings(dict):                                                                    
    """Singleton settings class"""                                              

    settings = {                                                                   
                   'SectionA': {'a': 1, 'b': 2, 'c': 3},                           
                   'SectionB': {'d': 4, 'e': 5, 'f': 6}                            
               }                                                                   

    def __getitem__(self, key): return self.settings[key]                          
    def __setitem__(self, key, item): self.settings[key] = item                    
    def keys(self): return self.settings.keys()                                    

s = Settings()                                                                     

for key in s.keys(): 
    print key 
    print s[key]
印刷品:

SectionB
{'e': 5, 'd': 4, 'f': 6}
SectionA
{'a': 1, 'c': 3, 'b': 2}
编辑

看,没有
{}.keys()


打印相同的输出…

您的意思是s:print key的
,而不是s:print s的
?这是否回答了您的问题?听起来很有希望,我会尝试一下。设置(对象)有什么效果?这个解决方案表面上是可行的,但会给出奇怪的“双精度”输出:
{'a':1,'c':3,'b':2}{'e':5,'d':4,'f'{'e':5,'d':4,'f':6}{'a':1,'c':3,'b':2}{/code>@iceaxe,它将它变成了一个新的样式类。基本上,现代python中的许多特性只适用于新样式的类。查找更多信息。这解决了我从python2 DictMixin升级到python3时的问题。我同意,这是可行的。但是,我试图避免定义s.keys()。我不清楚自己的目标,这是我的错。无论如何,谢谢你。
class Settings(dict):                                                                    
    """Singleton settings class"""                                              

    settings = {                                                                   
                   'SectionA': {'a': 1, 'b': 2, 'c': 3},                           
                   'SectionB': {'d': 4, 'e': 5, 'f': 6}                            
               }                                                                   

    def __getitem__(self, key): return self.settings[key]                          
    def __setitem__(self, key, item): self.settings[key] = item  
    def __iter__(self): return iter(self.settings.keys())               
    def keys(self): return self.settings.keys()      


s = Settings()                                                                                                                                   

for key in s: 
    print key 
    print s[key]