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

half.italian at gmail.com half.italian at gmail.com
Thu Jun 21 00:46:55 EDT 2007


On Jun 20, 8:24 pm, "Kenji Noguchi" <tokyo... at gmail.com> wrote:
> 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

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 explicitly...ie "%08x"
% int(y)

~Sean




More information about the Python-list mailing list