]> granicus.if.org Git - python/commitdiff
Fix for SF bug #472940: can't getattr() attribute shown by dir()
authorGuido van Rossum <guido@python.org>
Mon, 22 Oct 2001 02:00:09 +0000 (02:00 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 22 Oct 2001 02:00:09 +0000 (02:00 +0000)
There really isn't a good reason for instance method objects to have
their own __dict__, __doc__ and __name__ properties that just delegate
the request to the function (callable); the default attribute behavior
already does this.

The test suite had to be fixed because the error changes from
TypeError to AttributeError.

Lib/test/test_funcattrs.py
Objects/classobject.c

index 2411f6a63a284bbefa0596b4e1dc9e0a1802373c..293b911def434822daf347111dba5661a218b565 100644 (file)
@@ -108,8 +108,8 @@ if f1.a.myclass is not f2.a.myclass or \
 # try setting __dict__
 try:
     F.a.__dict__ = (1, 2, 3)
-except TypeError: pass
-else: raise TestFailed, 'expected TypeError'
+except (AttributeError, TypeError): pass
+else: raise TestFailed, 'expected TypeError or AttributeError'
 
 F.a.im_func.__dict__ = {'one': 11, 'two': 22, 'three': 33}
 
@@ -121,7 +121,7 @@ d = UserDict({'four': 44, 'five': 55})
 
 try:
     F.a.__dict__ = d
-except TypeError: pass
+except (AttributeError, TypeError): pass
 else: raise TestFailed
 
 if f2.a.one <> f1.a.one <> F.a.one <> 11:
@@ -218,13 +218,13 @@ def cantset(obj, name, value):
     verify(hasattr(obj, name)) # Otherwise it's probably a typo
     try:
         setattr(obj, name, value)
-    except TypeError:
+    except (AttributeError, TypeError):
         pass
     else:
         raise TestFailed, "shouldn't be able to set %s to %r" % (name, value)
     try:
         delattr(obj, name)
-    except TypeError:
+    except (AttributeError, TypeError):
         pass
     else:
         raise TestFailed, "shouldn't be able to del %s" % name
index 57de8e9e2113c2e91647f588e82c890f48d27d3a..622ca5821a546aab95c6ab19a4879a6932e35784 100644 (file)
@@ -2019,33 +2019,6 @@ static PyMemberDef instancemethod_memberlist[] = {
        {NULL}  /* Sentinel */
 };
 
-/* __dict__, __doc__ and __name__ are retrieved from im_func */
-
-static PyObject *
-im_get_dict(PyMethodObject *im)
-{
-       return PyObject_GetAttrString(im->im_func, "__dict__");
-}
-
-static PyObject *
-im_get_doc(PyMethodObject *im)
-{
-       return PyObject_GetAttrString(im->im_func, "__doc__");
-}
-
-static PyObject *
-im_get_name(PyMethodObject *im)
-{
-       return PyObject_GetAttrString(im->im_func, "__name__");
-}
-
-static PyGetSetDef instancemethod_getsetlist[] = {
-       {"__dict__", (getter)im_get_dict, NULL, "same as im_func.__dict__"},
-       {"__doc__", (getter)im_get_doc, NULL, "same as im_func.__doc__"},
-       {"__name__", (getter)im_get_name, NULL, "same as im_func.__name__"},
-       {NULL}  /* Sentinel */
-};
-
 /* The getattr() implementation for PyMethod objects is similar to
    PyObject_GenericGetAttr(), but instead of looking in __dict__ it
    asks im_self for the attribute.  Then the error handling is a bit
@@ -2350,7 +2323,7 @@ PyTypeObject PyMethod_Type = {
        0,                                      /* tp_iternext */
        0,                                      /* tp_methods */
        instancemethod_memberlist,              /* tp_members */
-       instancemethod_getsetlist,              /* tp_getset */
+       0,                                      /* tp_getset */
        0,                                      /* tp_base */
        0,                                      /* tp_dict */
        instancemethod_descr_get,               /* tp_descr_get */