[Python-de] Re: Umwandlung ADO Recordset in Dictionary

Stefan Schwarzer sschwarzer at sschwarzer.net
Sam Jun 4 10:47:37 CEST 2005


Hallo Diez,

On 2005-06-01 16:02, Diez B. Roggisch wrote:
> result = []
> if not oRS.EOF:
>     width = oRS.Fields.Count
>     namen =  [oRS.Fields.Item(x).Name for x in xrange(width)]
>     while not oRS.EOF:
>           result.append(dict([(name, oRS.Fields.Item(x).Value) for name, x in\
>                  zip(namen, xrange(width))]))

meines Erachtens macht diese Zeile ein bisschen viel. Ich würde sie
auf mehrere Anweisungen verteilen. Wenn man dann noch gute Namen für
die Zwischenergebnisse findet, hat man schon etwas für die Lesbarkeit
erreicht.

>           oRS.MoveNext()
> 
> So etwa. Besser sähe das ganze aber aus, wenn man sich einen Wrapper um oRS 
> baut, der dessen Verhalten pythonischer macht. So in etwa (völlig ungetestet 
> und aussem Kopp):
> 
> class RSWrapper:
> 
>     def __init__(self, rs):
>          self._rs = rs
>          self._width = oRS.Fields.Count
>          self._names = []
>          if not rs.EOF:
>              self._names =  [rs.Fields.Item(x).Name for x in xrange(width)]
> 
>     def __iter__(self):
>         return self
> 
>     def next(self):
>        if self._rs.EOF:
>             raise StopIteration
>        values = [self._rs.Fields.Item(x).Value for x in xrange(self._width)]
>        self._rs.MoveNext()
>        return dict(zip(self._names, values)
> 
> Dann kann man das oben so schreiben:
> 
> result = [row for row in RSWRapper(oRS)]

Das finde ich hübsch, wenn man das öfter braucht.

> Hoffe ich....

Ich auch :-)

Viele Grüße
Stefan