]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Backport:
authorGuido van Rossum <guido@python.org>
Thu, 1 Aug 2002 19:03:43 +0000 (19:03 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 1 Aug 2002 19:03:43 +0000 (19:03 +0000)
SF patch 588728 (Nathan Srebro).

The __delete__ method wrapper for descriptors was not supported

(I added a test, too.)

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

index 0c14be2348d8e4a7234fb12eed81f6d9587064a9..84f3da965a770759ec970baedd7261a179f0ddeb 100644 (file)
@@ -1313,13 +1313,16 @@ def compattr():
     if verbose: print "Testing computed attributes..."
     class C(object):
         class computed_attribute(object):
-            def __init__(self, get, set=None):
+            def __init__(self, get, set=None, delete=None):
                 self.__get = get
                 self.__set = set
+                self.__delete = delete
             def __get__(self, obj, type=None):
                 return self.__get(obj)
             def __set__(self, obj, value):
                 return self.__set(obj, value)
+            def __delete__(self, obj):
+                return self.__delete(obj)
         def __init__(self):
             self.__x = 0
         def __get_x(self):
@@ -1328,13 +1331,17 @@ def compattr():
             return x
         def __set_x(self, x):
             self.__x = x
-        x = computed_attribute(__get_x, __set_x)
+        def __delete_x(self):
+            del self.__x
+        x = computed_attribute(__get_x, __set_x, __delete_x)
     a = C()
     vereq(a.x, 0)
     vereq(a.x, 1)
     a.x = 10
     vereq(a.x, 10)
     vereq(a.x, 11)
+    del a.x
+    vereq(hasattr(a, 'x'), 0)
 
 def newslot():
     if verbose: print "Testing __new__ slot override..."
@@ -1647,8 +1654,8 @@ def properties():
     verify(not hasattr(a, "_C__x"))
     C.x.__set__(a, 100)
     vereq(C.x.__get__(a), 100)
-##    C.x.__set__(a)
-##    verify(not hasattr(a, "x"))
+    C.x.__delete__(a)
+    verify(not hasattr(a, "x"))
 
     raw = C.__dict__['x']
     verify(isinstance(raw, property))
index a35b72387114bb6d1ba0ee8d9648ac5329ce4a6d..56a7efe0275c22efb47ae3a978ea96eba2ebe3e4 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -427,6 +427,7 @@ Nathan Sullivan
 Mark Summerfield
 Kalle Svensson
 Hajime Saitou
+Nathan Srebro
 RajGopal Srinivasan
 Jim St. Pierre
 Quentin Stafford-Fraser
index f430be4258c55e8dec389c7e102968e5618a02b7..7cf8e488b1be112e91af001203d6e3d51efec2ab 100644 (file)
@@ -2720,6 +2720,22 @@ wrap_init(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
        Py_INCREF(Py_None);
        return Py_None;
 }
+  
+static PyObject *
+wrap_descr_delete(PyObject *self, PyObject *args, void *wrapped)
+{
+       descrsetfunc func = (descrsetfunc)wrapped;
+       PyObject *obj;
+       int ret;
+
+       if (!PyArg_ParseTuple(args, "O", &obj))
+               return NULL;
+       ret = (*func)(self, obj, NULL);
+       if (ret < 0)
+               return NULL;
+       Py_INCREF(Py_None);
+       return Py_None;
+}
 
 static PyObject *
 tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
@@ -3775,6 +3791,8 @@ static slotdef slotdefs[] = {
               "descr.__get__(obj[, type]) -> value"),
        TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set,
               "descr.__set__(obj, value)"),
+       TPSLOT("__delete__", tp_descr_set, slot_tp_descr_set,
+              wrap_descr_delete, "descr.__delete__(obj)"),
        FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)wrap_init,
               "x.__init__(...) initializes x; "
               "see x.__class__.__doc__ for signature",