diff options
author | Tim Peters <tim.peters@gmail.com> | 2001-09-13 19:18:27 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2001-09-13 19:18:27 (GMT) |
commit | 3f996e7266113eed814015d977d50e221c3a421d (patch) | |
tree | 97fb0360dd86d9aa466d2bf39a18dd8aa7dcd025 | |
parent | bafedecc06176e431c3050ba8bcf1d4039e605af (diff) | |
download | cpython-3f996e7266113eed814015d977d50e221c3a421d.zip cpython-3f996e7266113eed814015d977d50e221c3a421d.tar.gz cpython-3f996e7266113eed814015d977d50e221c3a421d.tar.bz2 |
type_call(): Change in policy. The keyword args (if any) are now passed
on to the tp_new slot (if non-NULL), as well as to the tp_init slot (if
any). A sane type implementing both tp_new and tp_init should probably
pay attention to the arguments in only one of them.
-rw-r--r-- | Lib/test/test_descr.py | 15 | ||||
-rw-r--r-- | Objects/typeobject.c | 2 |
2 files changed, 14 insertions, 3 deletions
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 2e6748e..9324179 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -343,8 +343,10 @@ def complexes(): numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge']) class Number(complex): __slots__ = ['prec'] - def __init__(self, *args, **kwds): - self.prec = kwds.get('prec', 12) + def __new__(cls, *args, **kwds): + result = complex.__new__(cls, *args) + result.prec = kwds.get('prec', 12) + return result def __repr__(self): prec = self.prec if self.imag == 0.0: @@ -353,10 +355,19 @@ def complexes(): return "%.*gj" % (prec, self.imag) return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag) __str__ = __repr__ + a = Number(3.14, prec=6) verify(`a` == "3.14") verify(a.prec == 6) + a = Number(a, prec=2) + verify(`a` == "3.1") + verify(a.prec == 2) + + a = Number(234.5) + verify(`a` == "234.5") + verify(a.prec == 12) + def spamlists(): if verbose: print "Testing spamlist operations..." import copy, xxsubtype as spam diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 430e68c..0d154d9 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -151,7 +151,7 @@ type_call(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } - obj = type->tp_new(type, args, NULL); + obj = type->tp_new(type, args, kwds); if (obj != NULL) { type = obj->ob_type; if (type->tp_init != NULL && |