3 Stimmen

Iteration auf pythonischere Weise

Ich verwende ein Modul, das Teil einer kommerziellen Software-API ist. Die gute Nachricht ist, dass es ein Python-Modul gibt - die schlechte Nachricht ist, dass es ziemlich unpythonisch ist.

Um über Zeilen zu iterieren, wird die folgende Syntax verwendet:

cursor = gp.getcursor(table)
row =  cursor.next()
while row:
    #do something with row
    row = cursor.next()

Was ist die pythonischste Art, mit dieser Situation umzugehen? Ich habe in Erwägung gezogen, eine Funktion/Generator erster Klasse zu erstellen und Aufrufe einer for-Schleife darin einzuschließen:

def cursor_iterator(cursor):
    row =  cursor.next()
    while row:
        yield row
        row = cursor.next()

[...]

cursor = gp.getcursor(table)
for row in cursor_iterator(cursor):
    # do something with row

Das ist zwar eine Verbesserung, wirkt aber ein wenig unbeholfen. Gibt es eine mehr pythonic Ansatz? Sollte ich eine Wrapper-Klasse um die table Typ?

11voto

Unter der Annahme, dass eines von Next und next ein Tippfehler ist und beide gleich sind, können Sie die nicht so bekannte Variante der eingebauten iter-Funktion verwenden:

for row in iter(cursor.next, None):
    <do something>

2voto

Felix Kling Punkte 751464

Sie könnten einen benutzerdefinierten Wrapper erstellen wie:

class Table(object):
    def __init__(self, gp, table):
        self.gp = gp
        self.table = table
        self.cursor = None

   def __iter__(self):
        self.cursor = self.gp.getcursor(self.table)
        return self

   def next(self):
        n = self.cursor.next()
        if not n:
             raise StopIteration()
        return n

und dann:

for row in Table(gp, table)

Siehe auch: Iterator-Typen

1voto

Olivier Verdier Punkte 43894

Der beste Weg ist die Verwendung einer Python-Iterator-Schnittstelle um die table Objekt, imho:

class Table(object):
    def __init__(self, table):
         self.table = table

    def rows(self):
        cursor = gp.get_cursor(self.table)
        row =  cursor.Next()
        while row:
            yield row
            row = cursor.next()

Jetzt rufen Sie einfach an:

my_table = Table(t)
for row in my_table.rows():
     # do stuff with row

Meiner Meinung nach ist es sehr lesenswert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X