En Tue, 25 Mar 2008 17:17:16 -0300, j vickroy <[EMAIL PROTECTED]> escribió:
> Arnaud Delobelle wrote: >> On Mar 25, 6:13 pm, j vickroy <[EMAIL PROTECTED]> wrote: >>> Hello, >>> >>> Here is some pseudo-code that hopefully illustrates what I want to do: >>> >>> records = list(...) >>> for record in records: >>> new_fcn = define_a function_for(record) >>> instance = my_new_class_instance() >>> setattr(instance, 'myfcn', new_fcn) >>> instance.execute() # instance.execute() calls instance.myfcn(*args) >>> >>> I have looked at some of the functions in the *new* module and >>> new.code(...), new.function(...), and new.instancemethod(...) appear to >>> do what I want, but I do not know how to use new.code() and >>> new.function() -- specifically what its *global* parameter should be. >> >> The best way to understand how new.function and new.code work is to >> look at the Python source. (Objects/funcobject.c and Objects/ >> codeobject.c, actual objects are defined in and Include/funcobject.h >> Include/code.h). >> >> However, to create a function dynamically in Python it is often no >> more trouble than a def statement: > > As per your suggestion, I tried looking at include/code.h and > include/funcobject.h (my MS Windows distribution does not appear to > contain .c files). However, since I'm not a C programmer, I did not > find the .h files all that helpful. It's not really necesary to look at the source - just define the desired function in Python. > What I failed to make clear in my original posting is that the functions > must be created dynamically using information in a *record* as the code > iterates over all *records*. So, I can not pre-define the functions and > then simply select the desired one at run-time. It doesn't matter *how* you define the function. It may use the record argument too. See this silly and contrived example: def define_a function_for(record): if hasattr(record, 'foo'): def function_float(self, arg1, arg2): return arg1*float(record.foo) + arg2 def function_str(self, arg1, arg2): return arg1+arg2+len(record.foo) if isinstance(record.foo, str): return function_str else: return function_float elif hasattr(record, 'bar') and isinstance(record.bar,basestring): def function(self, arg1, arg2): return self.other(record.bar.index(arg1)) - record.bar.index(arg2) return function else: def function(self, *args): return 0 return function Plug this into your "framework" above and it should work. You don't have to use new.* -- Gabriel Genellina -- http://mail.python.org/mailman/listinfo/python-list