[Python-Dev] boxing and unboxing data types
Serhiy Storchaka
storchaka at gmail.com
Mon Mar 9 07:07:28 CET 2015
On 09.03.15 06:33, Ethan Furman wrote:
> I guess it could boil down to: if IntEnum was not based on 'int', but instead had the __int__ and __index__ methods
> (plus all the other __xxx__ methods that int has), would it still be a drop-in replacement for actual ints? Even when
> being used to talk to non-Python libs?
If you don't call isinstance(x, int) (PyLong_Check* in C).
Most conversions from Python to C implicitly call __index__ or __int__,
but unfortunately not all.
>>> float(Thin(42))
42.0
>>> float(Wrap(42))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: float() argument must be a string or a number, not 'Wrap'
>>> '%*s' % (Thin(5), 'x')
' x'
>>> '%*s' % (Wrap(5), 'x')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: * wants int
>>> OSError(Thin(2), 'No such file or directory')
FileNotFoundError(2, 'No such file or directory')
>>> OSError(Wrap(2), 'No such file or directory')
OSError(<__main__.Wrap object at 0xb6fe81ac>, 'No such file or directory')
>>> re.match('(x)', 'x').group(Thin(1))
'x'
>>> re.match('(x)', 'x').group(Wrap(1))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: no such group
And to be ideal drop-in replacement IntEnum should override such methods
as __eq__ and __hash__ (so it could be used as mapping key). If all
methods should be overridden to quack as int, why not take an int?
More information about the Python-Dev
mailing list