Ich arbeite an einer Klasse, die mir searchpatterns erstellt. In der Regel besteht ein solches pattern aus dem Namen des Attributes, das durchsucht werden soll und einer Liste von Suchtermen. Nun gibt es aber auch Fälle, in denen nur ein möglicher Suchterm sinnvoll ist.
Per default ist die Liste demnach ein 'list'-Objekt, ansonsten habe ich eine 'list'-Unterklasse 'OneItemList' gebastelt, die nur ein Element aufnimmt.
Soweit kein Problem.
Code: Alles auswählen
#searchterm is multiple
{'title': {'or_': ['Day', 'Night']}}
#searchterm is not multiple
{'date': datetime.date(2011, 7, 22)}
Nun ist es so, dass ein searchpattern, das nur einen Suchterm zulässt für Attribute angelegt wird, die nicht durchsucht sondern verglichen werden. Meine 'OneItemList' sollte also nach außen keine Liste, sondern eben das eine Objekt, das sich hinter 'self[0]' verbirgt, sein.
Nachdem ich dazu neige, die Pferde von hinten aufzuzäumen, hatte ich zuerst die verwegene Idee, den Typ jeweils an 'self[0]' anzugleichen weil ich nicht wusste, wie ich einerseits 'append()' und 'remove()' ohne Ansehen des Objektes verwenden könnte, andererseits aber eben entweder die Liste ('list') oder das eine Element ('OneItemList') zu erhalten.
Gelöst habe ich das jetzt vorerst mal so:
Code: Alles auswählen
class OneItemList(list):
def __init__(self):
list.__init__(self, [None])
def append(self, item):
self[:] = [item]
def remove(self, item):
if item in self:
self[:] = [None]
else:
raise ValueError
def __getslice__(self, *dummy):
return self[0]
Wenn ich somit [:] an die jeweilige Suchfunktion übergebe, landet dort entweder eine Liste oder das eine Element.
@pillmuncher:
Konntest Du bereits ahnen, worum es mir geht oder ist es Zufall, dass Du die Namen 'Multiple' und 'Single' verwendest...
mutetella