On Mon, Sep 15, 2014 at 07:24:17AM -0700, Ethan Furman wrote:
In Python 2, hex() calls the dunder method __hex__. That has been removed in Python 3. Does anyone know why?
__hex__ and __oct__ were removed in favor of __index__. __index__ returns the number as an integer (if possible to do so without conversion from, say, float or complex or ...). __hex__ and __oct__ did the same, and were redundant.
No, __hex__ returned a string. It could be used to implement (say) a floating point hex representation, or hex() of bytes.
py> (42).__hex__() '0x2a'
In Python 2, hex() only had to return a string, and accepted anything with a __hex__ method. In Python 3, it can only be used on objects which are int-like, which completely rules out conversions of non-ints to hexadecimal notation.
py> class MyList(list): ... def __hex__(self): ... return '[' + ', '.join(hex(a) for a in self) + ']' ... py> l = MyList([21, 16, 256, 73]) py> hex(l) '[0x15, 0x10, 0x100, 0x49]'
I don't suppose anyone would support bringing back __hex__?