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 ;-).
fonte
2009-11-06 04:37:41
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 . –
@Laurence, sì - complicato e molto usato raramente -> non buono! -) –
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