This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author serhiy.storchaka
Recipients mark.dickinson, serhiy.storchaka
Date 2016-05-09.13:46:32
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1462801593.23.0.789372695786.issue26983@psf.upfronthosting.co.za>
In-reply-to
Content
The float constructor can return an instance of float subclass.

>>> class FloatSubclass(float):
...     pass
... 
>>> class BadFloat:
...     def __float__(self):
...         return FloatSubclass(1.2)
... 
>>> type(float(BadFloat()))
<class '__main__.FloatSubclass'>

Comparing with other types, complex() always returns complex:

>>> class ComplexSubclass(complex):
...     pass
... 
>>> class BadComplex:
...     def __complex__(self):
...         return ComplexSubclass(1.2, 3.4)
... 
>>> type(complex(BadComplex()))
<class 'complex'>

And int() can return an instance of int subclass, but this behavior is deprecated:

>>> class BadInt:
...     def __int__(self):
...         return True
... 
>>> int(BadInt())
__main__:1: DeprecationWarning: __int__ returned non-int (type bool).  The ability to return an instance of a strict subclass of int is deprecated, and may be removed in a future version of Python.
True

May be we should either deprecate __float__ returning non-float (as for int), or convert the result to exact float (as for complex).

The constructor of float subclass always returns an instance of correct type.

>>> class FloatSubclass2(float):
...     pass
... 
>>> type(FloatSubclass2(BadFloat()))
<class '__main__.FloatSubclass2'>
History
Date User Action Args
2016-05-09 13:46:33serhiy.storchakasetrecipients: + serhiy.storchaka, mark.dickinson
2016-05-09 13:46:33serhiy.storchakasetmessageid: <1462801593.23.0.789372695786.issue26983@psf.upfronthosting.co.za>
2016-05-09 13:46:32serhiy.storchakalinkissue26983 messages
2016-05-09 13:46:32serhiy.storchakacreate