словарь и ключ-объект

 
0
 
Python
ava
uranpro | 25.02.2011, 15:16
Добрый день!
Есть словарь, в котором ключ - объект типа 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
Kommentare (8)
ava
uranpro | 25.02.2011, 18:41 #
это возможно? smile
ava
Daevaorn | 26.02.2011, 00:24 #
Вы должны у классе реализовать ещё метод __hash__, например так:


def __hash__(self):
return hash(self.value)
ava
bilbobagginz | 26.02.2011, 08:37 #
но, по-моему это вносит нехороший тон в код.
может лучше определить:

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 )

ava
Daevaorn | 26.02.2011, 21:47 #
bilbobagginz, это вы всё вообще к чему написали?
ava
uranpro | 27.02.2011, 11:41 #
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:
...

вот и пытаюсь решить ее
ava
Daevaorn | 27.02.2011, 17:53 #
Цитата (uranpro @ 27.2.2011, 12:41 findReferencedText)
Daevaorn, спасибо, но не получается =(

Так метод __eq__ зачем убрали?
ava
uranpro | 28.02.2011, 12:26 #
Точно, спасибо!
ava
bilbobagginz | 11.03.2011, 09:14 #
давно сюда не заглядывал smile
Цитата (Daevaorn @ 26.2.2011, 20:47 findReferencedText)
bilbobagginz, это вы всё вообще к чему написали?

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

Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden