2
#include "structmember.h"
12
Noddy_traverse(Noddy *self, visitproc visit, void *arg)
17
vret = visit(self->first, arg);
22
vret = visit(self->last, arg);
31
Noddy_clear(Noddy *self)
47
Noddy_dealloc(Noddy* self)
50
Py_TYPE(self)->tp_free((PyObject*)self);
54
Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
58
self = (Noddy *)type->tp_alloc(type, 0);
60
self->first = PyUnicode_FromString("");
61
if (self->first == NULL) {
66
self->last = PyUnicode_FromString("");
67
if (self->last == NULL) {
75
return (PyObject *)self;
79
Noddy_init(Noddy *self, PyObject *args, PyObject *kwds)
81
PyObject *first=NULL, *last=NULL, *tmp;
83
static char *kwlist[] = {"first", "last", "number", NULL};
85
if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist,
108
static PyMemberDef Noddy_members[] = {
109
{"first", T_OBJECT_EX, offsetof(Noddy, first), 0,
111
{"last", T_OBJECT_EX, offsetof(Noddy, last), 0,
113
{"number", T_INT, offsetof(Noddy, number), 0,
115
{NULL} /* Sentinel */
119
Noddy_name(Noddy* self)
121
if (self->first == NULL) {
122
PyErr_SetString(PyExc_AttributeError, "first");
126
if (self->last == NULL) {
127
PyErr_SetString(PyExc_AttributeError, "last");
131
return PyUnicode_FromFormat("%S %S", self->first, self->last);
134
static PyMethodDef Noddy_methods[] = {
135
{"name", (PyCFunction)Noddy_name, METH_NOARGS,
136
"Return the name, combining the first and last name"
138
{NULL} /* Sentinel */
141
static PyTypeObject NoddyType = {
142
PyVarObject_HEAD_INIT(NULL, 0)
143
"noddy.Noddy", /* tp_name */
144
sizeof(Noddy), /* tp_basicsize */
146
(destructor)Noddy_dealloc, /* tp_dealloc */
152
0, /* tp_as_number */
153
0, /* tp_as_sequence */
154
0, /* tp_as_mapping */
160
0, /* tp_as_buffer */
162
Py_TPFLAGS_BASETYPE |
163
Py_TPFLAGS_HAVE_GC, /* tp_flags */
164
"Noddy objects", /* tp_doc */
165
(traverseproc)Noddy_traverse, /* tp_traverse */
166
(inquiry)Noddy_clear, /* tp_clear */
167
0, /* tp_richcompare */
168
0, /* tp_weaklistoffset */
171
Noddy_methods, /* tp_methods */
172
Noddy_members, /* tp_members */
176
0, /* tp_descr_get */
177
0, /* tp_descr_set */
178
0, /* tp_dictoffset */
179
(initproc)Noddy_init, /* tp_init */
181
Noddy_new, /* tp_new */
184
static PyModuleDef noddy4module = {
185
PyModuleDef_HEAD_INIT,
187
"Example module that creates an extension type.",
189
NULL, NULL, NULL, NULL, NULL
197
if (PyType_Ready(&NoddyType) < 0)
200
m = PyModule_Create(&noddy4module);
204
Py_INCREF(&NoddyType);
205
PyModule_AddObject(m, "Noddy", (PyObject *)&NoddyType);