die Mapping
ABC implementieren. Technisch gesehen geben die Sprachdokumente nicht an, welche Mapping
Methoden verwendet werden. Daher ist es eine schlechte Idee, anzunehmen, dass Sie nur eine Teilmenge benötigen, die von der aktuellen Implementierung verwendet wird. All it says is:
Wenn die Syntax ** Expression in der Funktionsaufruf angezeigt wird, die Expression einer Abbildung auswerten müssen, werden die Inhalte, die als zusätzliche Schlüsselwort Argumente behandelt. Im Fall eines Schlüsselworts, das sowohl in Ausdruck als auch als explizites Schlüsselwortargument angezeigt wird, wird eine TypeError-Ausnahme ausgelöst.
Wenn Sie also das Mapping
ABC implementieren, müssen Sie auf jeden Fall die richtigen Schnittstellen, unabhängig davon, ob es beruht auf .items()
, direkte Iteration und __getitem__
Anrufe usw.
FYI, auf die Überprüfung, das Verhalten in CPython 3.5 auf jeden Fall abhängig von wie Sie Mapping
implementieren (wenn Sie von dict
erben, verwendet es einen optimierten Pfad, der dict
Einbauten direkt zugreift, wenn Sie nicht tun, es iteriert .keys()
und sieht jede Taste nach oben, wie es geht). Also, mach keine Schnitte, implementiere das ganze ABC. Dank Implementierungen aus dem Mapping
ABC und seinen Eltern geerbt auf Default, kann dies mit so wenig wie möglich:
class MyMapping(Mapping):
def __getitem__(self, key):
...
def __iter__(self):
...
def __len__(self):
...
Die Standardimplementierungen Sie erben können in bestimmten Fällen suboptimal sein (zB items
und values
tun würde, halb Übel Dinge, die Iteration und Nachschlagen beinhalten, wobei direkte Accessoren je nach Interna schneller sein könnten. Wenn Sie es also für andere Zwecke verwenden, würde ich vorschlagen, diese mit optimierten Versionen zu überschreiben.
Ausgezeichnet. Vielen Dank, hatte noch nie zuvor von 'Mapping' gehört! –