Подтвердить что ты не робот

Можно использовать более одного аргумента на __getitem__?

Я пытаюсь использовать

__getitem__(self, x, y):

в моем классе Matrix, но мне кажется, что он не работает (я до сих пор не очень хорошо знаю python). Я называю это следующим образом:

print matrix[0,0]

Возможно ли вообще использовать более одного аргумента? Благодарю. Может быть, я могу использовать только один аргумент, но передать его как кортеж?

4b9b3361

Ответ 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).