exec'ing functions (WAS: updating locals() and globals())

Jeff Shannon jeff at ccvcorp.com
Thu Dec 9 02:21:43 CET 2004

Steven Bethard wrote:

> Jeff Shannon wrote:
>> Note also that functions which use exec cannot use the static 
>> namespace optimization, and thus tend to be *much* slower than normal 
>> functions 
> In what circumstances will this be true?  I couldn't verify it:
> [...]
> exec """\
> def fib2(n):
>     a, b = 0, 1
>     while True:
>         a, b = b, a + b
>         yield a
> """

I was referring to functions which have an internal exec statement, not 
functions which are created entirely within an exec -- i.e., something 
like this:

def fib3(n):
    a, b = 0, 1
    while True:
        exec "a, b = b, a + b"
        yield a

In your fib2(), when the function is defined, the entire contents of the 
local namespace can be determined (it's just that the function isn't 
"defined" until the exec statement is executed).  In fib3(), when the 
function is defined, the parser can't determine what's happening inside 
the exec statement (it just sees a string, and that string may depend on 
other runtime circumstances which will happen latter), so it can't say 
for certain whether names other than a and b are created.  (Consider the 
case where the string to be exec'ed is passed in as a function argument...)

Jeff Shannon
Credit International

More information about the Python-list mailing list