"Brendan" <[EMAIL PROTECTED]> wrote in message 
news:[EMAIL PROTECTED]
> I have a function, call it F(x), which asks for two
> other functions as arguments, say A(x) and B(x).  ...

If I understand this and the rest, a third party library whose code you 
cannot modify (easily) has a function F with (at least) three parameters: 
A, B, and x.  During its operation, F calls A(x) and B(x).  Because of code 
commonality for the particular A and B arg funcs you want to feed to F, you 
want avoid duplication by having the first call to either to calculate both 
return values.

If F calls each of A and B exactly once and always in the same order and 
only for the value x you supply, the solution is pretty easy.  A calls AB, 
stashes the B value away where it can be retrieved, and return the A value. 
B retrieves the B value and returns it.  But your problem is the stash and 
retrieve part.  Solutions:
1. global variable (easiest)  - use global declaration in A;
2. closure variable - use mutable such as 1 element list (see below);
3. instance attribute - with A and B as methods.

2 is what you tried to do, but without knowing the mutable (list or dict) 
trick:

def ABwrapper():
  bsave = [None]
  def A(x):
    aval,bval = AB(x)
    bsave[0] = bval
    return aval
  def B(x):
    return bsave[0]
  return A,B

This works because A does not try to *rebind* bsave to a new object.  It 
only mutates the existing object.

If the order of calling changes, you need more logic.  If F calls A and B 
on multiple 'x's, as with, for instance, a derivative approximizer, then I 
would memoize A and/or B using the recipe posted here more than once and on 
the cookbook site and included in the new Python Cookbook v2 (and maybe v1, 
don't have it).

Terry J. Reedy



-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to