how can I execute a function string
Hans Nowak
hans at zephyrfalcon.org
Mon Jan 12 21:53:10 EST 2004
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 (hans at zephyrfalcon.org)
http://zephyrfalcon.org/
More information about the Python-list
mailing list