ビリャチピスデツナフイ Войти !bnw Сегодня Клубы

Оперативный ответ на #4EM8F6/KK5

Дунно, не видел в доках, но

echo -e 'class M(object):\n  def __getitem__(self, key):\n    key_type = type(key)\n    if not isinstance(key, tuple): key = (key,)\n    print("M()[{}] => {}   sum: {}".format(", ".join(map(str, key)) if isinstance(key, tuple) else key, key_type, sum(key)))\n\nM()[1]\nM()[1, 2, 3]' | python
M()[1] => <type 'int'>   sum: 1
M()[1, 2, 3] => <type 'tuple'>   sum: 6
#6DL1NT / @4077 / 1636 дней назад

живи, псачи
#6DL1NT/P8J / @anonymous / 1636 дней назад

забыл выкинуть if isinstance(key, tuple) else key

#6DL1NT/QQT / @4077 / 1636 дней назад
тфв когда кто-то говорит что echo, cat и sed это не текстовые редакторы (неосиляторы, только и имеют что вимом с емаксом пользоваться)
#6DL1NT/CJJ / @mugiseyebrows / 1636 дней назад
я не знаю, на что ты ответил, но я тот славик и я нашёл в доках поддержку слайсов у этого метода, а у тебя какая-то хуйня
#6DL1NT/X3P / @anonymous / 1636 дней назад

@anonymous А слайсы тут при чём? Со слайсами-то понятно. В #4EM8F6 было про использование нескольких объектов в качестве индекса, при котором эти несколько объектов собираются (как оператором *, но с нюансом, если объект один) в кортеж. В доках про это нет:

object.getitem(self, key)

Called to implement evaluation of self[key]. For sequence types, the accepted keys should be integers and slice objects. Note that the special interpretation of negative indexes (if the class wishes to emulate a sequence type) is up to the __getitem__() method. If key is of an inappropriate type, TypeError may be raised; if of a value outside the set of indexes for the sequence (after any special interpretation of negative values), IndexError should be raised. For mapping types, if key is missing (not in the container), KeyError should be raised.

Ещё раз — пост был о том, что obj[1, 2, 3] эквивалентен obj[(1, 2, 3)].

Имитация с обычным (на самом деле magic, но не суть) методом и *:

class Indexr:

    def __call__(self, *key):
        if len(key) == 1:
            key = key[0]
        print(type(key), key)

    def __getitem__(self, key):
        print(type(key), key)


indexr = Indexr()
indexr[3]
indexr(3)
indexr[3, 5, 7]
indexr[(3, 5, 7)]
indexr(3, 5, 7)
indexr((3, 5, 7))
<class 'int'> 3
<class 'int'> 3
<class 'tuple'> (3, 5, 7)
<class 'tuple'> (3, 5, 7)
<class 'tuple'> (3, 5, 7)
<class 'tuple'> (3, 5, 7)
#6DL1NT/15D / @4077 --> #6DL1NT/X3P / 1636 дней назад

@anonymous А ещё их можно использовать вместе:

class Str(str):

    def __getitem__(self, keys):
        if not isinstance(keys, tuple):
            return self.rawget(keys)
        return ''.join(self.rawget(key) for key in keys)

    def rawget(self, key):
        return super(Str, self).__getitem__(key)


s = Str("WAZZUP BNWACH")
print(s)
print(s[7])
print(s[3, 5, 7])
print(s[1:10:2])
print(s[2:4, 5, 7::2, -1, -1])
#6DL1NT/TAK / @4077 --> #6DL1NT/X3P / 1636 дней назад
@4077 лан // сорь, лень читать чо ты там пишешь
#6DL1NT/SKK / @anonymous --> #6DL1NT/TAK / 1635 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.