请教:exec code in module.__dict__ ,如何理解?

seai 2013-09-10 12:15:31
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
...全文
515 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
seai 2013-09-10
  • 打赏
  • 举报
回复
这样也很好玩,
b={'b':789}
c={'c':456}
exec 'a=123\nprint a' in b,c
print b,c
总之还是没太看懂。 是先执行exec语句,然后将变量更新到in所指dict中呢,更新的规则是怎样的? 还是先取出dict中的值,应用到exec语句中,取出应用的规则是怎样的?
seai 2013-09-10
  • 打赏
  • 举报
回复
对比了一下
import new
module=new.module('foo')
exec 'a=123\nprint a'
print module.__dict__
#{'__name__': 'foo', '__doc__': None}
exec 'a=123\nprint a' in module.__dict__
print module.__dict__
#{'__name__': 'foo', '__doc__': None, 'a': 123}
b={}
exec 'a=123\nprint a' in b
print b
#{'a': 123}
看起来是将exec执行后的代码空间中的所有变量,插入到了in所指的dict中。 不知理解是否正确。
yueguanghaidao 2013-09-10
  • 打赏
  • 举报
回复
没有的话默认就是全局(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
seai 2013-09-10
  • 打赏
  • 举报
回复
引用 1 楼 yueguanghaidao 的回复:
exec后可接名字空间,默认情况下: exec code in globals(),loclas(),看如下代码:
In [19]: a=123

In [20]: exec 'print a' in  globals(),locals()
123
我的疑问是,后面接名字空间与不接有什么区别?
a1=123
exec 'a1=234\nprint a1'
print a1 #234
yueguanghaidao 2013-09-10
  • 打赏
  • 举报
回复
exec后可接名字空间,默认情况下: exec code in globals(),loclas(),看如下代码:
In [19]: a=123

In [20]: exec 'print a' in  globals(),locals()
123
seai 2013-09-10
  • 打赏
  • 举报
回复
引用 6 楼 yueguanghaidao 的回复:
其实这就是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
应该明白了吧!!!
你回的已经相当靠谱了,大体上已经可以得出结论,“exec ... in ...”语句中的in与for循环中的in是完全不一样的概念。 不过有点忽略的就是,如果dict中没有相应的key时,exec执行后会设置的。这也是我最初“importCode”函数能够像import语句一样工作的基本原因。
yueguanghaidao 2013-09-10
  • 打赏
  • 举报
回复
其实这就是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
应该明白了吧!!!

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧