Hello again, On Sonntag, 22. November 2009, Seth Hill wrote: > On Nov 22, 2009, at 3:33 AM, detlev wrote: > > On Samstag, 21. November 2009, Seth Hill wrote: > >> I'm working with a django 1.1 project, trying to get debugging going. > >> I'm working with a form in a view function. I set a breakpoint in the > >> view function, and get a TypeError in DebugClientBase.py:1608. It > >> looks like the debugger is going through the locals and calling > >> unicode() on all of them. Some of the locals in this case don't > >> support the unicode method. When the debugger calls the unicode() > >> method, it triggers an exception inside the running wsgi server. I > >> get an error message on the web page, and the debug session stops > >> working. > >> > >> My code looks like: > >> > >> forms.py: > >> class NewCustomerForm(forms.Form): > >> name = forms.CharField() > >> # etc > >> > >> views.py: > >> def create_customer(request): > >> if request.method == "POST": # breakpoint here > >> form = NewCustomerForm(request.POST) > >> if form.is_valid(): # exception occurs when stepping > >> to here > >> > >> > >> The line in DebugClientBase.py looks like: > >> valtypestr = unicode(type(value))[1:-1] > > > > I don't understand, why type(value) does not support the unicode() > > method. > > Now that you mention it, I don't either. I've been digging a little > deeper, and it seems that this is django's problem: > > A django.forms.forms.Form class defines __metaclass__ = > DeclarativeFieldsMetaclass (see source code http:// > code.djangoproject.com/browser/django/trunk/django/forms/forms.py: > 336). I'm not entirely sure what it does, but I gather that it > converts the class attributes into fields which can be accessed by a > class instance. > > Anyway, the metaclass seems to be promoting the __unicode__ function > > of Form to type(Form): > >>> f = Form() > >>> type(f) > > <class 'django.forms.forms.Form'>
That seems to be a Django bug because the net result is, that you cannot convert the result of type(f) to a unicode string. > > >>> unicode(type(f)) > > Traceback (most recent call last): > File "<console>", line 1, in <module> > TypeError: unbound method __unicode__() must be called with Form > instance as first argument (got nothing instead) > > >>> type(Form) > > <class 'django.forms.forms.DeclarativeFieldsMetaclass'> > > >>> import inspect > >>> inspect.getsource(type(f).__unicode__) > > ' def __unicode__(self):\n return self.as_table()\n' > Can you please check, what ist returned by "inspect.getsource(type(f).__repr__)"? What is needed by the eric4 debugger backend is a method to return the type of a variable as a string. > > Anyway, the effect is still that if you are running the debugger and > have a Form instance as a local variable, it will blow up. I would be > willing to be that debugging a Model instance would have a similar > effect (since it also uses a metaclass). > > Maybe, instead of below a workaround should be: > > if type(value) is type: > valtypestr = unicode(type(value))[1:-1] > else: > valtypestr = repr(type(value))[1:-1] > > However, even when doing that I suppose some metaclass could screw up > __repr__ just like django's DeclarativeFieldsMetaclass did with > __unicode__. (?) > > >> I've "fixed" the error by wrapping the line in a try: > >> > >> try: > >> valtypestr = unicode(type(value))[1:-1] > >> except TypeError: > >> valtypestr = repr(type(value))[1:-1] > >> Regards Detlev -- Detlev Offenbach [email protected] _______________________________________________ Eric mailing list [email protected] http://www.riverbankcomputing.com/mailman/listinfo/eric
