Wie unterscheidet sich der Mitgliedschaftstest für eine Liste und einen Satz?

8

Ich habe Probleme herauszufinden, warum die erste dieser Behauptungen in Ordnung ist und die zweite einen Fehler verursacht.

%Vor%

Hier ist der Fehler:

%Vor%

Der Test auf Gleichheit in der Subject-Klasse ist einfach self.name == other.name , und in einem anderen UnitTest verifiziere ich das Subject("A") == Subject("A") . Ich kann wirklich nicht herausfinden, warum das Thema in der Liste und nicht im Set ist. Idealerweise hätte ich gerne das Thema in beiden.

    
rtclay 08.03.2011, 09:23
quelle

4 Antworten

11

Der Ausdruck

%Vor%

vergleicht Subject("A") mit jedem Eintrag in subject_list mit der Methode Subject.__eq__() . Wenn diese Methode nicht überschrieben wird, gibt sie standardmäßig immer False zurück, es sei denn, die beiden Operanden sind das gleiche Objekt . Der obige Ausdruck würde immer False zurückgeben, wenn Subject keine __eq__() -Methode hat, da Subject("A") eine neue Instanz ist, die nicht schon in der Liste sein kann.

Der Ausdruck

%Vor%

dagegen wird Subject.__hash__() zuerst verwenden, um den richtigen Bucket zu finden, und erst anschließend Subject.__eq__() . Wenn Sie Subject.__hash__() nicht auf eine Weise definiert haben, die mit Subject.__eq__() kompatibel ist, schlägt dies fehl.

    
Sven Marnach 08.03.2011, 09:29
quelle
4

Die Mitgliedschaft in einer Gruppe hängt auch vom Hash des Objekts ab. Daher müssen Sie die Methode __hash__() für die Klasse entsprechend implementieren.

    
Ignacio Vazquez-Abrams 08.03.2011 09:29
quelle
3

Entweder haben Sie keine __hash__() -Methode in Ihrer Subject -Klasse oder sie ist zweideutig. Versuchen Sie Folgendes:

%Vor%

Die Dokumente sind hier .

    
John Machin 08.03.2011 09:28
quelle
2

Um diese in einem Set zu verwenden, müssen Sie sicherstellen, dass Subject ordnungsgemäß hashbar ist. Wenn Sie __hash__ nicht selbst definieren, wird einfach die id verwendet, und das ist für verschiedene Instanzen unterschiedlich. __hash__ sollte so definiert werden, dass gleiche Objekte gleiche Hashes haben.

    
Björn Pollex 08.03.2011 09:28
quelle

Tags und Links