On Sun, 21 Mar 2010 16:57:40 +0000, kj wrote: > Just accessing attributes looks a bit dangerous to me, due to bugs like > typing > > i.typo = 'foo' > > when what you meant is > > i.type = 'foo'
That's the price you pay for using a dynamic language like Python with no declarations. But honestly, the price isn't very high, particularly if you use an editor or IDE with auto-completion. I can't think of the last time I had an error due to the above sort of mistake. Besides, is that error really so much more likely than this? i.type = 'fpo' when you meant 'foo'? The compiler can't protect you from that error, not in any language. > I tried fixing this by mucking with __setattr__, but I didn't hit on a > satisfactory solution (basically, I couldn't find a good, > self-maintaining, way to specify the attributes that were OK to set from > those that weren't). Is there anything built-in? No. You could abuse __slots__, but it really is abuse: __slots__ are a memory optimization, not a typo-checker. In Python 3.x, you can (untested) replace the class __dict__ with a custom type that has more smarts. At the cost of performance. This doesn't work in 2.x though, as the class __dict__ is always a regular dictionary. Something like this might work, at some minor cost of performance: # Untested def __setattr__(self, name, value): if hasattr(self, name): super(MyClassName, self).__setattr__(name, value) else: raise TypeError('cannot create new attributes') Then, in your __init__ method, to initialise an attribute use: self.__dict__['attr'] = value to bypass the setattr. Or you can use something like PyChecker or PyLint to analyse your code and warm about likely typos. But really, it's not a common form of error. YMMV. > Regarding properties, is there a built-in way to memoize them? For > example, suppose that the value of a property is obtained by parsing the > contents of a file (specified in another instance attribute). It would > make no sense to do this parsing more than once. Is there a standard > idiom for memoizing the value once it is determined for the first time? Google for "Python memoization cookbook". This will get you started: http://code.activestate.com/recipes/52201/ Then just apply the memoize decorator to the property getter. -- Steven -- http://mail.python.org/mailman/listinfo/python-list