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?
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
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
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