迭代的更多pythonic方式

时间:2010-06-05 10:48:43

标签: refactoring iterator python

我正在使用属于商业软件API的模块。好消息是有一个python模块 - 坏消息是它非常unpythonic。

要迭代行,使用以下语法:

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

处理这种情况的最pythonic方法是什么?我考虑过创建一个第一类函数/生成器并将调用包装到for循环中:

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

这是一种改进,但感觉有点笨拙。有更多的pythonic方法吗?我应该围绕table类型创建一个包装类吗?

3 个答案:

答案 0 :(得分:11)

假设Next和next中的一个是拼写错误而且它们都是相同的,你可以使用内置iter函数的不太知名的变体:

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

答案 1 :(得分:2)

您可以创建一个自定义包装器,如:

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

然后:

for row in Table(gp, table)

另请参阅:Iterator Types

答案 2 :(得分:1)

最好的方法是在table对象周围使用Python迭代器接口,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()

现在你打电话:

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

在我看来,它非常易读。