I'd reformulate them as
"%x" % (id(o) & 0xffffffffL) Of course, you have to replace 0xffffffffL with (unsigned)-1 of the system (i.e. 2l*sys.maxint+1).
Hm. "%x" % (id(o) & 2L*sys.maxint+1)
is considerably less obvious that "%x"%id(o)
I wonder whether creating a function sys.unsigned(id(o)) would be appropriate, which returns its arguments for positive numbers, and PyLong_FromUnsignedLong((unsigned)arg) otherwise.
Possibly. I'm going to have to make the above patch to the 23 branch in any case - warnings from the standard test suite are bad. Would a different % format code be another option?
This warning will go away in 2.4 again, where %x with a negative int will return a hex number with a minus sign. So I'd be against introducing a new format code. I've forgotten in what code you found this, but the sys.maxint solution sounds like your best bet. In 2.4 we can also make id() return a long when the int value would be negative; I don't want to do that in 2.3 since changing the return type and value of a builtin in a minor release seems a compatibility liability -- but in 2.4 the difference between int and long will be wiped out even more than it already is, so it should be fine there. --Guido van Rossum (home page: http://www.python.org/~guido/)