[Alex Martelli] > On Sunday 02 February 2003 11:04 pm, Samuele Pedroni wrote: > > With Guido's 'do': [notice that count is rebindable in the thunk] > > > > class iterclose: > > def __init__(self,iterwclose): > > self.iter = iterwclose > > > > def __call__(self,thunk): > > try: > > for x in self.iter: > > thunk(x) > > finally: > > self.iter.close() > > > > count = 0 > > do iterclose(open('blah.txt')): (line): > > if line.find('Python') >=0: > > count += 1 > > print line, > > OK -- I *don't* get that " (line):" part, and how calling thunk() in > iterclose.__init__ binds/rebinds the local (?) variable line of the thunk. > Looks like black magic to me. Guess I must just be a bit thick > tonight -- sorry. > After staring at this for a minute I figured out what ``(line):`` does. So what you have to realize is that the block (from ``if line...`` to ``print line,`` is passed into ``__call__()`` and bound to ``thunk()``. Now the object bound to ``thunk`` accepts a single argument, named ``line`` in ``thunk``. In ``__call__()`` the variable ``x`` is what is being passed into the thunk code and being bound to ``line``. Phew. =) So, to make sure I am not confuing myself, ``do`` does the following: Instantiates ``iterclose(open('blah.txt'))``. Compiles the block of code that makes up the thunk. It ends up accepting a single argument which bound to ``line``. Calls ``iterclose().__call__(<thunk>)`` and executes it. We all let our heads stop spinning from all that and have a good, stiff drink. =) -Brett
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4