[Python-Dev] CPython crash with '%o'

Guido van Rossum guido at python.org
Wed Nov 14 21:04:50 CET 2007


I take back the first "Yes" answer. Alas, the % operator is a mess,
especially for %d/%o/%x. For subclassed longs, it *is* attempting to
call the overridden __oct__, and this is causing the SystemError. It
looks like this code wasn't really revisited when subclassing int and
long was introduced. :-( For subclassed ints, it never looks at the
overridden __oct__. For objects that are neither, it attempts to
convert them to ints using __int__ first.

The trend in 3.0 is to completely kill __oct__ specialization and rely
only on __int__ instead. So maybe I should retract my retraction and
claim that '%o' % c(5) should indeed return '5'.

The bug stands though. There's a relatively simple fix.

--Guido

On Nov 14, 2007 11:41 AM, Guido van Rossum <guido at python.org> wrote:
> Yes, and yes. There may be time still to fix the SystemError in 2.5.2!
>
>
> On Nov 14, 2007 11:16 AM, Mike Stall <jmstall at exchange.microsoft.com> wrote:
> >
> >
> >
> >
> > This is my first post, so here's a quick intro: I've recently joined the
> > IronPython team at Microsoft, after about 6 years as a developer on the the
> > .NET runtime (CLR).
> >
> > I'm currently trying to make IronPython match CPython's behavior regarding
> > some  % format string to a level of detail not documented by the spec.
> > (http://docs.python.org/lib/typesseq-strings.html)
> >
> > While exploring to determine what CPython's behavior is, I'm hitting a
> > SystemError in CPython.
> >
> > Given the following snippet:
> >
> > class c(long):
> >    def __oct__(self):
> >      return '100'
> >
> > x=c(5)
> >  oct(x) # expected to print  100
> >  '%o' % x  # expected to use print '5'
> >
> > It looks like in CPython, '%o' uses __int__ and so it should ignore __oct__
> > and print 5.
> >
> > However, I'm hitting an SystemError in CPython with this snippet:
> >
> > Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)]
> > onwin32
> >  Type "help", "copyright", "credits" or "license" for more information.
> >  >>> class c(long):
> >  ...   def __oct__(self):
> >  ...     return '100'
> >  ...
> >  >>> x=c(5)
> >  >>> oct(x) # expected to print  100
> >  '100'
> >  >>> '%o' % x  # expected to use print '5'
> >  Traceback (most recent call last):
> >    File "<stdin>", line 1, in <module>
> >  SystemError: \loewis\25\python\Objects\stringobject.c:4236: bad argument to
> > internal function
> >
> > Note that if c derives from 'int' instead of 'long', everything works as
> > expected.
> >
> > 1. Can somebody confirm that '%o' should not use __oct__ and that is uses
> > __int__ instead, and that the correct output from ('%o' % x) is indeed 5?
> >  2. Should I file a bug for the SystemError exception?
> >
> > Thanks,
> >  Mike
> >  http://blogs.msdn.com/jmstall
> >
> >
> > _______________________________________________
> > Python-Dev mailing list
> > Python-Dev at python.org
> > http://mail.python.org/mailman/listinfo/python-dev
> > Unsubscribe:
> > http://mail.python.org/mailman/options/python-dev/guido%40python.org
> >
> >
>
>
>
> --
> --Guido van Rossum (home page: http://www.python.org/~guido/)
>



-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-Dev mailing list