请教:exec code in module.__dict__ ,如何理解?
本帖最后由 seai 于 2013-09-10 00:19:35 编辑
import new
def importCode(code, name, add_to_sys_modules=False):
module=new.module(name)
if add_to_sys_modules:
import sys
sys.modules[name]=module
exec code in module.__dict__ #这句真心没看懂,=={'__name__': 'foo', '__doc__': None}
return module
foofile=open("test.py")
foo=importCode(foofile,"foo",1)
foo.aaa
#test.py
aaa=123
print 123
[解决办法]
exec后可接名字空间,默认情况下: exec code in globals(),loclas(),看如下代码:
In [19]: a=123
In [20]: exec 'print a' in globals(),locals()
123
[解决办法]
没有的话默认就是全局(globals())的名称空间,你可以定义自己的名称空间:
如:
1.
In [21]: a=321
In [22]: exec 'print a' in {},{}
---------------------------------------
NameError Traceback (most recent call last)
C:\Users\yxlink\<ipython console> in <module>()
C:\Users\yxlink\<string> in <module>()
NameError: name 'a' is not defined
2.
In [23]: a=321
In [24]: exec 'print a' in {'a':789},{}
789
[解决办法]
其实这就是Python的变量查找了,在python中,变量查找遵循LGB原则,即优先在局部作用域(local scope)中对变量进行查找,失败则在全局作用域(global scope)中进行查找,最后尝试再内建作用域(build-in scope)内查找。
看下代码:
a=123
b=789
print globals()
print locals()
输出:
{'a': 123, 'b': 789, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'cs.py', '__name__': '__main__', '__doc__': None}
{'a': 123, 'b': 789, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'cs.py', '__name__': '__main__', '__doc__': None}
In [34]: exec 'print a' in {'a':123},{'a':789}
789
应该明白了吧!!!