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

Kenji Noguchi tokyo246 at gmail.com
Thu Jun 21 05:24:28 CEST 2007


Hi

I'm using Python 2.4.4 on 32bit x86 Linux.  I have a problem with printing
hex string for a value larger than 0x800000000 when the value is given to
% operator via an instance of a class with __int__().  If I pass a long value
to % operator it works just fine.

Example1 -- pass a long value directly.  this works.
>>> x=0x80000000
>>> x
2147483648L
>>> type(x)
<type 'long'>
>>> "%08x" % x
'80000000'

Example2 -- pass an instance of a class with __int__()
>>> class X:
...     def __init__(self, v):
...         self.v = v
...     def __int__(self):
...         return self.v
...
>>> y = X(0x80000000)
>>> "%08x" % y
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: int argument required
>>>

The behavior looks inconsistent.  By the way __int__ actually
returned a long type value in the Example2.  The "%08x" allows
either int or long in the Example1, however it accepts int only
in the Example2.   Is this a bug or expected?

by the way same thing happends on a 64bit system with a
value of 0x8000000000000000.

Regards,
Kenji Noguchi



More information about the Python-list mailing list