LINUX.ORG.RU

python: hash2object


0

0

Чую, что уже было до меня, но выгуглить и выman'ить не могу.

Нужен способ двустороннего преобразования хэша в объект и обратно. Включая вложенность.

Т.е. к хэшу типа h = {'user' : 'anonymous', 'email' : 'anonymous@example.com'} я хочу обращаться типа так h.user, h.email.

А потом, после всех манипуляций, снова получить это как хэш (для передачи/сохранения).

Понятно, что реализуется это на коленке за 5 минут, но вроде бы где-то даже встречал в родной документации, да потерял.

★★★★★

>>> h = {'user' : 'anonymous', 'email' : 'anonymous@example.com'}
>>> class odict(dict):
...  def __getattr__(self, key): return self.get(key)
... 
>>> oh = odict(h)
>>> oh.user
'anonymous'
>>> oh.email
'anonymous@example.com'
>>> oh['user']
'anonymous'
>>> oh['email']
'anonymous@example.com'
>>> 

Не то?

nnkd
()
Ответ на: комментарий от nnkd

А если принципиален новый объект не наследник dict, то только такие костыли в голову приходят:

>>> def _gethash(self):
...     l = [x for x in dir(self) if not x.startswith('_')]
...     hash = {}
...     for x in l: hash[x] = getattr(self, x)
...     return hash
... 
>>> h
{'user': 'anonymous', 'email': 'anonymous@example.com'}
>>> nh = h
>>> nh.update({'_gethash': _gethash})
>>> X = type('X', (), nh)
>>> X().user
'anonymous'
>>> X().email
'anonymous@example.com'
>>> X()._gethash()
{'email': 'anonymous@example.com', 'user': 'anonymous'}
>>> 

Или же:
>>> import sys
>>> class Obj(object): 
...     sys._getframe().f_locals.update(h)
...     def _gethash(self):
...         l = [x for x in dir(self) if not x.startswith('_')]
...         hash = {}
...         for x in l: hash[x] = getattr(self, x)
...         return hash
... 
>>> Obj()._gethash()
{'email': 'anonymous@example.com', 'user': 'anonymous'}
>>> Obj().email
'anonymous@example.com'

nnkd
()

>(для передачи/сохранения).

а json там и прочее? кажется, что это велосипедостроительство

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

Это и есть для json'а и прочего. Вот только simplejson.loads() выдаст мне не объект, а хэш, а мне удобнее (просто синтаксис чище) как к свойствам объекта обращаться.

AngryElf ★★★★★
() автор топика
Ответ на: комментарий от nnkd

> А если принципиален новый объект не наследник dict, то только такие костыли в голову приходят:

Нет, не принципиально. Принципиально юзать уже существующее. В идеале - базовую библиотеку. Но если такого нету, буду делать сам.

AngryElf ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.