diff options
author | Stefan Krah <skrah@bytereef.org> | 2016-06-20 10:10:13 (GMT) |
---|---|---|
committer | Stefan Krah <skrah@bytereef.org> | 2016-06-20 10:10:13 (GMT) |
commit | 6817c59cf08ac214737d86f37e63a431385a9613 (patch) | |
tree | d3f91e41a3063cbcc86a99dfa7fbc8fec43841d3 | |
parent | 2275e626b1694557f646fd8a06608074731d6c82 (diff) | |
download | cpython-6817c59cf08ac214737d86f37e63a431385a9613.zip cpython-6817c59cf08ac214737d86f37e63a431385a9613.tar.gz cpython-6817c59cf08ac214737d86f37e63a431385a9613.tar.bz2 |
Issue #27006: from_float(): call the subclass' __new__() and __init__().
-rw-r--r-- | Lib/test/test_decimal.py | 5 | ||||
-rw-r--r-- | Modules/_decimal/_decimal.c | 10 |
2 files changed, 12 insertions, 3 deletions
diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py index c0d21b1..cde5d78 100644 --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -2491,7 +2491,8 @@ class PythonAPItests(unittest.TestCase): Decimal = self.decimal.Decimal class MyDecimal(Decimal): - pass + def __init__(self, _): + self.x = 'y' self.assertTrue(issubclass(MyDecimal, Decimal)) @@ -2499,6 +2500,8 @@ class PythonAPItests(unittest.TestCase): self.assertEqual(type(r), MyDecimal) self.assertEqual(str(r), '0.1000000000000000055511151231257827021181583404541015625') + self.assertEqual(r.x, 'y') + bigint = 12345678901234567890123456789 self.assertEqual(MyDecimal.from_float(bigint), MyDecimal(bigint)) self.assertTrue(MyDecimal.from_float(float('nan')).is_qnan()) diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 112b44f..e69d715 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -2630,12 +2630,18 @@ PyDecType_FromSequenceExact(PyTypeObject *type, PyObject *v, /* class method */ static PyObject * -dec_from_float(PyObject *dec, PyObject *pyfloat) +dec_from_float(PyObject *type, PyObject *pyfloat) { PyObject *context; + PyObject *result; CURRENT_CONTEXT(context); - return PyDecType_FromFloatExact((PyTypeObject *)dec, pyfloat, context); + result = PyDecType_FromFloatExact(&PyDec_Type, pyfloat, context); + if (!PyDec_CheckExact(type) && result != NULL) { + Py_SETREF(result, PyObject_CallFunctionObjArgs(type, result, NULL)); + } + + return result; } /* create_decimal_from_float */ |