<div class="gmail_quote">Hello, </div><div class="gmail_quote"><br></div><div class="gmail_quote">I filed a bug report with the django folks too (<a href="http://code.djangoproject.com/ticket/12256" target="_blank">http://code.djangoproject.com/ticket/12256</a>). We determined that the issue isn&#39;t specific to django&#39;s use of metaclasses, but is in fact an issue with some older versions of python. This class: </div>

<div class="gmail_quote"><br></div><div class="gmail_quote">class Foo(object): </div><div class="gmail_quote">    def __init__(self, x): </div><div class="gmail_quote">        self.x = x</div><div class="gmail_quote">    def __unicode__(self): </div>

<div class="gmail_quote">        print self.x</div><div class="gmail_quote"><br></div><div class="gmail_quote">Generates the same TypeError when you call unicode(type(Foo())). My python is 2.5.1. I wasn&#39;t able to duplicate the issue on my Mac under python 2.6.2. I haven&#39;t been able to find a bug about this in the python bug list though. </div>

<div class="gmail_quote"><br></div><div class="gmail_quote">On Mon, Nov 23, 2009 at 9:16 AM, detlev <span dir="ltr">&lt;<a href="mailto:detlev@die-offenbachs.de" target="_blank">detlev@die-offenbachs.de</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hello again,<br>
<div><br>
On Sonntag, 22. November 2009, Seth Hill wrote:<br>
&gt; On Nov 22, 2009, at 3:33 AM, detlev wrote:<br>
&gt; &gt; On Samstag, 21. November 2009, Seth Hill wrote:<br>
</div><div><div></div><div>&gt; &gt;&gt; I&#39;m working with a django 1.1 project, trying to get debugging going.<br>
&gt; &gt;&gt; I&#39;m working with a form in a view function. I set a breakpoint in the<br>
&gt; &gt;&gt; view function, and get a TypeError in DebugClientBase.py:1608. It<br>
&gt; &gt;&gt; looks like the debugger is going through the locals and calling<br>
&gt; &gt;&gt; unicode() on all of them. Some of the locals in this case don&#39;t<br>
&gt; &gt;&gt; support the unicode method. When the debugger calls the unicode()<br>
&gt; &gt;&gt; method, it triggers an exception inside the running wsgi server. I<br>
&gt; &gt;&gt; get an error message on the web page, and the debug session stops<br>
&gt; &gt;&gt; working.<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; My code looks like:<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; forms.py:<br>
&gt; &gt;&gt; class NewCustomerForm(forms.Form):<br>
&gt; &gt;&gt;      name = forms.CharField()<br>
&gt; &gt;&gt;      # etc<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; views.py:<br>
&gt; &gt;&gt; def create_customer(request):<br>
&gt; &gt;&gt;      if request.method == &quot;POST&quot;:  # breakpoint here<br>
&gt; &gt;&gt;          form = NewCustomerForm(request.POST)<br>
&gt; &gt;&gt;          if form.is_valid():       # exception occurs when stepping<br>
&gt; &gt;&gt; to here<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; The line in DebugClientBase.py looks like:<br>
&gt; &gt;&gt;      valtypestr = unicode(type(value))[1:-1]<br>
&gt; &gt;<br>
&gt; &gt; I don&#39;t understand, why type(value) does not support the unicode()<br>
&gt; &gt; method.<br>
&gt;<br>
&gt; Now that you mention it, I don&#39;t either. I&#39;ve been digging a little<br>
&gt; deeper, and it seems that this is django&#39;s problem:<br>
&gt;<br>
&gt; A django.forms.forms.Form class defines __metaclass__ =<br>
&gt; DeclarativeFieldsMetaclass (see source code http://<br>
&gt; <a href="http://code.djangoproject.com/browser/django/trunk/django/forms/forms.py" target="_blank">code.djangoproject.com/browser/django/trunk/django/forms/forms.py</a>:<br>
&gt; 336). I&#39;m not entirely sure what it does, but I gather that it<br>
&gt; converts the class attributes into fields which can be accessed by a<br>
&gt; class instance.<br>
&gt;<br>
&gt; Anyway, the metaclass seems to be promoting the __unicode__ function<br>
&gt;<br>
&gt; of Form to type(Form):<br>
&gt;  &gt;&gt;&gt; f = Form()<br>
&gt;  &gt;&gt;&gt; type(f)<br>
&gt;<br>
&gt; &lt;class &#39;django.forms.forms.Form&#39;&gt;<br>
<br>
</div></div>That seems to be a Django bug because the net result is, that you cannot<br>
convert the result of type(f) to a unicode string.<br>
<div><br>
&gt;<br>
&gt;  &gt;&gt;&gt; unicode(type(f))<br>
&gt;<br>
&gt; Traceback (most recent call last):<br>
&gt;     File &quot;&lt;console&gt;&quot;, line 1, in &lt;module&gt;<br>
&gt; TypeError: unbound method __unicode__() must be called with Form<br>
&gt; instance as first argument (got nothing instead)<br>
&gt;<br>
&gt;  &gt;&gt;&gt; type(Form)<br>
&gt;<br>
&gt; &lt;class &#39;django.forms.forms.DeclarativeFieldsMetaclass&#39;&gt;<br>
&gt;<br>
&gt;  &gt;&gt;&gt; import inspect<br>
&gt;  &gt;&gt;&gt; inspect.getsource(type(f).__unicode__)<br>
&gt;<br>
&gt; &#39;    def __unicode__(self):\n        return self.as_table()\n&#39;<br>
&gt;<br>
<br>
</div>Can you please check, what ist returned by<br>
&quot;inspect.getsource(type(f).__repr__)&quot;?<br>
<br></blockquote><div><br></div><div><div>&gt;&gt;&gt; inspect.getsource(type(f).__repr__)</div><div>Traceback (most recent call last):</div><div>  File &quot;&lt;console&gt;&quot;, line 1, in &lt;module&gt;</div><div>  File &quot;C:\Software\Python25\lib\inspect.py&quot;, line 629, in getsource</div>
<div>    lines, lnum = getsourcelines(object)</div><div>  File &quot;C:\Software\Python25\lib\inspect.py&quot;, line 618, in getsourcelines</div><div>    lines, lnum = findsource(object)</div><div>  File &quot;C:\Software\Python25\lib\inspect.py&quot;, line 461, in findsource</div>
<div>    file = getsourcefile(object) or getfile(object)</div><div>  File &quot;C:\Software\Python25\lib\inspect.py&quot;, line 383, in getsourcefile</div><div>    filename = getfile(object)</div><div>  File &quot;C:\Software\Python25\lib\inspect.py&quot;, line 363, in getfile</div>
<div>    raise TypeError(&#39;arg is not a module, class, method, &#39;</div><div>TypeError: arg is not a module, class, method, function, traceback, frame, or code object</div></div><div><br></div><div>I assume this means that __repr__ hasn&#39;t been defined (not in source code anyway). </div>
<div><br></div><div>However, this also doesn&#39;t work even if I do define __repr__: </div><div><br></div><div>&gt;&gt;&gt; class Foo(Form):</div><div>...    def __repr__(self):</div><div>...        return &#39;called repr&#39;</div>
<div>...</div><div>&gt;&gt;&gt; inspect.getsource(Foo().__repr___)</div><div><div>Traceback (most recent call last):</div><div>  File &quot;&lt;console&gt;&quot;, line 1, in &lt;module&gt;</div><div>  File &quot;C:\Software\Python25\lib\inspect.py&quot;, line 629, in getsource</div>
<div>    lines, lnum = getsourcelines(object)</div><div>  File &quot;C:\Software\Python25\lib\inspect.py&quot;, line 618, in getsourcelines</div><div>    lines, lnum = findsource(object)</div><div>  File &quot;C:\Software\Python25\lib\inspect.py&quot;, line 468, in findsource</div>
<div>    raise IOError(&#39;could not get source code&#39;)</div><div>IOError: could not get source code</div><div>&gt;&gt;&gt; repr(Foo())</div><div>&#39;called repr&#39;</div><div><br></div><div>But that might be because I&#39;m doing it on the console. </div>
<div><br></div></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
What is needed by the eric4 debugger backend is a method to return the type of<br>
a variable as a string.<br></blockquote><div><br></div><div>This is kinda wacky, but might work: </div><div><br></div><div>t = type(value)</div><div>if not t is type: </div><div>    t = type(t)</div><div>valtypestr = unicode(t)[1:-1]</div>
<div><br></div><div>If f = Foo(), and Foo defines a metaclass, then type(f) isn&#39;t &lt;type &#39;type&#39;&gt;. However, type(type(f)) should be. </div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div><br>
&gt;<br>
&gt; Anyway, the effect is still that if you are running the debugger and<br>
&gt; have a Form instance as a local variable, it will blow up. I would be<br>
&gt; willing to be that debugging a Model instance would have a similar<br>
&gt; effect (since it also uses a metaclass).<br>
&gt;<br>
&gt; Maybe, instead of below a workaround should be:<br>
&gt;<br>
&gt; if type(value) is type:<br>
&gt;      valtypestr = unicode(type(value))[1:-1]<br>
&gt; else:<br>
&gt;      valtypestr = repr(type(value))[1:-1]<br>
&gt;<br>
&gt; However, even when doing that I suppose some metaclass could screw up<br>
&gt; __repr__ just like django&#39;s DeclarativeFieldsMetaclass did with<br>
&gt; __unicode__.  (?)<br>
&gt;<br>
&gt; &gt;&gt; I&#39;ve &quot;fixed&quot; the error by wrapping the line in a try:<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; try:<br>
&gt; &gt;&gt;      valtypestr = unicode(type(value))[1:-1]<br>
&gt; &gt;&gt; except TypeError:<br>
&gt; &gt;&gt;      valtypestr = repr(type(value))[1:-1]<br>
&gt; &gt;&gt;<br>
<br>
</div><div><div></div><div>Regards<br>
Detlev<br>
--<br>
Detlev Offenbach<br>
<a href="mailto:detlev@die-offenbachs.de" target="_blank">detlev@die-offenbachs.de</a><br>
</div></div></blockquote></div><br>