Rzeczywiście, podczas wykonywania bla[x,y]
, dzwonisz type(bla).__getitem__(bla, (x, y))
- Python automatycznie form krotkę dla ciebie i przekazuje ją jako __getitem__
jako drugi argument (pierwszy to jego self
). Nie ma dobrego sposobu, aby [1] wyrazić, że __getitem__
chce więcej argumentów, ale także nie ma potrzeby.
[1] W Pythonie 2.*
rzeczywiście można dać __getitem__
auto-rozpakowywania podpis, który podniesie ValueError
lub TypeError
kiedy indeksowanie zbyt wiele lub zbyt mało indeksów .. .:
>>> class X(object):
... def __getitem__(self, (x, y)): return x, y
...
>>> x = X()
>>> x[23, 45]
(23, 45)
czy to „dobra droga” jest dyskusyjny ... to już przestarzałe w Pythonie 3 więc można wnioskować, że nie zrobił Guido uważaj na to dobre po długiej refleksji ;-). Wykonanie własnego rozpakowania (pojedynczego argumentu w podpisie) nie jest wielkim problemem i pozwala zapewnić wyraźniejsze błędy (i jednolite, a nie różne typy dla bardzo podobnego błędu indeksowania takiej instancji za pomocą 1 na przykład, powiedzmy, 3 indeksy ;-).
Moja wiedza na temat porzucania rozpakowywania argumentów w 3.x nie była taka, że "Guido nie uważał tego za dobre", ale więcej, że prawie nikt nie wiedział, że funkcja istniała nawet w tym języku i znacznie komplikowała kompilator . –
@Laurence, yep - skomplikowane i bardzo rzadko używane -> niedobrze! -) –
Używałem go regularnie i było całkiem przyjemnie, ale problem polegał na tym, że skomplikowane odbicie. Będę tęsknił głównie za jej użyciem w funkcjach lambda. – Casebash