我正在使用属于商业软件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
类型创建一个包装类吗?
答案 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
在我看来,它非常易读。