Wie kann das Mapping-Protokoll in Python korrekt implementiert werden?

8

Ich benutze Python-spidermonkey, das intern PyMapping_Check verwendet, um zu identifizieren, ob das Objekt, das als global (in rt.new_context (global)) verwendet wird, das Mapping-Protokoll implementiert. (Dies ist im Grunde ein Wörterbuch, das an python-spidermonkey übergeben wird, so dass Javascript nur begrenzten Zugriff auf Python-Variablen hat.)

Es gibt keine offizielle Definition, die ich vom Mapping-Protokoll in Python finden könnte, also habe ich versucht, herauszufinden, was drin ist. Gibt es eine offizielle Referenz?

    
Chris 04.11.2013, 19:40
quelle

1 Antwort

14

Das Modul collections.abc definiert die Schnittstellen für Dinge wie Mapping , Sequence und so weiter.

Indem Sie von den abstrakten Basisklassen in diesem Modul erben, erhalten Sie Standardimplementierungen einiger Methoden. Um als Mapping betrachtet zu werden, sollte Ihre Klassendefinition ungefähr so ​​aussehen:

%Vor%

Wenn Sie von Mapping vererben, erhalten Sie "freie" Implementierungen der meisten nützlichen Methoden von dict :

  • __contains__
  • keys
  • items
  • values
  • get
  • __eq__
  • __ne__

Wenn diese Standardmethodenimplementierungen mit Ihrer benutzerdefinierten Datenstruktur nicht effizient sind, können Sie sie immer mit Ihren eigenen Versionen überschreiben.

Um als MutableMapping betrachtet zu werden, sollte die Schnittstelle Ihrer Klasse wie folgt aussehen:

%Vor%

Wenn Sie von MutableMapping geerbt haben, erhalten Sie 'freie' Definitionen aller Methoden von Mapping , plus:

  • pop
  • popitem
  • clear
  • update
  • setdefault

Wenn Sie von Grund auf rollen und keine abstrakte Basisklasse verwenden möchten, sollten Sie wahrscheinlich versuchen, alle der oben genannten Methoden zu definieren, wenn Sie Ihre Klasse verwenden möchten streng Liskov-substituierbar für dict sein.

    
Benjamin Hodgson 04.11.2013, 19:45
quelle

Tags und Links