2012-12-13 9 views
9

Ich habe in meinem Code die folgenden benutze:ipython Tabulatorvervollständigung für benutzerdefinierte Klasse dict

class Structure(dict,object): 
""" A 'fancy' dictionary that provides 'MatLab' structure-like 
referencing. 

""" 
def __getattr__(self, attr): 
    # Fake a __getstate__ method that returns None 
    if attr == "__getstate__": 
     return lambda: None 
    return self[attr] 

def __setattr__(self, attr, value): 
    self[attr] = value 

def set_with_dict(self, D): 
    """ set attributes with a dict """ 
    for k in D.keys(): 
     self.__setattr__(k, D[k]) 

Alles in allem für meine Zwecke funktioniert, aber ich habe bemerkt, dass nur so Tabulatorvervollständigung funktioniert, ist für Methoden in einer anderen benutzerdefinierten Klasse, die von Struktur geerbt wurde, und nicht für Attribute. Ich habe auch diesen Test, und ich finde, das Ergebnis ein wenig seltsam:

In [2]: d = Structure() 
In [3]: d.this = 'that' 
In [4]: d.this 
Out[4]: 'that' 
In [5]: d.th<tab> 
NOTHING HAPPENS 

In [6]: class T(): 
    ...:  pass 
    ...: 

In [7]: t = T() 
In [8]: t.this = 'cheese' 
In [9]: t.th<tab> 
COMPLETES TO t.this 
Out[9]: 'cheese' 

Was würde ich brauche, um meine Klasse hinzufügen die Tab-Vervollständigung für die Attribute zur Arbeit zu kommen?

+0

Wenn Sie * statt * Klammer Indizierung Punkt zugreifen möchten, um es nicht * zusätzlich *, Sie könnten einfach eine leere Unterklasse von 'object' verwenden. Python-Objekte sind standardmäßig "offen". 'x.set_with_dict()' kann durch 'x .__ dict __. update()' – millimoose

+0

ersetzt werden. Außerdem ist das Erben von 'dict' und' object' redundant, da 'dict' (und die meisten Standardbibliotheksklassen) neu sind. Stilklassen und erben bereits von 'Objekt'. – millimoose

+0

Guter Punkt über die Mehrfachvererbung. Allerdings möchte ich _both_ built und dot Zugriff auf meine Schlüssel haben. Ich versuche, meinen Code auf ein reines Python-Diktat umzustellen, habe aber immernoch einige Orte, die auf den Punktzugriff angewiesen sind ... – John

Antwort

13

Fügen Sie diese Methode:

def __dir__(self): 
    return self.keys() 

Siehe hier: http://ipython.org/ipython-doc/dev/config/integrating.html

Und hier: http://docs.python.org/2/library/functions.html

+0

Danke Goodside! Ich habe diese Information (nicht sicher, wie) in meinen früheren Suchen verpasst! – John

+0

Im neueren IPython scheint das Tab-Vervollständigungsfenster eine maximale Anzahl von Einträgen mit Scrolling zu haben. Wer weiß, wie man das anpasst? – mathtick

Verwandte Themen