Matthew Wilson wrote: > I sometimes inadvertently create a new attribute on an object rather > update a value bound to an existing attribute. For example: > (snip) > > I meant to update c.a but I created a new c.A. I make this mistake > probably hourly. > > I suspect adding attributes at run time can be a beautiful thing, but in > this particular instance, I'm only using this feature to hurt myself.
See other posts in this thread for some other possible solutions. > I wrote a simple class that will warn me when I make this mistake in the > future: > > import warnings > > class C(object): > > warn_on_new_attributes = True > > standard_attributes = [] > > def __setattr__(self, name, value): > > if self.warn_on_new_attributes \ > and name is not 'warn_on_new_attributes' \ > and name not in self.standard_attributes: > > warnings.warn("%s has no standard attribute %s." > % (self.__class__.__name__, name)) > > > self.__dict__[name] = value Make it: object.__setattr__(self, name, value) Your approach will lead to strange results if you mix it with properties or other descriptors... > class C1(C): > > standard_attributes = ['a1', 'a2'] DRY violation here. And a potential problem with inheritance (as always with class attributes). (snip) -- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in '[EMAIL PROTECTED]'.split('@')])" -- http://mail.python.org/mailman/listinfo/python-list