Partially evaluated functions

Cliff Crawford cjc26 at nospam.cornell.edu
Wed Jun 20 05:37:09 CEST 2001


* Neil Schemenauer <nas at python.ca> menulis:
| This works in 2.1 (a little more magic is needed for older
| Pythons):
| 
| >>> from __future__ import nested_scopes
| >>> def conv(b, c):
| ...   return lambda a: (a + b) * c
| ... 
| >>> faren2cel = conv(-32., 5./9)
| >>> faren2cel
| <function <lambda> at 0x810f45c>
| >>> faren2cel(10)
| -12.222222222222223
| >>> faren2cel(-40)
| -40.0

Or you could do

faren2cel = lambda a: conv(a, -32.0, 5.0/9)

if you didn't want to redefine conv().

Another way to do it would be to create a class which can keep track of
which arguments have already been assigned to, something like this:

import inspect
class Schoenfinkelizer:
    def __init__(self, func, **kwargs):
        self.func = func
        self.args = {}
        # get list of argument names
        self.argnames = inspect.getargspec(func)[0]
        for arg in self.argnames:
            self.args[arg] = kwargs.get(arg, None)
    def __call__(self, *remainingargs):
        args = []
        for arg in self.argnames:
            if self.args[arg]:
                args.append(self.args[arg])
            else:
                args.append(remainingargs[0])
                # hopefully the right number of args was passed!
                remainingargs = remainingargs[1:]
        return apply(self.func, args)

faren2cel = Schoenfinkelizer(conv, b=-32.0, c=5.0/9)
faren2cel(-40)


But that would be overkill..:)


-- 
Cliff Crawford                   http://www.sowrong.org/
"Cliff, you're a god.  I want to bear your child." -- Ed



More information about the Python-list mailing list