itertools candidate: warehouse()

Robert Brewer fumanchu at amor.org
Tue Oct 19 13:53:05 EDT 2004


Raymond Hettinger wrote:
> > "Robert Brewer" <fumanchu at amor.org> wrote ...
> > 
> > def warehouse(stock, factory=None):
> 
> Here are some random thoughts based on a first read through:
> 
> * The basic idea of iterating stock and then calling a 
> factory when the
> stock is depleted is already expressible in terms of itertools.  For
> example, if random.random() is the factory:
> 
>    iavailable = chain(stock, starmap(random.random, repeat(())))

Ah, thanks! The docs don't really make it clear that you can pass a
callable to repeat() and have it be called on each iteration. The Python
"equivalent" given in the docs looks like you get the same static object
every time... :/

> * The second iterator, iremainder, ventures well beyond the basic idea
> of a warehouse/factory chain.  It pushes the learning curve up steeply
> and makes the function less generic (i.e. plenty of situations that
> could use the warehouse/factory chain have no need for the separate
> iremainder iterator).

True. Dang, I wish generators could take attributes; I would've attached
iremainder there instead and reduced the learning curve a bit for those
who don't need that feature.

> * Making the factory argument optional is, IMO, also trying to do too
> much.  Using the first stock item to identify a type and then calling
> the type is probably more appropriate for prototype based OO 
> (i.e. with objects designed for cloning operations).  Also, the number

> of potential uses is limited because knowing the type does not imply
> that you know the signature for the constructor or that you can infer 
> argument values for constructors that take arguments.

The uses are limited only when you do not supply the factory argument;
when I need constructor arguments, I make a factory function for the
class and pass that for the 'factory' arg.

> * This function has not seen real world use outside your organization.

Right.

> Posting it as an ASPN recipe might give it a chance to be 
> kicked around a bit and perhaps re-emerge in a more mature form.

The cookbook is a good idea (this makes a better recipe than a module
func; I agree 100%). But I don't find ASPN a place which stimulates
"kicking things around", because there's no critical community mass.
c.l.p is still better for that, IMO.

> * Most of the itertools and their kin only try to encapsulate 
> a tiny bit
> of logic (enumerate and takewhile for example).  Even the most complex
> tool, groupby(), is built around an atomic idea (roughly akin to the
> uniq filter in Unix uniq).  The bite sized approach enables 
> itertools to
> simplify code without obscuring the program logic.  IMO, the proposed
> warehouse() function does not share that advantage (though it is
> possible that repetition may allow ones mind to eventually 
> condense the
> logic into a managable unit of thought).

Agreed. Thanks for the feedback!


Robert Brewer
MIS
Amor Ministries
fumanchu at amor.org



More information about the Python-list mailing list