pre-PEP: Simple Thunks

Ron_Adam radam2_ at _tampabay.rr.com
Sun Apr 17 21:24:47 EDT 2005


On Sun, 17 Apr 2005 15:02:12 -0700, Brian Sabbey
<sabbey at u.washington.edu> wrote:

Brian Sabbey wrote:

> I'm kicking myself for the first example I gave in my original post in 
> this thread because, looking at it again, I see now that it really gives 
> the wrong impression about what I want thunks to be in python.  The 
> 'thunkit' function above shouldn't be in the same namespace as the thunk. 
> It is supposed to be a re-usable function, for example, to acquire and 
> release a resource.  On the other hand, the 'foo' function is supposed to 
> be in the namespace of the surrounding code; it's not re-usable.  So your 
> example above is pretty much the opposite of what I was trying to get 
> across.

This would explain why I'm having trouble seeing it then.


> def pickled_file(thunk, name):
>  	f = open(name, 'r')
>  	l = pickle.load(f)
>  	f.close()
>  	thunk(l)
>  	f = open(name, 'w')
>  	pickle.dump(l, f)
>  	f.close()
>
> Now I can re-use pickled_file whenever I have to modify a pickled file:
>
> do data in pickled_file('pickled.txt'):
>  	data.append('more data')
>  	data.append('even more data')
>
> In my opinion, that is easier and faster to write, more readable, and less 
> bug-prone than any non-thunk alternative.
>

The above looks like it's missing something to me. How does 'data'
interact with 'thunk(l)'?  What parts are in who's local space?  
	

This might be the non-thunk version of the above. 

def pickled_file(thunk, name):
 	f = open(name, 'r')
 	l = pickle.load(f)
 	f.close()
 	thunk(l)
 	f = open(name, 'w')
 	pickle.dump(l, f)
 	f.close()

def data_append(L):
	L.append('more data')
	L.append('still more data')

pickled_file(data_append, name)

I don't think I would do it this way.  I would put the data
list in a class and add a method to it to update the pickle file. Then
call that from any methods that update the data list.


>> def with_file:				# no argument list, local group.
>> 	f = open(filename)
>> 	t = callback(f)
>> 	f.close
>>
>> def my_read(f):
>> 	return f.read()
>>
>> callback = my_read
>> filename = 'filename'
>> do with_file
>
> This wouldn't work since with_file wouldn't be re-usable.  It also doesn't 
> get rid of the awkwardness of defining a callback.

As long as the name with_file isn't rebound to something else it could
be used as often as needed.  I admit there are better ways to do it
though.


Cheers,
Ron







More information about the Python-list mailing list