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