Rajarshi Guha wrote:
> Hi ,
> I have some code that generates a function on the fly in a string.
> At a later point in time I want to execute this function (which also
> requires a parameters to be passed to it). So the code is something like
> this:
>
> def generate_func():
> s = """ def function(x):
> print x
> return 2
> """
> return s
>
> funcstring = generate_func()
> retval = ....
>
> That is, retval should have the value returned from the evaluation of the
> function in the string funcstring.
>
> Is this possible by means of simple function calls or does this involve
> some sort of black magic?
It's possible:
>>> def generate_func():
.... s = """def f(x):
.... print x
.... return 2"""
.... d = {}
.... exec s in d
.... return d['f']
....
>>>
>>> g = generate_func()
>>> g(4)
4
2
>>>
....but this way of doing it has several drawbacks. For example, exec is picky
about the strings it accepts; e.g. if you leave a trailing newline you get a
syntax error. Compare:
>>> def generate_func():
.... s = """def f(x):
.... print x
.... return 2
.... """
.... d = {}
.... exec s in d
.... return d['f']
....
>>> g = generate_func()
Traceback (most recent call last):
File "<input>", line 1, in ?
File "<input>", line 7, in generate_func
File "<string>", line 4
^
SyntaxError: invalid syntax
Also, if the string containing the syntax comes from an "untrusted source",
then it's a potential security hazard.
I'm not sure what you're trying to do here, but you might want to consider
generating an actual function, rather than a string to be evaluated:
>>> def generate_func():
.... def f(x):
.... print x
.... return 2
.... return f
....
>>> h = generate_func()
>>> h(5)
5
2
HTH,
--
Hans ()
http://zephyrfalcon.org/