[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