summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/c-api/structures.rst6
-rw-r--r--Doc/data/refcounts.dat5
-rw-r--r--Doc/extending/newtypes.rst33
3 files changed, 12 insertions, 32 deletions
diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst
index 5079e0d..04fe8f4 100644
--- a/Doc/c-api/structures.rst
+++ b/Doc/c-api/structures.rst
@@ -198,9 +198,3 @@ definition with the same method name.
object and will co-exist with the slot. This is helpful because calls to
PyCFunctions are optimized more than wrapper object calls.
-
-.. cfunction:: PyObject* Py_FindMethod(PyMethodDef table[], PyObject *ob, char *name)
-
- Return a bound method object for an extension type implemented in C. This can
- be useful in the implementation of a :attr:`tp_getattro` or :attr:`tp_getattr`
- handler that does not use the :cfunc:`PyObject_GenericGetAttr` function.
diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat
index e39c53b..73f6c1c 100644
--- a/Doc/data/refcounts.dat
+++ b/Doc/data/refcounts.dat
@@ -1686,11 +1686,6 @@ Py_FdIsInteractive:char*:filename::
Py_Finalize:void:::
-Py_FindMethod:PyObject*::+1:
-Py_FindMethod:PyMethodDef[]:methods::
-Py_FindMethod:PyObject*:self:+1:
-Py_FindMethod:char*:name::
-
Py_GetBuildInfoconst:char*:::
Py_GetCompilerconst:char*:::
diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst
index 17da3b5..931c2b5 100644
--- a/Doc/extending/newtypes.rst
+++ b/Doc/extending/newtypes.rst
@@ -1074,8 +1074,8 @@ sense for the implementation's convenience. ::
getattrfunc tp_getattr; /* char * version */
setattrfunc tp_setattr;
/* ... */
- getattrofunc tp_getattrofunc; /* PyObject * version */
- setattrofunc tp_setattrofunc;
+ getattrofunc tp_getattro; /* PyObject * version */
+ setattrofunc tp_setattro;
If accessing attributes of an object is always a simple operation (this will be
explained shortly), there are generic implementations which can be used to
@@ -1204,9 +1204,7 @@ For simplicity, only the :ctype:`char\*` version will be demonstrated here; the
type of the name parameter is the only difference between the :ctype:`char\*`
and :ctype:`PyObject\*` flavors of the interface. This example effectively does
the same thing as the generic example above, but does not use the generic
-support added in Python 2.2. The value in showing this is two-fold: it
-demonstrates how basic attribute management can be done in a way that is
-portable to older versions of Python, and explains how the handler functions are
+support added in Python 2.2. It explains how the handler functions are
called, so that if you do need to extend their functionality, you'll understand
what needs to be done.
@@ -1214,27 +1212,20 @@ The :attr:`tp_getattr` handler is called when the object requires an attribute
look-up. It is called in the same situations where the :meth:`__getattr__`
method of a class would be called.
-A likely way to handle this is (1) to implement a set of functions (such as
-:cfunc:`newdatatype_getSize` and :cfunc:`newdatatype_setSize` in the example
-below), (2) provide a method table listing these functions, and (3) provide a
-getattr function that returns the result of a lookup in that table. The method
-table uses the same structure as the :attr:`tp_methods` field of the type
-object.
-
Here is an example::
- static PyMethodDef newdatatype_methods[] = {
- {"getSize", (PyCFunction)newdatatype_getSize, METH_VARARGS,
- "Return the current size."},
- {"setSize", (PyCFunction)newdatatype_setSize, METH_VARARGS,
- "Set the size."},
- {NULL, NULL, 0, NULL} /* sentinel */
- };
-
static PyObject *
newdatatype_getattr(newdatatypeobject *obj, char *name)
{
- return Py_FindMethod(newdatatype_methods, (PyObject *)obj, name);
+ if (strcmp(name, "data") == 0)
+ {
+ return PyInt_FromLong(obj->data);
+ }
+
+ PyErr_Format(PyExc_AttributeError,
+ "'%.50s' object has no attribute '%.400s'",
+ tp->tp_name, name);
+ return NULL;
}
The :attr:`tp_setattr` handler is called when the :meth:`__setattr__` or