Найти - Пользователи
Полная версия: преобразовать dict в объект
Начало » Python для экспертов » преобразовать dict в объект
1 2
Zubchick
названия атрибутов должны быть типа str
Какая версия питона?
pikhovkin
Zubchick
названия атрибутов должны быть типа str
Какая версия питона?
Python 2.6
Насчет типа атрибутов: т.к. первый кусок кода работает, то да, ключи должны быть типа str. Но тогда как в вышеприведенном коде отследить unicode и преобразовать его в str?
certanista
pikhovkin
Zubchick
названия атрибутов должны быть типа str
Какая версия питона?
Python 2.6
Насчет типа атрибутов: т.к. первый кусок кода работает, то да, ключи должны быть типа str. Но тогда как в вышеприведенном коде отследить unicode и преобразовать его в str?
А зачем отслеживать? Если str() к простой строке применить, то ничего за это не будет.
pikhovkin
certanista
А зачем отслеживать? Если str() к простой строке применить, то ничего за это не будет.
Код в студию!

Нашел вот такой код, который решает мою задачу,
class dict2obj(dict):
def __init__(self, dict_):
super(dict2obj, self).__init__(dict_)
for key in self:
item = self[key]
if isinstance(item, list):
for idx, it in enumerate(item):
if isinstance(it, dict):
item[idx] = dict2obj(it)
elif isinstance(item, dict):
self[key] = dict2obj(item)

def __getattr__(self, key):
return self[key]

d = {'a': 1, 'b': {'c': 2}, 'd': ["hi", {'foo': "bar"}]}

x = dict2obj(d)

assert x.a == x['a'] == 1
assert x.b.c == x['b']['c'] == 2
assert x.d[1].foo == x['d'][1]['foo'] == "bar"
но какой-то он громоздкий.
И все равно хочу знать, почему тот код, который я привел, не работает, если ключи в юникоде?
certanista
Я имел в виду заменить
setattr(obj, name, value)
В предыдущем примере на
setattr(obj, str(name), value)
Должно заработать.
pikhovkin
certanista
В предыдущем примере на
Код:

setattr(obj, str(name), value)

Должно заработать.
Прежде, чем писать такое, стоило бы проверить свои догадки.
Андрей Светлов
Обновите питон: http://bugs.python.org/issue2646
alexx11
Неужели доступ к объектам класса, происходит так же медленно как и к значениям в словаре???
Я то наивный полагал, что если ты объявил переменную (объект) в классе, то доступ к ней осуществляется, по фиксированному смещению в сегменте данных (кто ассемблер помнит). Я всё никак не могу привыкнуть что это интерпретатор :(
certanista
pikhovkin
certanista
В предыдущем примере на
Код:

setattr(obj, str(name), value)

Должно заработать.
Прежде, чем писать такое, стоило бы проверить свои догадки.
Проверил, работает. Более того, у меня и без str() работает.
Чуть повыше инетерпретатор обновить посоветовали.
pikhovkin
certanista
Обновите питон: http://bugs.python.org/issue2646
certanista
Проверил, работает. Более того, у меня и без str() работает.
Чуть повыше инетерпретатор обновить посоветовали.
С ума сойти! Обновился с 2.6.4 на 2.6.6 - заработало.
Всем спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB