2009-11-06 4 views
18

estoy tratando de utilizarPosible usar más de un argumento en __getitem__?

__getitem__(self, x, y): 

en mi clase Matrix, pero me parece que no funciona (todavía no sé muy bien a usar Python). La llamo así:

print matrix[0,0] 

¿Es posible en absoluto a utilizar más de un argumento? Gracias. ¿Tal vez puedo usar solo un argumento, pero pasarlo como una tupla?

Respuesta

34

__getitem__ solo acepta un argumento (que no sea uno mismo), por lo que se le pasa una tupla.

Usted puede hacer esto:

class matrix: 
    def __getitem__(self, pos): 
     x,y = pos 
     return "fetching %s, %s" % (x, y) 

m = matrix() 
print m[1,2] 

salidas

fetching 1, 2 

Ver http://docs.python.org/reference/datamodel.html#object.getitem para más información

3

No, __getitem__ solo toma un argumento (además de self). En el caso de matrix[0, 0], el argumento es la tupla (0, 0).

21

De hecho, cuando se ejecuta bla[x,y], que está llamando type(bla).__getitem__(bla, (x, y)) - Python automáticamente formularios la tupla para usted y la pasa a __getitem__ como el segundo argumento (siendo el primero su self). No hay una buena forma de [1] para expresar que __getitem__ quiere más argumentos, pero tampoco es necesario.



[1] En Python 2.* en realidad se puede dar __getitem__ una firma automática-desembalaje lo que elevará ValueError o TypeError cuando se está indexando con demasiados o demasiado pocos índices .. .:

>>> class X(object): 
... def __getitem__(self, (x, y)): return x, y 
... 
>>> x = X() 
>>> x[23, 45] 
(23, 45) 

Si eso es "una buena manera" es discutible ... ha sido desaprobado en Python 3 para que pueda inferir que Guido didn 't considerarlo bueno a largo reflejo ;-). Hacer su propio desembalaje (de un solo argumento en la firma) no es gran cosa y le permite proporcionar errores más claros (y uniformes, en lugar de los de diferentes tipos para el error muy similar de indexar tal instancia con 1 vs, por ejemplo, 3 índices ;-).

+0

Mi comprensión sobre la desaprobación del desempaquetado de argumentos en 3.x no era tanto que "Guido no lo considerara bueno", sino que casi nadie sabía que la característica existía en el lenguaje, y complicaba significativamente el compilador . –

+0

@Laurence, sí - complicado y muy raramente usado -> ¡no es bueno! -) –

+2

Lo usé con regularidad y fue bastante agradable, pero el problema era que complicaba la reflexión. Lo voy a extrañar principalmente por su uso en funciones lambda – Casebash

Cuestiones relacionadas