Bei Unterklassen sollte man wenn möglich die gleichen Argumente in der `__init__()` zulassen wie bei der Basisklasse. `dict()` kann man ein `iterable` aus Schlüssel/Wert-Paaren mit auf den Weg geben, oder Keyword-Argumente. Das geht beim `ObjectStore` nicht. Die gleichen Argumente sind auch bei `dict.update()` möglich.
Es wird sehr oft nach dem Schlüssel in `self._keys` gesucht. Das ist eine lineare Suche, da sollte man lieber im Dictionary nachsehen.
`__len__()` müsste man nicht überschreiben, das vom `dict` tut's auch. Das gleiche gilt für `get()`.
Das Iterieren geht auch ohne Schleife und Generatorfunktion: ``return iter(self._keys)``.
Den ``+``-Operator mit einer Methode zu überladen, die einen Operanden verändert ist keine gute Idee, weil die übliche Erwartung ist, dass nach ``c = a + b`` ein neues Objekt an `c` gebunden wird und `a` und `b` unverändert sind. In diesem Fall wird an das `c` das `None`-Objekt gebunden und `a` wird verändert. Da `c` gar keinen Sinn macht, würde man dann ``a + b`` schreiben, was sehr komisch aussieht. Wenn ich das so in Quelltext sehen würde, würde ich denken da hat jemand einen Fehler gemacht, weil das keinen Effekt hat.
`__repr__()` sollte per Konvention entweder eine Zeichenkette liefern, die man mit `eval` wieder in ein äquivalentes Objekt umwandeln kann, oder etwas das in Spitze Klammern ('< ... >') eingefasst ist. Für `repr()` gibt's übrigens bei der Zeichenkettenformatierung den Platzhalter `%r`.
`iterkeys()` macht das selbe wie `__iter__()` da würde also ein ``iterkeys = __iter__`` ausreichen und ein "gemeinsamer" Docstring bei `__iter__()`.
Da `dict.popitem()` keine Garantien über das Paar macht welches entfernt wird, kann man auch einfach das für den letzten Schlüssel in der Schlüsselliste nehmen. Das zu entfernen ist effizienter als `remove()` auf der Liste zu verwenden.
`value_index()` sucht nachdem der Wert gefunden wurde noch einmal linear in der Schlüsselliste nach der Position. Das kann man vermeiden. Ausserdem fehlt eine Ausnahme falls der Wert nicht enthalten ist.
Code: Alles auswählen
def value_index(self, value):
for i, value2 in enumerate(self.itervalues()):
if value == value2:
return i
raise ValueError('value not found')