[英]Python dictionary class, 'KeyError'
我有以下用于存储其他对象访问设置的类:
#!/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:~$
那是因为当您遍历Settings类时,它显然试图按索引(如列表)进行遍历。 第一个索引是0
,因为它不在您的字典中,所以会给出KeyError。 您必须定义特殊的方法来覆盖for key in s
语法以迭代关键字。
def __iter__(self): return iter(self.settings)
编辑:另一件事是您正在使用不赞成使用的旧样式类。 您应该将其更改为Settings(object)
这有效:
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()
:
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]
打印相同的输出...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.