En Mon, 20 Jul 2009 22:53:59 -0300, Esmail <ebo...@hotmail.com> escribió:

Gabriel Genellina wrote:
 >
If you follow the above suggestions, you'll see that your Function class becomes almost useless: a normal function already IS an object, so you don't have to wrap it inside ANOTHER object unless you need very special features.

Hello Gabriel,

In general I would agree with you, but in my specific case
I want so store some additional meta-data with each function, such
as the valid range for input values, where the max or minimum are located,
the name/source for the function etc. I am creating list of functions
for use in testing optimization code, so it seems best to store this
data along with the function I am going to optimize in order to verify
the results for a given range (for instance).

You can store all meta-data in the function itself:

py> def triangle(b, h):
...   "area of triangle: b*h/2"
...   return b*h/2
...
py> triangle.foo = "some value"
py> triangle.foo
'some value'

Python already knows some properties:

py> triangle.func_code.co_argcount
2
py> triangle.func_doc
'area of triangle: b*h/2'
py> triangle.__doc__
'area of triangle: b*h/2'

You may use this variant of Carl Banks proposal - this is a factory function that returns new function objects:

def inline_function_factory(name, args, expr):
  ns = {}
  exec '''def %s(%s):
            %r
            return %s''' % (
    name, args, expr, expr) in ns
  function = ns[name]
  return function

py> sqr = inline_function_factory("square", "x", "x*x")
py> sqr(3)
9
py> sqr.__doc__
'x*x'
py> sqr
<function square at 0x00B46770>

Wrapping a function object isn't necesarily bad, but perhaps you're doing things more complicated than should be.

--
Gabriel Genellina

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

Reply via email to