Skip to content

Instantly share code, notes, and snippets.

@hidsh
Created February 28, 2012 02:14
Show Gist options
  • Save hidsh/1928597 to your computer and use it in GitHub Desktop.
Save hidsh/1928597 to your computer and use it in GitHub Desktop.
python test: set of class object
# test: set of class object
class part():
def __init__(self, name='unknown', val=100, flag=False):
self.name = name
self.val = val
self.flag = flag
def __eq__(self, other):
if isinstance(other, str):
return self.name==other
else:
return self.name==other.name
def __hash__(self):
# '__hash__()' is required in order to add to set
return hash(self.name)
class part_set(set):
def find_name(self, name):
ss = filter(lambda x: x.name==name, self)
return ss[0] if ss else None
def filter(self, func):
return filter(func, self)
def pop(self, name=None): # over load
if name:
e = self.find_name(name)
self.discard(name)
return e
else:
return set.pop(self) # super's method
def add_or_overwrite(self, part):
self.discard(part.name)
self.add(part)
# test
p1 = part('foo', 1)
p2 = part('bar', 5, True)
p3 = part('hoge', 8)
p4 = part('fuga', 99, True)
px = part('foo', 2000, True)
ps = part_set()
ps.add(p1)
ps.add(p2)
ps.add(p3)
ps.add(p4)
ps.add(px) # ignored
print '-- list -----------------------------------'
for x in ps:
print x.name, x.val, x.flag
print '-- find name ----------------------------------'
pf = ps.find_name('foo')
print pf.name, pf.val, pf.flag
print '-- registered? -----------------------------------'
print 'bar' in ps
print 'xxx' in ps
print '-- filter -----------------------------------'
for x in ps.filter(lambda x: x.flag==True):
print x.name, x.val, x.flag
print '-- pop -----------------------------------'
for x in ps:
print x.name, x.val, x.flag
print '--'
k = ps.pop('bar')
print k.name, k.val, k.flag
print '--'
for x in ps:
print x.name, x.val, x.flag
print '--'
k = ps.pop()
print k.name, k.val, k.flag
print '--'
for x in ps:
print x.name, x.val, x.flag
print '-- add_or_overwrite -----------------------------------'
po = part('fuga', 7, False)
ps.add_or_overwrite(po)
po = part('oops', 88, True)
ps.add_or_overwrite(po)
for x in ps:
print x.name, x.val, x.flag
# result
#
# -- list -----------------------------------
# foo 1 False
# bar 5 True
# fuga 99 True
# hoge 8 False
# -- find name ----------------------------------
# foo 1 False
# -- registered? -----------------------------------
# True
# False
# -- filter -----------------------------------
# bar 5 True
# fuga 99 True
# -- pop -----------------------------------
# foo 1 False
# bar 5 True
# fuga 99 True
# hoge 8 False
# --
# bar 5 True
# --
# foo 1 False
# fuga 99 True
# hoge 8 False
# --
# foo 1 False
# --
# fuga 99 True
# hoge 8 False
# -- add_or_overwrite -----------------------------------
# fuga 7 False
# oops 88 True
# hoge 8 False
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment