Daniel J. Popowich
dpopowich at comcast.net
Fri Dec 9 12:20:50 EST 2005
Scott Chapman writes: > Mod_Python has a StringField class and psycopg2 can't seem to adapt it > correctly. Type(stringfield_string) shows as: > <class 'mod_python.util.StringField'> > > Strings of this class have 3 extra items in dir(stringfield_string) which > regular strins don't have: > '__dict__', '__module__', 'value' > > Here's the class definition from mod_python.util: > class StringField(str): > """ This class is basically a string with > a value attribute for compatibility with std lib cgi.py > """ > > def __init__(self, str=""): > str.__init__(self, str) > self.value = self.__str__() > > How do I make psycopg2 deal with these correctly? It seems like > there's a way to make custom "adapters" but I'm rather clueless > here. I just need psycopg2 to run str() on the StringField instance > and it'd work great. This is a pain, I know. I use psycopg extensively and have been burned more than once. There's nothing you can really do at the psycopg module (afaik), but it's easy enough in your code...you can do one of a few things: 1. a pain, but use str() explicitly. 2. build your query strings using python string formatting, instead of the parameters of the cursor.execute() method. E.g.: cur.execute("insert into mytable (col1, col5) values ('%s', %d)" % (some_str, some_int)) the %s will automatically call __str__() if some_str is not a str. 3. Are you still using mpservlets? (you were at one time) If you use query_vars to process your forms, your instance variables are converted to str automagically. In the attached servlet, types.mps, if you call it with: types?field=abc&realstr=def the output will be: field: abc type(field): <class 'mod_python.util.StringField'> realstr: def type(realstr): <type 'str'> Cheers, Daniel Popowich --------------- http://home.comcast.net/~d.popowich/mpservlets/ -------------- next part -------------- # -*- python -*- from mod_python.servlet import HTMLPage import cgi class types(HTMLPage): query_vars = ['realstr'] def prep(self): HTMLPage.prep(self) self.field = self.form.getfirst('field') def write_content(self): self.writeln('field: %s<br>' % self.field) self.writeln('type(field): %s<br>' % cgi.escape(str(type(self.field)))) self.writeln('realstr: %s<br>' % self.realstr) self.writeln('type(realstr): %s<br>' % cgi.escape(str(type(self.realstr))))
|