[Python-Dev] boxing and unboxing data types

Maciej Fijalkowski fijall at gmail.com
Mon Mar 9 09:19:50 CET 2015


Not all your examples are good.

* float(x) calls __float__ (not __int__)

* re.group requires __eq__ (and __hash__)

* I'm unsure about OSError

* the % thing at the very least works on pypy

On Mon, Mar 9, 2015 at 8:07 AM, Serhiy Storchaka <storchaka at gmail.com> wrote:
> 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?
>
>
>
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> https://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe:
> https://mail.python.org/mailman/options/python-dev/fijall%40gmail.com


More information about the Python-Dev mailing list