Seite 1 von 1

Sortiertes Dict

Verfasst: Dienstag 13. November 2007, 09:15
von Whitie
Hi Leute,
ich hatte mal für ein Project ein Dict so erweitert, dass es slices unterstützt und sortiert ist.

Vielleicht kann es ja noch jemand verwenden.

http://paste.pocoo.org/show/10412/

Gruß Whitie

Verfasst: Dienstag 13. November 2007, 10:08
von BlackJack
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')

Verfasst: Dienstag 13. November 2007, 11:07
von Whitie
Danke für die Hinweise. Es ist schon etwas länger her, dass ich das gebraucht habe. Ich werde es mal überarbeiten, da ich es aktuell wieder in einem Projekt verwenden möchte :wink:

Gruß Whitie

Verfasst: Dienstag 13. November 2007, 15:49
von jens
[wiki]sortiertes Dictionary[/wiki] :lol:

Verfasst: Dienstag 13. November 2007, 18:33
von Whitie
@jens: Ja das kenne ich, ist aber etwas weniger funktionell als meins.