Domanda

solo ha riscontrato un problema al dict "tipo" sottoclasse. Ho fatto metodo di sostituzione __iter__ e aspettavo che interesserà altri metodi come iterkeys, chiavi ecc perché ho creduto che chiamare __iter__ metodo per ottenere i valori ma sembra esse siano attuate in modo indipendente e devo ignorare tutti loro.

Si tratta di un bug o intenzioni non fanno uso di altri metodi e valori recupera separatamente?

non ho trovato in Python descrizione documentazione standard di chiamate dipendenza tra i metodi di classi standard. Sarebbe utile per sublassing lavoro e per l'orientamento quali metodi è necessario per eseguire l'override per un comportamento corretto. C'è qualche documentazione integrativa su basi pitone tipi / classi interne?

È stato utile?

Soluzione

sottoclasse Mapping o MuteableMapping dalla collezioni modulo invece di dict e si ottiene tutti quei metodi gratis.

Ecco un esempio di una mappatura minima e alcuni dei metodi si ottiene gratuitamente:

import collections
class MinimalMapping(collections.Mapping):
    def __init__(self, *items ):
        self.elements = dict(items)
    def __getitem__(self, key):
        return self.elements[key]
    def __len__(self):
        return len(self.elements)
    def __iter__(self):
        return iter(self.elements)

t = MinimalMapping()
print (t.iteritems, t.keys, t.itervalues, t.get)

Per sottoclasse qualsiasi dei contenitori incorporati si deve sempre utilizzare i baseclass appropriate dal modulo collezioni.

Altri suggerimenti

Se non specificato nella documentazione, è implementazione specifica . Altre implementazioni che CPython potrebbe riutilizzare il metodo iter per implementare iterkeys e altri. Non vorrei che questo sia un bug, ma semplicemente un po 'di libertà per i implementatori.

Ho il sospetto che ci sia un fattore di performance in attuazione dei metodi in modo indipendente, in particolare per quanto dizionari sono così largamente utilizzati in Python.

Quindi, fondamentalmente, è necessario implementare loro.

Sapete il detto: "Sai cosa succede quando si assume". :-)

Non hanno ufficialmente documentare quella roba perché possono decidere di cambiare in futuro. Tutta la documentazione non ufficiale è possibile trovare sarebbe semplicemente documentare il comportamento attuale di un'implementazione di Python, e basandosi su di essa si tradurrebbe nel codice essere molto, molto fragile.

Quando v'è documentazione ufficiale di metodi speciali, si tende a descrivere il comportamento dell'interprete rispetto alle proprie classi, come l'utilizzo __len__() quando __nonzero__() non è implementata, o solo che necessitano __lt()__ per l'ordinamento.

Dato che Python usa duck typing, di solito non effettivamente bisogno di ereditare da una classe incorporata per rendere il proprio atto di classe come uno. Così si potrebbe riconsiderare se sottoclasse dict è davvero ciò che si vuole fare. Si può scegliere una classe diversa, come qualcosa dal modulo collections, o per incapsulare piuttosto che ereditare. (La classe UserString utilizza l'incapsulamento.) O semplicemente ripartire da zero.

Invece di sottoclassi dict, si potrebbe invece basta creare rendere la propria classe che ha esattamente le proprietà desiderate senza troppi problemi. Ecco un blog post con un esempio di come fare questo. Il metodo __str__() in esso non è il massimo, ma questo è facilmente correggibile il resto forniscono la funzionalità che cercate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top