2016-09-22 3 views
1

Schleife Ich weiß, Python wird einfach die Schlüsselliste zurück, wenn ich eine dict in for...in... Syntax setzen.Was passiert, wenn ich ein Diktat in Python

Aber was passiert mit dem Diktat? Wenn wir help(dict) verwenden, können wir __next()__ Methode in der Methodenliste nicht sehen. Also, wenn ich auf dict eine abgeleitete Klasse basiert machen wollen:

class MyDict(dict) 
    def __init__(self, *args, **kwargs): 
     super(MyDict, self).__init__(*args, **kwargs) 

und die Werteliste zurückkehren mit for...in...

d = Mydict({'a': 1, 'b': 2}) 
for value in d: 

, was soll ich tun?

+2

Warum sollte 'dict'' __next__' haben? Es hat '__iter__', und das Objekt, das diese Funktion zurückgibt, unterstützt' next'. Ihre Klasse 'MyClass' erbt' __iter__' von ihrer Basisklasse 'dict' und hat daher dasselbe Verhalten wie' dict'. –

+1

Nur eine Anmerkung: dies kann Sie oder andere später verwirren: Jeder würde erwarten, über die Schlüssel zu iterieren, und plötzlich erhalten wir hier Werte (selbst wenn Ihre Variable "Wert" genannt wird). Verwenden Sie stattdessen 'for value in d.values ​​()'; das ist ohne Zweifel klar, was vor sich geht. – Evert

+0

Ich glaube, das Schlüsselwort 'yield' und [Generators] (https://wiki.python.org/moin/Generators) sind, was Sie suchen. – Maurice

Antwort

0

Naiv, wenn alles, was Sie über eine Instanz von MyClass für Iteration wollen die Werte anstelle der Schlüssel zu erhalten, dann in MyClass definieren:

def __iter__(self): 
    return self.itervalues() 

In Python 3:

def __iter__(self): 
    return iter(self.values()) 

Aber Vorsicht! Dadurch implementiert Ihre Klasse den Vertrag von collections.MutableMapping nicht mehr, obwohl issubclass(MyClass, collections.MutableMapping) True ist. Sie könnten besser sein nicht Unterklasse dict, wenn dies das gewünschte Verhalten ist, aber stattdessen ein Attribut des Typs dict, um die Daten zu halten, und implementieren Sie nur die Funktionen und Operatoren, die Sie benötigen.

Verwandte Themen