[英]python generator
我有功課,我被困在了。 我盡可能地走了,但我被卡住了,有人能指出我正確的方向......我正在堅持讓每個數據行成為一個新對象。 通常情況下,我認為我可以迭代行,但這只會返回最后一行
題:
修改classFactory.py源代碼,以便build_row函數返回的DataRow類具有另一種方法:
檢索(self,curs,condition = None)
self(像往常一樣)調用其方法的實例,curs是現有數據庫連接上的數據庫游標,條件(如果存在)是一個條件字符串,必須對所有接收的行都為true。
retrieve方法應該是一個生成器,產生結果集的連續行,直到它完全耗盡。 每行應該是DataRow類型的新對象。
這就是我所擁有的------測試:
import unittest
from classFactory import build_row
class DBTest(unittest.TestCase):
def setUp(self):
C = build_row("user", "id name email")
self.c = C([1, "Steve Holden", "steve@holdenweb.com"])
def test_attributes(self):
self.assertEqual(self.c.id, 1)
self.assertEqual(self.c.name, "Steve Holden")
self.assertEqual(self.c.email, "steve@holdenweb.com")
def test_repr(self):
self.assertEqual(repr(self.c),
"user_record(1, 'Steve Holden', 'steve@holdenweb.com')")
if __name__ == "__main__":
unittest.main()
我正在測試的腳本
def build_row(table, cols):
"""Build a class that creates instances of specific rows"""
class DataRow:
"""Generic data row class, specialized by surrounding function"""
def __init__(self, data):
"""Uses data and column names to inject attributes"""
assert len(data)==len(self.cols)
for colname, dat in zip(self.cols, data):
setattr(self, colname, dat)
def __repr__(self):
return "{0}_record({1})".format(self.table, ", ".join([" {0!r}".format(getattr(self, c)) for c in self.cols]))
DataRow.table = table
DataRow.cols = cols.split()
return DataRow
像往常一樣迭代行,但使用yield
而不是return
。
它應該大致類似於以下內容:
def retrieve(self, curs, condition=None):
query_ = "SELECT * FROM rows"
if condition is not None:
query_ += " %s" %condition
curs.execute(query_)
for row in curs.fetchall(): # iterate over the retrieved results
yield row # and yield each row in turn
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.