Scope (?) question

Peter Otten __peter__ at web.de
Wed Jun 16 05:05:55 EDT 2010


Inyeol Lee wrote:

> On Jun 15, 3:22 pm, Peter <peter.milli... at gmail.com> wrote:
>> I am puzzled by what appears to be a scope issue - obviously I have
>> something wrong :-)
>>
>> Why does this work:
>>
>> if __name__ == 'main':
>> execfile('test-data.py')
>> print data
>>
>> and yet this doesn't (I get "NameError: global name 'data' not
>> defined"):
>>
>> def X():
>> execfile('test-data.py')
>> print data
>>
>> where test-data.py is:
>>
>> data = [1,2,3,4]
>>
>> I checked help on execfile and could only find the following
>> (mystifying) sentence:
>>
>> "execfile() cannot be used reliably to modify a function’s locals."
>>
>> Thanks
>> Peter
> 
> This is due to CPython's static optimization of local name lookup.
> Dummy 'exec' statement disables this and makes your example work:
> 
> def X():
>   exec "None"
>   execfile('test-data.py')
>   print data
> 
> --inyeol

You may also consider the following alternative:

def f():
  ns = {}
  execfile('test-data.py', ns)
  print ns["data"]

f()

This has the advantage that it can be automatically converted to Python 3.

Peter



More information about the Python-list mailing list