[Eric] TypeError in DebugClientBase.py
Seth Hill
sethrh at gmail.com
Sun Nov 22 20:49:11 GMT 2009
On Nov 22, 2009, at 3:33 AM, detlev wrote:
> On Samstag, 21. November 2009, Seth Hill wrote:
>> Hello all,
>>
>> I'm new to the mailing list and Eric, so please bear with me.
>>
>> I have discovered a possible bug in the DebugClientBase.py which
>> comes with Eric4 4.3.9 (r3513) on Windows XP. I've put a workaround
>> in place for the issue (see below). My question is not so much about
>> the bug (if it is a bug), but rather, where's the appropriate place
>> to submit bug reports?
>
> The ideal way to report bugs is via the included reporting function
> (s. Help
> menu). However, it is fine to report them here as well.
I noticed that menu command fully 60 seconds after sending the email!
There is __a_lot__ of functionality to learn in Eric!
>
>> If the right place is here, then continue
>> reading (and my apologies if not!).
>>
>>
>> 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'>
>>> 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'
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]
>>
>> You can duplicate the TypeError with something like:
>>>>> class Foo:
>>
>> ... def __unicode__(self):
>> ... return u'Foo instance'
>> ...
>>
>>>>> unicode(Foo)
>>
>> Traceback (most recent call last):
>> File "<console>", line 1, in <module>
>> TypeError: unbound method __unicode__() must be called with Foo
>> instance as first argument (got nothing instead)
>>
>
> However, unicode(type(Foo)) works fine, and that is what the
> "faulty" line
> does. Could you please give another example or stripped down script
> that
> causes your problem.
>
>>
>> Regards,
>>
>> Seth Hill
>>
>> _______________________________________________
>> Eric mailing list
>> Eric at riverbankcomputing.com
>> http://www.riverbankcomputing.com/mailman/listinfo/eric
>>
>
> Regards,
> Detlev
> --
> Detlev Offenbach
> detlev at die-offenbachs.de
More information about the Eric
mailing list