Implementare il Mapping
ABC. Tecnicamente, i documenti di lingua non specificano quali siano i metodi Mapping
, quindi supponendo che sia necessario solo un sottoinsieme utilizzato dall'implementazione corrente è una cattiva idea. All it says is:
Se la sintassi ** espressione appare nella chiamata di funzione, l'espressione deve essere valutata come una mappatura, il cui contenuto sono trattati come argomenti chiave aggiuntivi. Nel caso di una parola chiave che appare in entrambe le espressioni e come argomento di parole chiave esplicite, viene sollevata un'eccezione TypeError.
Quindi, se si implementa il Mapping
ABC, è sicuramente le interfacce giuste, indipendentemente dal fatto che si basa su .items()
, iterazione diretta e __getitem__
chiamate, ecc
Cordiali saluti, il controllo, il comportamento in CPython 3.5 dipende sicuramente da come implementa Mapping
(se si eredita da dict
, utilizza un percorso ottimizzato che accede direttamente agli interni di dict
, se non lo fa, itera .keys()
e cerca ogni chiave mentre va). Quindi sì, non tagliare gli angoli, implementare l'intero ABC. Grazie alle implementazioni ereditate dalla Mapping
ABC ed è genitori di default, questo può essere fatto con un minimo di:
class MyMapping(Mapping):
def __getitem__(self, key):
...
def __iter__(self):
...
def __len__(self):
...
Le implementazioni di default si eredita potrebbe non essere ottimale in alcuni casi (ad esempio items
e values
farebbe semi-male roba che riguarda l'iterazione e la ricerca, in cui gli accessor diretti potrebbero essere più veloci a seconda degli interni), quindi se lo utilizzi per altri scopi, ti suggerirei di ignorare quelli con versioni ottimizzate.
Eccellente. Grazie mille, non avevo mai sentito parlare di 'Mapping' prima! –