Suggesting a new feature - "Inverse Generators"

Michael Spencer mahs at telcopartners.com
Fri Mar 25 13:41:49 EST 2005


Jordan Rastrick wrote:
> Wow, if I'm going to get replies (with implemented solutions!) this
> quickly, I'll post here more often :-)

That is indeed typical of this most attentive group :-)
> 
> Its taken me a while to get a rough understanding of this code, but I
> think I have some idea. 
It is just an example jotted in 2 min - no doubt it could be made clearer.

> Correct me if I'm wrong.
> groupby groups based on value of line(record)
> 
No, groupby, groups on the value of record(item), where item is given by 
iterating over linesource

You should check the itertools documentation:
http://docs.python.org/lib/itertools-functions.html

> Record returns 1 for the first line, 1 of the second, 1 for the 3rd,
> then 2 for the 4th because seq[0] gets incremented since len(line) > 20

In this case, it doesn't matter what record returns, as long as it is equal for 
successive values of item that should be grouped
> 
> OK thats fair enough. But how does record retain state between calls?
> How is that related to the fact your storing your value as a singleton
> list, instead just an int?

You are asking about the fundamental behavior of Python: argument passing, 
mutable objects and scopes.
> 
> It seems a little confusing to be honest, probably mainly due to my
> unfamiliarity with groupby. Retaining state between method calls is
> part of what interests me so much about the Generator/ Acceptor case.
> Here youre retaining state between calls with none of the special
> syntax used for example in Generators.
> 
> How? Is it a side effect of the way groupby uses record? If so, then
> thats a littleoblique and unreadable for my liking.

No, it's nothing special about groupby.  record simply stores its state in a 
mutable default parameter.  This isn't general good practice: at least you have 
to be careful with it.  You can see the behavior in the following example:
  >>> def accumulate(value, accum = []):
  ...     accum.append(value)
  ...     return accum
  ...
  >>> accumulate(1)
  [1]
  >>> accumulate(2)
  [1, 2]
  >>> accumulate(6)
  [1, 2, 6]
  >>>

...
> 
> Still, this is fascinating.... going to have to spend some time
> experimenting with groupby as soon as I get a chance....
> 
Experimenting is good.  So is the the documentation: 
http://docs.python.org/tut/tut.html

Michael




More information about the Python-list mailing list