summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2001-09-13 19:18:27 (GMT)
committerTim Peters <tim.peters@gmail.com>2001-09-13 19:18:27 (GMT)
commit3f996e7266113eed814015d977d50e221c3a421d (patch)
tree97fb0360dd86d9aa466d2bf39a18dd8aa7dcd025
parentbafedecc06176e431c3050ba8bcf1d4039e605af (diff)
downloadcpython-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.py15
-rw-r--r--Objects/typeobject.c2
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 &&