Python 2.5 версия этого метода - PullRequest
       3

Python 2.5 версия этого метода

1 голос
/ 20 февраля 2011

У меня нижеуказанная функция работает нормально на Python 2.6, но производственная среда appengine составляет 2,5, и она взорвалась:

AttributeError: у объекта 'module' нет атрибута 'Mapping'

У кого-нибудь есть решение для 2.5?

Спасибо

Chris

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 ]

3 голосов
/ 20 февраля 2011

Попробуйте заменить

isinstance(val, collections.Mapping)

с

isinstance(val, dict)
1 голос
/ 20 февраля 2011

Функция никогда не получит параметр, который является экземпляром Mapping, потому что этот класс отсутствует в Python 2.5. Просто замените эту строку на return val.

Это предполагает, что ни один из вашего другого кода не использует Mapping или его подкласс. Если вы на самом деле используете его, вам придется придумать замену.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...