Создайте Dict как объект без использования наследования - PullRequest
0 голосов
/ 29 октября 2018

Мне нужно создать объект, который действует как dict, но я не могу использовать dict для наследования. Я хочу передать объект в массив в pandas, и метод set_value завершается ошибкой, если класс наследуется от dict с ошибкой измерения. Это означает, что мой class должен действовать как словарь, но не наследоваться от dict. Большинство примеров показывают, как это сделать, наследуя от `dict.

То, что я не знаю, как решить:

  • Если есть свойство с именем JSON, объект пытается получить значение.

Есть ли способ решить эту проблему?

###########################################################################
class BaseGeometry(object):
    _dict = None
    _ao = None
    #----------------------------------------------------------------------
    def __init__(self, iterable, **kwargs):
        if iterable is None:
            iterable = {}
        for k,v in kwargs.items():
            iterable[k] = v
        self._dict = iterable
    #----------------------------------------------------------------------
    def __str__(self):
        return str(self._dict)
    #----------------------------------------------------------------------
    __repr__ = __str__

    #----------------------------------------------------------------------
    def __getattr__(self, name):
        if name == '_dict':
            return self._dict
        elif name in {'_ao','_type', '_HASARCPY', '_HASSHAPELY',
                   '_ipython_canary_method_should_not_exist_'}:
            return self.__dict__[name]
        elif name in self._dict:
            return self._dict[name]
        else:
            raise AttributeError("No such attribute: " + name)
    #----------------------------------------------------------------------
    def __setattr__(self, name, value):
        if name == '_dict':
            self.__dict__['_dict'] = value
        elif name in {'_ao','_type', '_HASARCPY', '_HASSHAPELY',
                   '_ipython_canary_method_should_not_exist_'}:
            self.__dict__[name] = value
        else:
            self._dict[name] = value
    #----------------------------------------------------------------------
    __getitem__ = __getattr__
    #----------------------------------------------------------------------
    __setitem__ = __setattr__
    #----------------------------------------------------------------------
    def __delattr__(self, name):
        if name in self._dict:
            del self._dict[name]
        else:
            raise AttributeError("No such attribute: " + name)
    #----------------------------------------------------------------------
    def __iter__(self):
        for k,v in self._dict.items():
            yield k,v

ОБНОВЛЕНИЕ: СООБЩЕНИЕ ОБ ОШИБКЕ

builtins.ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Это вызвано тем, что панды проверяют if. Если это объект, а не dict, он работает.

Я также получаю эту ошибку:

builtins.ValueError: cannot set using a list-like indexer with a different length than the value

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