2012-08-07 4 views
4

J'ai la classe suivante que j'utilise pour stocker les paramètres pour d'autres objets d'accès:Python classe dictionnaire, « 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]  

Je ne comprends pas pourquoi il produit la sortie suivante ou comment se déplacer il, toute aide grandement appréciée:

[email protected]:~$ 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 
[email protected]:~$ 
+1

Ne vouliez-vous pas dire «pour entrer dans s: touche d'impression», pas pour «entrer s: imprimer s»? – dkim

+0

Je vais corriger ça merci. –

Répondre

1

Cela fonctionne:

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] 

Prints:

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

Modifier

Regardez ma, pas {}.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] 

Imprime la même sortie ...

+0

Je suis d'accord, cela fonctionne. Cependant, j'essaie d'éviter de définir s.keys(). C'est ma faute si je ne suis pas clair sur ce que je vis. Merci quand même. –

+0

Très bien. Je vous remercie. –

3

C'est parce que quand vous itérer sur la classe des paramètres, il essaie apparemment itérer par index, comme une liste. Le premier indice est 0, ce qui donne une KeyError car il est pas dans votre dict. Vous devez définir des méthodes particulières pour passer outre la syntaxe for key in s à itérer sur vos clés.

def __iter__(self): return iter(self.settings) 

Modifier: Une autre chose est que vous utilisez les anciennes classes de style déconseillées. Vous devez changer pour Settings(object)

+0

Cela semble prometteur, je vais essayer. –

+0

Quel effet a les paramètres (objet)? –

+0

Cette solution fonctionne en apparence, mais donne étrange 'double' sortie: '{ 'a': 1, 'c': 3, 'b': 2} { 'e': 5, 'd': 4, « f ': 6} { ' e ': 5, 'd': 4, 'f': 6} { ' a ': 1, 'c': 3, 'b': 2} ' –

Questions connexes