Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> словарь и ключ-объект 
V
    Опции темы
uranpro
Дата 25.2.2011, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



Добрый день!
Есть словарь, в котором ключ - объект типа Spam
Код

class Spam(object):
    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        return self.value == other.value

Делаю тест
Код

s1 = Spam(1)
s2 = Spam(1)

d = {}

d[s1] = 3

print "IN KEYS", s2 in d.keys() # TRUE
print "IN", s2 in d # FALSE
print "HAS KEY", d.has_key(s2) # FALSE
print d[s2] # KeyError

Как сделать так, чтобы я мог получить значение по ключу s2(==s1)?
Т.е. ключи с разными ссылками на объект, но равные по содержанию, имени одно значение в dict


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
uranpro
Дата 25.2.2011, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



это возможно?  smile 


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Daevaorn
Дата 26.2.2011, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



Вы должны у классе реализовать ещё метод __hash__, например так:

Код

def __hash__(self):
    return hash(self.value)

PM MAIL WWW   Вверх
bilbobagginz
Дата 26.2.2011, 08:37 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 6
Всего: 317



но, по-моему это вносит нехороший тон в код.
может лучше определить:
Код

class AttributeDict(dict):
    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            # to conform with __getattr__ spec
            raise AttributeError(key)

    def __setattr__(self, key, value):
        self[key] = value

    def first(self, *names):
        for name in names:
            value = self.get(name)
            if value:
                return value


это позволяет делать так:
Код

x = AttributeDict(name='kungfoo')
y = AttributeDict(name='karate')
z = AttributeDict(name='muaythai')

### во-первых получаем доступ к свойствам без скобочек
### что повышает читабельность:
x.martial_art = True
y.martial_art = True
x.sport = False
y.sport = True

z.martial_art = False
z.sport = True
### и потом сравниваем:
if x.martial_art == y.martial_art and x.martial_art is True:
    print 'both %(name)s and %(name)s are martial arts!' %( x, y )




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Daevaorn
Дата 26.2.2011, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



bilbobagginz, это вы всё вообще к чему написали?
PM MAIL WWW   Вверх
uranpro
Дата 27.2.2011, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



Daevaorn, спасибо, но не получается =(
Код

class Spam(object):
    def __init__(self, value):
        self.value = value
        
    def __hash__(self):
        return hash(self.value)
        
s1 = Spam(1)
s2 = Spam(1)

d = {s1:"test"}

print s1 in d # True
print s2 in d # False


bilbobagginz,
мне нужно создать Excel файл, в котором много стилей. Я пытаюсь сделать это через xlwt, но у меня выкидывает исключение
Код

raise ValueError("More than 4094 XFs (styles)")

я нашел свою ошибку, но еще заметил и в xlwt
Код

    def _add_style(self, style):
        ...
        font = style.font
        if font in self._font_id2x: # сверяются ссылки, а не содержимое
            ...
        gof = (style.alignment, style.borders, style.pattern, style.protection)
        xf = (font_idx, num_format_idx) + gof
        if xf in self._xf_id2x:
            ...

вот и пытаюсь решить ее


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Daevaorn
Дата 27.2.2011, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



Цитата(uranpro @  27.2.2011,  12:41 Найти цитируемый пост)
Daevaorn, спасибо, но не получается =(

Так метод __eq__ зачем убрали?
PM MAIL WWW   Вверх
uranpro
Дата 28.2.2011, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



Точно, спасибо!


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
bilbobagginz
Дата 11.3.2011, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 6
Всего: 317



давно сюда не заглядывал smile 
Цитата(Daevaorn @  26.2.2011,  20:47 Найти цитируемый пост)
bilbobagginz, это вы всё вообще к чему написали? 

видимо не правильно понял вопрос.
не беда. теперь понял. 




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0814 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.