¿Hay una forma más limpia de usar una matriz bidimensional?

Estoy tratando de hacer una clase de matriz 2D, y encontré un problema. La mejor manera de resolverlo fue pasar Get / setitem una tupla de índices y desempaquetarlos en la función. Desafortunadamente, sin embargo, la implementación se ve muy desordenada:

class DDArray: data = [9,8,7,6,5,4,3,2,1,0] def __getitem__ (self, index): return (self.data [index [0]], self.data [index [1]]) def __setitem__ (self, index, value): self.data [index [0]] = value self.data [index [1]] = value test = DDArray () print (test [(1,2)]) test [(1, 2)] = 120 print (test [1, 2]) 

Intenté simplemente aceptar más parámetros:

 class DDArray: data = [9,8,7,6,5,4,3,2,1,0] def __getitem__ (self, index1, index2): return (self.data [index1], self.data [index2]) def __setitem__ (self, index1, index2, value): self.data [index1] = value self.data [index2] = value test = DDArray () print (test [1, 2]) test [1, 2] = 120 print (test [1, 2]) 

pero eso resulta en un error de tipo extraño que me dice que no estoy pasando suficientes argumentos (supongo que cualquier cosa dentro del operador del subíndice se considera 1 argumento, incluso si hay una coma).

(Sí, lo sé, la clase anterior no es en realidad una matriz 2D. Quería que los operadores se dieran cuenta antes de pasar a convertirlo en 2D).

¿Hay una forma estándar de hacerlo que se vea un poco más limpia? Gracias

Hay un par de maneras en que puedes hacer esto. Si desea una syntax como test[1][2] , entonces puede hacer que __getitem__ devuelva una columna (o fila), que puede ser indexada nuevamente con __getitem__ (o incluso simplemente devolver una lista).

Sin embargo, si desea la test[1,2] syntax test[1,2] , está en el camino correcto, la test[1,2] realidad pasa la tupla (1,2) a la función __getitem__ , por lo que no necesita incluir la paréntesis al llamarlo.

Puede hacer que las implementaciones __getitem__ y __setitem__ un poco menos complicadas, así:

 def __getitem__(self, indices): i, j = indices return (self.data[i], self.data[j]) 

con su implementación real de __getitem__ por supuesto. El punto es que ha dividido la tupla de índices en variables con nombres apropiados.