[Python-Dev] CPython crash with '%o' (original) (raw)
Guido van Rossum guido at python.org
Wed Nov 14 21:04:50 CET 2007
- Previous message: [Python-Dev] CPython crash with '%o'
- Next message: [Python-Dev] CPython crash with '%o'
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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 "", line 1, in > 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/)
- Previous message: [Python-Dev] CPython crash with '%o'
- Next message: [Python-Dev] CPython crash with '%o'
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]