Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Passing functions around and executing

0 views
Skip to first unread message

PatrickMinnesota

unread,
May 14, 2008, 8:53:30 PM5/14/08
to
I've been reading the docs and looking for an answer and seem stuck.
I'm either not looking in the right places or not understanding what
I'm reading.

I have a bunch of functions. I want to put them in a list. Then I
want to pass that list into another function which does some setup and
then loops through the list of passed in functions and executes them.
Some of them need arguments passed in too.

Can someone point me to where to read about this? I know it's do-able
since it's basically doing something like a callback would do.

Thanks for any pointers.

alex23

unread,
May 14, 2008, 10:56:15 PM5/14/08
to
On May 15, 10:53 am, PatrickMinnesota <PatrickMinnes...@gmail.com>
wrote:

> I have a bunch of functions. I want to put them in a list. Then I
> want to pass that list into another function which does some setup and
> then loops through the list of passed in functions and executes them.
> Some of them need arguments passed in too.

Hey Patrick,

Is something like the following helpful?

>>> def fn1(): print 'fn1'
>>> def fn2(): print 'fn2'
>>> fn_list = [fn1, fn2]
>>> def process(fn_seq):
... # do set up here
... for fn in fn_list:
... fn()

>>> process(fn_list)
fn1
fn2

The easiest way to extend this for optional argument passing would be
to have each function accept keyword arguments, and then to pass a
dictionary of arguments in to each:

>>> def fn1(**kwargs): print 'fn1'
>>> def fn2(**kwargs): print 'fn2: x=%(x)s' % kwargs
>>> fn_list = [fn1, fn2]
>>> def process(fn_seq):
... x = 'hello'
... for fn in fn_list:
... fn(**locals())

>>> process(fn_list)
fn1
fn2: x=hello

You could replace 'process' with a list comprehension:

>>> args = dict(x='hello again')
>>> results = [f(**args) for f in fn_list]
fn1
fn2: x=hello again

Or use 'map':

>>> process = lambda f: f(**args)
>>> results = map(process, fn_list)
fn1
fn2: x=hello again

Sorry, I'm a little bored.

- alex23

Arnaud Delobelle

unread,
May 15, 2008, 2:17:19 AM5/15/08
to
alex23 <wuw...@gmail.com> writes:

> On May 15, 10:53 am, PatrickMinnesota <PatrickMinnes...@gmail.com>
> wrote:
>> I have a bunch of functions. I want to put them in a list. Then I
>> want to pass that list into another function which does some setup and
>> then loops through the list of passed in functions and executes them.
>> Some of them need arguments passed in too.
>
> Hey Patrick,
>
> Is something like the following helpful?
>
>>>> def fn1(): print 'fn1'
>>>> def fn2(): print 'fn2'
>>>> fn_list = [fn1, fn2]
>>>> def process(fn_seq):
> ... # do set up here
> ... for fn in fn_list:
> ... fn()
>
>>>> process(fn_list)
> fn1
> fn2
>
> The easiest way to extend this for optional argument passing would be
> to have each function accept keyword arguments, and then to pass a
> dictionary of arguments in to each:
>

Or you could wrap your functions in functools.partial:

def foo(n):
return 'x'*n

>>> from functools import partial
>>> foo10 = partial(foo, 10)
>>> print foo10()
xxxxxxxxxx

HTH

--
Arnaud

0 new messages