Ed Singleton wrote: > How can I pass a block of code to a function for it to perform within itself? > > For example, I wrote a small function that recurses through a > directory structure but keeps a track of the depth: > > What I want to do is something like: > > from path import path > > def traverse(directory, depth=0, things_to_do()): > thedir = path(directory) > for item in thedir.files(): > things_to_do(depth) > for item in thedir.dirs(): > traverse(item,depth+1) > > Is this possible?
Easy, actually! You almost have it. Functions are 'first-class objects' in Python. What that means is that a function is an object as much as a list or an integer. When you define a function, you are actually binding the function object to the name you use in the def. For example: >>> def printer(x): ... print x ... >>> printer <function printer at 0x00A3CAF0> The name 'printer' is now bound to a function object. Functions can be bound to other names or passed as parameters to functions (or stored in lists, or...). Here is a function that takes a function as a parameter and calls the passed-in function several times: >>> def test(fn): ... for x in [1, 2, 10]: ... fn(x) To call this function with the printer function as a parameter is just like any other function call: >>> test(printer) 1 2 10 So in your case, just remove the excess parens in your function definition. (You have to reorder the params since keyword params have to follow non-keyword params): def traverse(directory, things_to_do, depth=0): Then define your things_to_do function (which can be called whatever you want) as a function of one argument: def do_something(depth): print depth and call traverse passing this as an argument: traverse(myDir, do_something) You also have to change the recursive call to traverse(), you must pass the things_to_do parameter: for item in thedir.dirs(): traverse(item,things_to_do,depth+1) By the way this is a very powerful capability of Python. Your usage is a good example of customizing the behaviour of a function by passing another function as a parameter. You can also build lists or dicts of dispatch functions, wrap functions to modify their behaviour, etc... Kent -- http://www.kentsjohnson.com _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor