Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 31, 2011 18:41:05

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

названия атрибутов должны быть типа str
Какая версия питона?



Офлайн

#2 Янв. 31, 2011 18:52:26

pikhovkin
От:
Зарегистрирован: 2010-10-08
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

Zubchick
названия атрибутов должны быть типа str
Какая версия питона?
Python 2.6
Насчет типа атрибутов: т.к. первый кусок кода работает, то да, ключи должны быть типа str. Но тогда как в вышеприведенном коде отследить unicode и преобразовать его в str?



Офлайн

#3 Янв. 31, 2011 19:55:05

certanista
От:
Зарегистрирован: 2010-10-28
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

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



Офлайн

#4 Фев. 1, 2011 00:05:00

pikhovkin
От:
Зарегистрирован: 2010-10-08
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

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"
но какой-то он громоздкий.
И все равно хочу знать, почему тот код, который я привел, не работает, если ключи в юникоде?



Офлайн

#5 Фев. 1, 2011 08:01:25

certanista
От:
Зарегистрирован: 2010-10-28
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

Я имел в виду заменить

setattr(obj, name, value)
В предыдущем примере на
setattr(obj, str(name), value)
Должно заработать.



Офлайн

#6 Фев. 1, 2011 11:38:44

pikhovkin
От:
Зарегистрирован: 2010-10-08
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

certanista
В предыдущем примере на
Код:

setattr(obj, str(name), value)

Должно заработать.
Прежде, чем писать такое, стоило бы проверить свои догадки.



Офлайн

#7 Фев. 1, 2011 12:28:50

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

преобразовать dict в объект

Обновите питон: http://bugs.python.org/issue2646



Офлайн

#8 Фев. 1, 2011 12:59:55

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

Неужели доступ к объектам класса, происходит так же медленно как и к значениям в словаре???
Я то наивный полагал, что если ты объявил переменную (объект) в классе, то доступ к ней осуществляется, по фиксированному смещению в сегменте данных (кто ассемблер помнит). Я всё никак не могу привыкнуть что это интерпретатор :(



Офлайн

#9 Фев. 1, 2011 14:12:48

certanista
От:
Зарегистрирован: 2010-10-28
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

pikhovkin
certanista
В предыдущем примере на
Код:

setattr(obj, str(name), value)

Должно заработать.
Прежде, чем писать такое, стоило бы проверить свои догадки.
Проверил, работает. Более того, у меня и без str() работает.
Чуть повыше инетерпретатор обновить посоветовали.



Офлайн

#10 Фев. 1, 2011 19:04:50

pikhovkin
От:
Зарегистрирован: 2010-10-08
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

преобразовать dict в объект

certanista
Обновите питон: http://bugs.python.org/issue2646
certanista
Проверил, работает. Более того, у меня и без str() работает.
Чуть повыше инетерпретатор обновить посоветовали.
С ума сойти! Обновился с 2.6.4 на 2.6.6 - заработало.
Всем спасибо!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version