Sortiertes Dict

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
Whitie
User
Beiträge: 111
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Dienstag 13. November 2007, 09:15

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
BlackJack

Dienstag 13. November 2007, 10:08

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')
Benutzeravatar
Whitie
User
Beiträge: 111
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Dienstag 13. November 2007, 11:07

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
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 13. November 2007, 15:49

[wiki]sortiertes Dictionary[/wiki] :lol:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Whitie
User
Beiträge: 111
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Dienstag 13. November 2007, 18:33

@jens: Ja das kenne ich, ist aber etwas weniger funktionell als meins.
Antworten