Задача: преобразовать dict в объект и обращаться к ключам как к атрибутам.
Может кто-нибудь знает, почему этот код работает,
# -*- coding: UTF-8 -*-
class AttrInit(type):
def __call__(cls, **kwargs):
obj = super(AttrInit, cls).__call__()
for name, value in kwargs.items():
if isinstance(value, dict):
setattr(obj, name, cls(**value))
else:
setattr(obj, name, value)
return obj
class Message(object):
__metaclass__ = AttrInit
D = {'type': u'text', 'text': u'text body', 'val': {'id': {'code': 50}}}
msg = Message(**D)
print(msg.type)
print(msg.val.id.code)
а этот код, если хоть один ключ или все ключи будут типа юникод, не работает?
# -*- coding: UTF-8 -*-
class AttrInit(type):
def __call__(cls, **kwargs):
obj = super(AttrInit, cls).__call__()
for name, value in kwargs.items():
if isinstance(value, dict):
setattr(obj, name, cls(**value))
else:
setattr(obj, name, value)
return obj
class Message(object):
__metaclass__ = AttrInit
D = {u'type': u'text', u'text': u'text body', u'val': {u'id': {u'code': 50}}}
msg = Message(**D)
print(msg.type)
print(msg.val.id.code)
Выдает ошибку: TypeError: __call__() keywords must be strings