Istvan Albert wrote:
Steven Bethard wrote:

 > The question is not how easy it is to write,
 > but how many times it's going to get written.

but with that logic we could  create a standard
"looping" construct called loop(x) that would stand in for

for i in range(x):

IMHO, that example is quite the opposite of what you are advocating. range() is a simple function, and one which could be written by anyone with little chance of flaw. Why not do:


i = 0
while i < x
    ...
    i += 1

? The three arguments to range are all present (how valuable are a few defaults). It's more general. You can extend it and modify it easily. These are all the same properties of bunch. Easy things have value; maybe that applies here, but saying that it is easy is not the same as saying it isn't valuable. For instance, we now have the sorted function, equivalent to:

def sorted(lst, *args, **kw):
    lst = list(list)
    lst.sort(*args, **kw)
    return lst

People have been writing this function over and over. Only there are a few subtlely different ways you can implement it, and you'll never know which from the function name alone. dict's keyword argument constructor is similar. And maybe bunch is similar; at least, I'd argue for or against it based on that, not merely on how easy it is to reimplement. "If the implementation is easy to explain, it may be a good idea." (import this)

If it existed, I'd probably use it some where I'm currently using dictionaries (but where I don't want to give the data behavior), and I'd probably subclass it. Now, when it doesn't exist, I frequently implement the behavior in classes that have other logic as well, and I almost never use it without logic; I use dict() with its keyword argument constructor, and just suffer the quotation marks when I'm retrieving members.

BTW, in class that look like bunch, I usually implement it like:

class bunch(object):
    def __init__(self, **kw):
        for name, value in kw.items():
            # IMPORTANT!  This is subclass friendly: updating __dict__
            # is not!
            setattr(self, name, value)

    def __call__(self, **kw):
        # I'm not entirely happy with this:
        new_values = self.__dict__.copy()
        new_values.update(kw)
        return self.__class__(**new_values)

--
Ian Bicking  /  [EMAIL PROTECTED]  /  http://blog.ianbicking.org
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to