From: John Nagle on 30 Jul 2010 14:04 I've been looking at existing code, using Google Code search, to see what use cases for "setattr" are actually used in production code. High-performance implementations like Shed Skin try to avoid dynamic creation of attributes, so it's worth seeing where this feature is used in production. 1. Copying "setattr" is used by "copy" and "pickle" to construct new objects without calling their constructors. This is seen only in code which also uses the CPython feature that the class of an object can be changed by storing into the "__class__" attribute. 2. Proxying A local object is being created as a proxy for some remote object. This shows up in the Python shim for Remember the Milk, in the wrapper for a restricted execution shell "rexec.py" 3. Representation of some other data structure. This is typically seen where some XML or JSON structure has been translated into a tree of Python objects, and attribute access is being used to access the data from the original object. This can result in name clashes with existing attributes and keywords. Used by BeautifulSoup. 4. Ordered dictionaries "odict.py" uses "setattr", but with the comment "FIXME", noting that unrestricted "setattr" can break the built-in attributes. 5. Enums The Google Wave API uses "setattr" in StringEnum, which creates an enumeration-like object. 6. Test platforms "setattr" is used in "Mocker" to insert shim objects for test purposes. This is a special case of proxying. Note that in all the above cases, "setattr" is being used during (or even prior to) object construction. It's rarely used on "live" objects. For the above cases, a mechanism for constructing general objects would do the job. Something like attrdict = { 'a' : 1, 'b' : 2 } obj = make_object('classname', attrdict) There are clearly use cases for dynamic object construction, but modifying the structure of an object after creation is quite rare. John Nagle
|
Pages: 1 Prev: Access stdout from external program. Next: ImportError: No module named binascii |