0

我需要__reverse__为我在 App Engine 上部署的类提供一个自定义函数,因此它需要与Python 2.5. __future__我可以使用导入或解决方法吗?

子类list化不起作用,因为我需要我的类是dict.

编辑

使用OrderedDict不会解决问题,因为钥匙和物品dict不一样。list

这是我要创建的对象:

  1. 我的对象需要提供与 a 相同的属性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,我的问题就解决了。

4

2 回答 2

2

__reversed__2.5 中不支持,因此如果您确实需要自定义收藏的相反顺序,您唯一的选择是修改您调用的位置reversed以使用其他内容。

但我很好奇:如果你是 subclassing dict,那么项目的顺序无论如何都是任意的,那么在这种情况下 reversed 是什么意思?

于 2010-10-16T14:10:54.760 回答
1

创建自定义__reversed__只能从 2.6 开始,因此您不能简单地实现它并reversed在 2.5 中工作。reversed但是,在 2.5 及以下版本中,您可以通过实现序列协议(即同时实现__len__和)使您的自定义类仍然可以使用__getitem__

另一种可能性是将内置函数替换为以reversed不同方式对待您的自定义类的自定义函数。这可以像这样工作:

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

但是,我不建议这样做,因为它会改变内置函数的正常行为(显然)并且可能会使其他用户感到困惑。所以您应该实现 sequnce 协议以使其reversed正常工作。

于 2010-10-16T14:13:01.183 回答