Thursday, January 03, 2008

Python: Oh How Long I've Known Thee

I have a buddy who was doing some Python programming with Oracle today. He has asked me a question, and after I thought about it, I said, "Hey, that sounds familiar. I think I have some code for that." I knew it was in my open source project, Aquarium, but I also knew it wasn't in newer releases. I eventually found the code and gave it to him.

Here's the punchline: It was from 2001! Yes, I've been coding Python that long.

In case you're wondering what it was, the Oracle driver doesn't have code to fetch rows as dicts, so that's what I was giving him. Here's what it looks like:
    def fetchonedict(self, cursor, force=1): 
"""Fetch one row as a dict.

If force is 1 and there are no more rows, I'll throw
an EXPECTED_RECORD_NOT_FOUND exception. Otherwise (if
force is 0 and there are no more rows), I'll simply return
None. Note, database modules don't *have* to use this
function, I'm just providing it for convenience.

row = cursor.fetchone()
if not row:
if force: raise self.EXPECTED_RECORD_NOT_FOUND
else: return None
fieldCount = len(cursor.description)
retDict = {}
for i in range(0, fieldCount):
# Note that the 0'th element of each tuple in
# cursor.description is the col name.
retDict[cursor.description[i][0]] = row[i]
return retDict
Aside from the camelCased variable names, that ain't bad for a piece of seven year old code!


Noah Gift said...

Two comments:

1. Isn't it great, when you go, wow, I wrote that, and it isn't crap :)

2. This is why I am soooooo happy you are one of the reviewers for my book :)

Btw, if you want on the most insanely complete technical reviewers on Planet Earth, go to JJ, but not for the next few months.

mksoft said...

or do something like (untested):

ret_dict = dict( zip (map(lambda x:x[0],cursor.descriptions), row ) )