]> granicus.if.org Git - python/commitdiff
type_call(): Change in policy. The keyword args (if any) are now passed
authorTim Peters <tim.peters@gmail.com>
Thu, 13 Sep 2001 19:18:27 +0000 (19:18 +0000)
committerTim Peters <tim.peters@gmail.com>
Thu, 13 Sep 2001 19:18:27 +0000 (19:18 +0000)
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.

Lib/test/test_descr.py
Objects/typeobject.c

index 2e6748e34c9ddd984c60bb770c92015b1835639f..9324179e31bdb168b272ec627e0a461c00ae8a7b 100644 (file)
@@ -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
index 430e68ca0a084d3caf49c8164aeb4a2efaf9263d..0d154d92f1abe324605d42e3c27da952688b6921 100644 (file)
@@ -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 &&