string formatter %x and a class instance with __int__ cannot handle long

Kenji Noguchi tokyo246 at
Thu Jun 21 10:36:42 CEST 2007

2007/6/20, half.italian at <half.italian at>:
> In your second example y is an instance of class X...not an int.  y.v
> is an int.  Are you hoping it will cast it to an int as needed using
> your method?  If so, I think you need to do so "%08x"
> % int(y)
> ~Sean

I confirmed that "%08x" % int(y) works. And yes, I'm hoping so.
It actually works that way if the v is less than or equal to 0x7ffffffff.
Please try the test script.  It's essentially the same test with
some more print statements.  All but test d-3 appears to be ok.

2007/6/20, Gabriel Genellina <gagsl-py2 at>:
> It is a bug, at least for me, and I have half of a patch addressing it. As
> a workaround, convert explicitely to long before formatting.

I'm interested in your patch.  What's the other half still missing?

Kenji Noguchi

#!/usr/bin/env python

class X:
   def __init__(self, v):
       self.v = v
   def __int__(self):
       print "Hey! I'm waken up!"
       return self.v

def test(arg):
   print 1,type(int(arg))
   print 2,"%08x" % int(arg)
   print 3,"%08x" % arg

a = 0x7fffffff
b = X(0x7fffffff)
c = 0x80000000
d = X(0x80000000)

print "----test a----" ; test(a)
print "----test b----" ; test(b)
print "----test c----" ; test(c)
print "----test d----" ; test(d)

And here is the result
----test a----
1 <type 'int'>
2 7fffffff
3 7fffffff
----test b----
1 Hey! I'm waken up!
<type 'int'>
2 Hey! I'm waken up!
3 Hey! I'm waken up!
----test c----
1 <type 'long'>
2 80000000
3 80000000
----test d----
1 Hey! I'm waken up!
<type 'long'>
2 Hey! I'm waken up!
3 Hey! I'm waken up!
Traceback (most recent call last):
 File "<stdin>", line 23, in ?
 File "<stdin>", line 13, in test
TypeError: int argument required

More information about the Python-list mailing list