Можно использовать более одного аргумента на __getitem__?
Я пытаюсь использовать
__getitem__(self, x, y):
в моем классе Matrix, но мне кажется, что он не работает (я до сих пор не очень хорошо знаю python).
Я называю это следующим образом:
print matrix[0,0]
Возможно ли вообще использовать более одного аргумента? Благодарю. Может быть, я могу использовать только один аргумент, но передать его как кортеж?
Ответы
Ответ 1
__getitem__
принимает только один аргумент (кроме self
), поэтому вы получаете кортеж.
Вы можете сделать это:
class matrix:
def __getitem__(self, pos):
x,y = pos
return "fetching %s, %s" % (x, y)
m = matrix()
print m[1,2]
выходы
fetching 1, 2
См. документацию для object.__getitem__
для получения дополнительной информации.
Ответ 2
Действительно, когда вы выполняете bla[x,y]
, вы вызываете type(bla).__getitem__(bla, (x, y))
- Python автоматически формирует кортеж для вас и передает его на __getitem__
в качестве второго аргумента (первым из которых является его self
), Нет никакого хорошего способа [1] чтобы выразить, что __getitem__
хочет больше аргументов, но также не нужно.
[1] В Python 2.*
вы можете фактически дать __getitem__
автоматически распаковывающуюся подпись, которая поднимет ValueError
или TypeError
, когда вы индексируете слишком много или слишком несколько индексов...:
>>> class X(object):
... def __getitem__(self, (x, y)): return x, y
...
>>> x = X()
>>> x[23, 45]
(23, 45)
Является ли этот "хороший способ" спорным... он был устаревшим в Python 3, поэтому вы можете сделать вывод, что Гвидо не считал это хорошим при длительном размышлении;-). Выполнение вашей собственной распаковки (одного аргумента в подписи) не имеет большого значения и позволяет вам предоставлять более ясные ошибки (и однородные, а не разные типы для очень похожей ошибки индексации такого экземпляра с 1 vs, скажем, 3 индекса; -).
Ответ 3
Нет, __getitem__
просто принимает один аргумент (в дополнение к self
). В случае matrix[0, 0]
аргумент является кортежем (0, 0)
.