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
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