Wie __getitem__ auf mehrdimensionale Arrays anwenden?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
andi_wand
User
Beiträge: 37
Registriert: Samstag 3. Dezember 2011, 17:04

Hallo,
nachdem ich per Google leider nichts gefunden habe, stelle ich hier mal die Frage rein:
Ich habe eine Klasse, die ihre Daten in einem zweidimensionalen Array speichert. Nun soll alleine durch Eingabe von

Code: Alles auswählen

m[x,y]
das Datum an der Stelle (x,y) ausgegeben werden. Dazu wollte ich __getitem__ verwenden, habe jetzt jedoch das Problem, dass ich nicht weiß, wie ich diese Funktion für mehrdimensionale Arrays anwenden kann.
Für eindimensionale Arrays funktioniert das ganze.
Der Code für die Funktion:

Code: Alles auswählen

def __getitem__(self,row,column):
        print self.maze_Rows[row][column]
Aufruf mit:

Code: Alles auswählen

m[3,2]
Jedoch gibt mir Python dann den Fehler zurück:

Code: Alles auswählen

TypeError: __getitem__() takes exactly 3 arguments (2 given)
Per direktem Aufruf (also

Code: Alles auswählen

m.__getitem__(3,2)
) geht das jedoch.
Wie kann ich also das Problem lösen?
Vielen Dank für Antworten
andi_wand
User
Beiträge: 37
Registriert: Samstag 3. Dezember 2011, 17:04

EDIT: Sorry, hat sich erledigt, habs gerade selbst gelöst.
Danke
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Schreibe bitte, *wie* du das Problem gelöst hast. Andere haben genau das gleiche Problem und finden mittels Google hierher und sehen nur "hat sich erledigt". Ich vermute, dass du die Funktionssignatur angepasst hast, also

Code: Alles auswählen

def __getitem__(self, (row, column)):
    print self.maze_Rows[row][column]
oder

Code: Alles auswählen

def __getitem__(self, item):
    row, column = item
    print self.maze_Rows[row][column]
Wobei letzteres zu bevorzugen ist, weil ersteres ab einer bestimmten Python-Version nicht mehr unterstützt wird (habe vergessen, welche es war, vielleicht 3.0?).
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Ich würde von `__getitem__` auch erwarten, dass das Element zurückgegeben wird:

Code: Alles auswählen

def __getitem__(self, item):
    row, column = item
    return self.maze_Rows[row][column]
Grüße
Gerrit
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Natürlich, hatte da wohl ne Art Tunnelblick :oops:
andi_wand
User
Beiträge: 37
Registriert: Samstag 3. Dezember 2011, 17:04

Meine Lösung war:

Code: Alles auswählen

 def __getitem__(self,args):
        print self.maze_Rows[args[0]][args[1]]
Antworten