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]