A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from http://mail.python.org/pipermail/python-list/2001-April/102212.html below:

execfile: NameError exception thrown for things in locals()

execfile: NameError exception thrown for things in locals()Robin Thomas robin.thomas at starmedia.net
Thu Apr 5 17:03:46 EDT 2001
At 06:52 PM 4/5/01 +0000, Anthony Seward wrote:
>I'm missing something subtle about the use of execfile.  All that
>I want to do is something like
>
>   execfile(fn)
>   spam = Spam()

Yes, it is very subtle, and not your fault at all. As a workaround, insert 
the following line in test_execfile:

def test_execfile(fn):
     """
     Try to use 'execfile' to load a class definition
     """
     exec "pass"  # <<< THIS MAKES IT ALL OK
     execfile(fn)
     print '  %s' % str(locals())
     if 'Spam' in locals().keys():
         # __ 'Spam' is in locals() so why does this produce a NameError
         spam = Spam()

I'll try to avoid an overly specific explanation of the glitch:

Python compiles functions with a special optimization: that the only local 
variables that can be loaded by name are variables named as arguments or 
with an assignment = statement. This optimization helps function code run 
MUCH faster; the drawback is that if you dynamically execute code in the 
function's locals environment, any variable names added by that executed 
code won't be accessible, and a NameError will be raised.

So Python does *not* use the optimization if the function's code contains 
any exec statement. But Python does not turn off the optimization if you 
use execfile(), for various reasons not worth getting into here. That 
sucks, but the workaround is to throw in an exec that does nothing. Also, 
you can make sure that execfile() does not use the current locals 
namespace, by passing in a new namespace of your own.

Hey, everyone, is this a known bug with a planned fix?


--
Robin Thomas
Engineering
StarMedia Network, Inc.
robin.thomas at starmedia.net



More information about the Python-list mailing list

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4