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?
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:
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:
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.
Tags und Links python