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 ;-).
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 . –
@Laurence, sí - complicado y muy raramente usado -> ¡no es bueno! -) –
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