2009-11-06 14 views
18

Sto cercando di utilizzareÈ possibile utilizzare più di un argomento su __getitem__?

__getitem__(self, x, y): 

sulla mia classe Matrix, ma mi sembra che non funziona (io ancora non so molto bene a usare Python). sto chiamando in questo modo:

print matrix[0,0] 

E 'possibile a tutti di utilizzare più di un argomento? Grazie. Forse posso usare solo un argomento ma passarlo come una tupla?

risposta

34

__getitem__ accetta solo un argomento (diverso da self), quindi si ottiene una tupla.

Si può fare questo:

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

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

uscite

fetching 1, 2 

Vedi http://docs.python.org/reference/datamodel.html#object.getitem per ulteriori informazioni

3

No, __getitem__ prende solo un argomento (oltre a self). Nel caso di matrix[0, 0], l'argomento è la tupla (0, 0).

21

In effetti, quando si esegue bla[x,y], si sta chiamando type(bla).__getitem__(bla, (x, y)) - Python forme automaticamente la tupla per te e la passa a __getitem__ come secondo argomento (il primo è il suo self). Non c'è un buon modo [1] per esprimere che __getitem__ vuole più argomenti, ma anche non è necessario.



[1] In Python 2.* si può effettivamente dare __getitem__ una firma automatica disimballaggio che consentirà di accrescere ValueError o TypeError quando sei l'indicizzazione con troppi o troppo pochi indici .. .:

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

Se questo è "un buon modo" è discutibile ... è stato deprecato in Python 3 in modo da poter dedurre che Guido didn lo considero buono a lungo riflesso ;-). Fare la tua decompressione (di un singolo argomento nella firma) non è un grosso problema e ti consente di fornire errori più chiari (e uniformi, piuttosto che di tipi diversi per l'errore molto simile di indicizzare una tale istanza con 1 vs, diciamo, 3 indici ;-).

+0

La mia comprensione della deprecazione dell'argomento di spacchettamento in 3.x non era tanto che "Guido non lo considerava buono", ma quasi nessuno sapeva che la funzione esistesse persino nella lingua, e complicò notevolmente il compilatore . –

+0

@Laurence, sì - complicato e molto usato raramente -> non buono! -) –

+2

L'ho usato regolarmente ed è stato abbastanza bello, ma il problema era che complicava la riflessione. Mi mancherà principalmente per il suo uso nelle funzioni lambda – Casebash

Problemi correlati