Переопределить обратное (...) в Python 2.5 - PullRequest
0 голосов
/ 16 октября 2010

Мне нужна пользовательская функция __reverse__ для моего класса, которую я развертываю на App Engine, поэтому она должна работать с Python 2.5. Можно ли использовать __future__ импорт или обходной путь?

Подклассы list не будут работать, так как мне нужно, чтобы мой класс был подклассом dict.

EDIT :

Использование OrderedDict не решит проблемы, поскольку клавиши dict не совпадают с ключами list.

Это объект, который я пытаюсь создать:

  1. Мой объект должен предоставлять те же атрибуты, что и list, то есть поддержка iter(obj) и reverse(obj).

  2. Элементы должны быть экземплярами специального стороннего класса.

  3. Каждый элемент связан с ключом.

  4. Внутренне, необходимо получить доступ к этим объектам, используя их ключи. Вот почему я поместил их в карту.

Я пересмотрел свою реализацию на list подкласс вместо dict подкласса, так что вот что у меня сейчас:

class Foo(list):

   pat = {}

   def __init__(self):
       for app in APPS:  # these are strings
           obj = SpecialClass(app)
           self.append(obj)
           self.pat[app] = obj

   def __getitem__(self, item):

       # Use object as a list
       if isinstance(item, int):
           return super(Foo, self).__getitem__(item)

       # Use object as a dict
       if item not in self.pat:
           # Never raise a KeyError
           self.pat[item] = SpecialClass(None)
       return self.pat[item]

   def __setitem__(self, item, value):
       if isinstance(item, int):
           return self.pat.__setitem__(item, value)
       return super(Foo).__setitem__(item, value)

РЕДАКТИРОВАТЬ 2:

Теперь, когда мой класс является подклассом list, моя проблема решена.

Ответы [ 2 ]

2 голосов
/ 16 октября 2010

__reversed__ не поддерживается в 2.5, поэтому ваш единственный вариант, если вам действительно нужно настроить обратный порядок вашей коллекции, - это изменить места, которые вы называете reversed, чтобы использовать что-то еще.

Но мне любопытно: если вы подклассифицируете dict, то порядок элементов в любом случае произвольный, так что же означает обратное в этом случае?

1 голос
/ 16 октября 2010

Создание пользовательского __reversed__ возможно только с версии 2.6, поэтому вы не можете просто реализовать это, и reversed работает в версии 2.5.В версии 2.5 и ниже вы можете заставить свой пользовательский класс по-прежнему работать с reversed, реализовав протокол последовательности (т. Е. Реализовать оба __len__ и __getitem__).

Другой возможностью будет заменитьвстроенная функция reversed с пользовательской функцией, которая обрабатывает ваш пользовательский класс по-разному.Это может работать так:

originalReversed = reversed
def myReversed ( seq ):
    if isinstance( seq, MyCustomClass ):
        # do something special
    else:
        return originalReversed( seq )
reversed = myReversed

Однако я бы не рекомендовал это, поскольку это меняет нормальное поведение встроенных функций (очевидно) и может запутать других пользователей.протокол секвенции для обеспечения работы reversed.

...