简体   繁体   中英

python generator

I have homework that I am stuck on. I have gone as far as I can but I am stuck, can someone point me in the right direction.... I am getting stick in making each data row a new object. Normally i would think I could just iterate over the rows, but that will only return last row

Question:

Modify the classFactory.py source code so that the DataRow class returned by the build_row function has another method:

retrieve(self, curs, condition=None)

self is (as usual) the instance whose method is being called, curs is a database cursor on an existing database connection, and condition (if present) is a string of condition(s) which must be true of all received rows.

The retrieve method should be a generator, yielding successive rows of the result set until it is completely exhausted. Each row should be a new object of type DataRow.

This is what I have------ the test:

 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()

the script I am testing

 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

It should roughly be something like the following:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM