Python 2.5版本的这种方法

时间:2011-02-20 15:42:33

标签: python google-app-engine

我在python 2.6上运行了以下函数,但是appengine的生产环境是2.5并且它会爆炸:

AttributeError:'module'对象没有属性'Mapping'

有没有人有2.5的解决方案?

由于

克里斯

import types, collections

class AttrDict(dict):
    '''AttrDict - dict with JS-like key=attr access'''
    def __init__(self, *argz, **kwz):
        if len(argz) == 1 and not kwz and isinstance(argz[0], types.StringTypes):
            super(AttrDict, self).__init__(open(argz[0]))
        else:
            super(AttrDict, self).__init__(*argz, **kwz)
            for k,v in self.iteritems(): setattr(self, k, v) # re-construct all values via factory

    def __val_factory(self, val):
        return AttrDict(val) if isinstance(val, collections.Mapping) else val

    def __getattr__(self, k):
        return super(AttrDict, self).__getitem__(k)
        __getitem__ = __getattr__

    def __setattr__(self, k, v):
        return super(AttrDict, self).__setitem__(k, self.__val_factory(v))
        __setitem__ = __setattr__

2 个答案:

答案 0 :(得分:3)

尝试替换

isinstance(val, collections.Mapping)

isinstance(val, dict)

答案 1 :(得分:1)

该函数永远不会获得一个Mapping实例的参数,因为该类不在python 2.5中。只需将该行替换为return val

这假设您的其他代码都没有使用Mapping或其子类。如果你真的在使用它,你将不得不想出一个替代品。