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

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

__getitem__(self, x, y):

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

print matrix[0,0]

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

Ответы на вопрос(3)

bla[x,y], вы'повторный звонокtype(bla).__getitem__(bla, (x, y)) - Python автоматически формирует для вас кортеж и передает его__getitem__ в качестве второго аргумента (первый из которых является егоself). Там'нет хорошего пути[1] выразить это__getitem__ хочет больше аргументов, но и не нужно.



[1] В питоне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 против, скажем, 3 показателя ;-).

 Laurence Gonsalves06 нояб. 2009 г., 06:01
Мое понимание неуместности распаковки аргументов в 3.x было не настолькоГвидо не сделалне считаю это хорошим "Более того, вряд ли кто-то знал, что эта функция существует в языке, и это значительно усложняло компилятор.
 Casebash08 нояб. 2009 г., 01:53
Я регулярно использовал это, и это было довольно хорошо, но проблема заключалась в том, что это усложняло размышление. Я'в основном буду скучать по его использованию в лямбда-функциях
 Alex Martelli06 нояб. 2009 г., 06:03
@Laurence, да - сложный и очень редко используется -> нехорошо!-)
 CodeMode17 дек. 2014 г., 16:08
Мне нравится эта реализация. Это дает вам представление о формате ожидаемого кортежа. Раскачать
 IAbstract17 февр. 2016 г., 12:54
Я согласен с @Casebash. Я пришел из C # /. Net, где разрешены вторичные (третичные и т. Д.) Параметры. Усложнение компилятора не обязательно является допустимым аргументом, поскольку это, по сути, еще один способ сказать:боль в шее, чтобы поддерживать ". Осведомленность о функции заключается в обучении пользователя тому, что доступно вящик для инструментов" так сказать. Надежные языки обычно имеют некоторыеболь в шее" функции, и не каждый разработчик будет знать (или когда-либо нужно использовать) некоторые функции. Таким образом, мы должны с помощью этих аргументов сократить язык до того, что обычный программист знает и использует на регулярной основе.
Решение Вопроса

__getitem__ принимает только один аргумент (кроме себя), поэтому вы получаете кортеж.

Вы можете сделать это:

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

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

выходы

fetching 1, 2

Увидетьhttp://docs.python.org/reference/datamodel.html#object.GetItem для дополнительной информации

__getitem__ просто принимает один аргумент (в дополнение кself). В случаеmatrix[0, 0]Аргумент - это кортеж.(0, 0)

Ваш ответ на вопрос