Steven Bethard <[EMAIL PROTECTED]> wrote: > Seems pretty reasonable -- the only thing I worry about is that > classmethods and other attributes (e.g. properties) that are accessible > from instances can lead to subtle bugs when a user accidentally > initializes a Bunch object with the attributes of the same name, e.g.: > > b = Bunch(getDict=1) > > where > > b.getDict() > > now fails with something like "TypeError: 'int' object is not callable".
Well, that's the problem with confusing items and attributes in the first place, of course -- which IS Bunch's purpose;-) > (For another discussion about this problem, see [1]). > > I don't know what the right solution is here... I wonder if I should > write a classmethod-style descriptor that disallows the calling of a > function from an instance? Or maybe I should just document that the > classmethods should only be called from the class? Hmm... Another approach is to add a few "reserved words" to the ones Python itself would reject in the initialization. Just you cannot do: b = Bunch(continue=23) you may choose to forbid using getDict=42 - if you do that you probably want to forbid any magicname too, since e.g. b = Bunch(__dict__=99) can't work ``right'' no matter what, while setting e.g. __deepcopy__ similarly might confuse any copy.deepcopy(b), etc, etc. > How do you feel about getDict and setDict also being classmethods? Uh? I want to get or set the dict of a specific instance -- not those of the whole class. How would you design them as classmethods...? Alex -- http://mail.python.org/mailman/listinfo/python-list