----- Original Message ----- From: "Tim Peters" <tim.one@comcast.net> > > A long time ago I wrote to Guido suggesting that I might like to submit > > some patches to improve the comprehensibility of the Python source. > > ... > > I hope it looks like an improvement to people, but please let me know > > if it does not. > > I assume there was something wrong with the patch as posted, as it looked > like the new code used 1-space indents. It also looked like it was made > against an out-of-date version of typeobject.c (please use current CVS as a > base -- the newer type/class code is unusually volatile). Fixed. Comments appreciated. The new code is appended for easy perusal -Dave ----- static PyObject * type_getattro(PyTypeObject *type, PyObject *name) { PyTypeObject *metatype = type->ob_type; PyObject *meta_attribute, *attribute; descrgetfunc meta_get; /* Initialize this type (we'll assume the metatype is initialized) */ if (type->tp_dict == NULL) { if (PyType_Ready(type) < 0) return NULL; } /* No readable descriptor found yet */ meta_get = NULL; /* Look for the attribute in the metatype */ meta_attribute = _PyType_Lookup(metatype, name); if (meta_attribute != NULL) { meta_get = meta_attribute->ob_type->tp_descr_get; if (meta_get != NULL && PyDescr_IsData(meta_attribute)) { /* Data descriptors implement tp_descr_set to intercept * writes. Assume the attribute is not overridden in * type's tp_dict (and bases): call the descriptor now. */ return meta_get(meta_attribute, (PyObject *)type, (PyObject *)metatype); } } /* No data descriptor found on metatype. Look in tp_dict of this * type and its bases */ attribute = _PyType_Lookup(type, name); if (attribute != NULL) { /* Implement descriptor functionality, if any */ descrgetfunc local_get = attribute->ob_type->tp_descr_get; if (local_get != NULL) { /* NULL 2nd argument indicates the descriptor was found on * the target object itself (or a base) */ return local_get(attribute, (PyObject *)NULL, (PyObject *)type); } Py_INCREF(attribute); return attribute; } /* No attribute found in local __dict__ (or bases): use the * descriptor from the metatype, if any */ if (meta_get != NULL) return meta_get(meta_attribute, (PyObject *)type, (PyObject *)metatype); /* If an ordinary attribute was found on the metatype, return it now. */ if (meta_attribute != NULL) { Py_INCREF(meta_attribute); return meta_attribute; } /* Give up */ PyErr_Format(PyExc_AttributeError, "type object '%.50s' has no attribute '%.400s'", type->tp_name, PyString_AS_STRING(name)); return NULL; }
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4