It always prefers __unicode__ over __str__. We can't really only call __unicode__ when __str__ isn't there because __str__ is always there.
We could do a search based upon MRO and call the first one we find but I don't think that'll change the behavior very much and it'll certainly be more difficult to understand. The actual code is added to StringOps.FastNew: if (x is string) { // check ascii return CheckAsciiString(context, (string)x); } + object value; + if (PythonTypeOps.TryInvokeUnaryOperator(context, x, "__unicode__", out value)) { + if (value is string || value is Extensible<string>) { + return value; + } + throw PythonOps.TypeError("coercing to Unicode: exected string, got {0}", PythonTypeOps.GetName(value)); + } + + OldInstance oi = x as OldInstance; + + if (oi != null && oi.TryGetBoundCustomMember(context, "__unicode__", out value)) { + value = context.LanguageContext.Call(context, value); + if (value is string || value is Extensible<string>) { + return value; + } + throw PythonOps.TypeError("coercing to Unicode: exected string, got {0}", PythonTypeOps.GetName(value)); + } // we don't invoke PythonOps.StringRepr here because we want to return the // Extensible<string> directly back if that's what we received from __str__. value = PythonContext.InvokeUnaryOperator(context, UnaryOperators.String, x); if (value is string || value is Extensible<string>) { return value; } > -----Original Message----- > From: users-boun...@lists.ironpython.com [mailto:users- > boun...@lists.ironpython.com] On Behalf Of Jeff Hardy > Sent: Monday, February 01, 2010 1:16 PM > To: Discussion of IronPython > Subject: Re: [IronPython] Django, __unicode__, and #20366 > > On Mon, Feb 1, 2010 at 1:19 PM, Dino Viehland <di...@microsoft.com> wrote: > > My initial test job didn't include support for __unicode__ on old-style > classes or have the fix for exceptions. I'm sending it through again to make > sure those two changes didn't break anything else. But I'm inclined to say > that this change is for the better. Thoughts? > > How does the implementation work? Does always it prefer __unicode__ to > __str__, or does it only call __unicode__ if it is present and __str__ > is missing? > > - Jeff > _______________________________________________ > Users mailing list > Users@lists.ironpython.com > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com _______________________________________________ Users mailing list Users@lists.ironpython.com http://lists.ironpython.com/listinfo.cgi/users-ironpython.com