自定义python模块中的分层名称空间
已尝试搜索网站,但找不到我的问题的答案: 假设我有一个名为mymodule.py的模块,它包含:自定义python模块中的分层名称空间,python,module,namespaces,Python,Module,Namespaces,已尝试搜索网站,但找不到我的问题的答案: 假设我有一个名为mymodule.py的模块,它包含: def a(): return 3 def b(): return 4 + a() 然后进行以下工作: import mymodule print(mymodule.b()) 但是,当我尝试动态定义模块内容时: import imp my_code = ''' def a(): return 3 def b(): return 4 + a() ''' my
def a():
return 3
def b():
return 4 + a()
然后进行以下工作:
import mymodule
print(mymodule.b())
但是,当我尝试动态定义模块内容时:
import imp
my_code = '''
def a():
return 3
def b():
return 4 + a()
'''
mymodule = imp.new_module('mymodule')
exec(my_code, globals(), mymodule.__dict__)
print(mymodule.b())
然后它在函数b()中失败:
回溯(最近一次呼叫最后一次):
文件“”,第13行,在
文件“”,第6行,在b中
NameError:未定义全局名称“a”
我需要一种在模块中保留分层名称空间搜索的方法,除非模块驻留在磁盘上,否则搜索似乎会失败
有什么区别的线索吗
谢谢,
Rob.这不是
exec()
的设计用途exec()
实际上并没有将它运行的代码“放入”任何模块中,而是在调用exec()
的模块空间中运行它。您已经接近了。您需要告诉exec在一个不同的名称空间中工作,就像这样(请参阅python 3.x底部的注释):
完整示例:
import imp
my_code = '''
def a():
return 3
def b():
return 4 + a()
'''
mymodule = imp.new_module('mymodule')
exec my_code in mymodule.__dict__
print(mymodule.b())
这就是说,我以前没有用过这个,所以我不确定是否有任何奇怪的副作用,但它看起来对我有效
此外,在python文档中还有一个关于“exec in…”的小广告:
更新
您最初的尝试无法正常工作的原因是您传递了当前模块的globals()字典,这与新模块应该使用的globals()不同
此exec行也可以工作(但不如“exec in…”样式漂亮):
更新2:由于exec现在是python 3.x中的一个函数,因此它没有“exec in…”样式,因此必须使用上面的行。那么,exec()是否有任何替代方案可以重现我需要的模块行为?谢谢有Python3.x版本的“exec…in”吗?在exec()函数中似乎找不到它。Thanksit看起来不像。。。请看我的更新,3.x版的“不太漂亮”版本应该可以使用(我还没有尝试过,所以请告诉我它是否可以使用)好的,我已经在python3中测试了
exec(我的代码,我的模块。uu dict,我的模块。u dict u)
,它似乎工作得很好。我已经更新了我的答案,以反映这一点。好吧,我会给它一个镜头,它似乎很有希望(我必须修改我原来的项目的一些东西)。非常感谢。
exec my_code in mymodule.__dict__
import imp
my_code = '''
def a():
return 3
def b():
return 4 + a()
'''
mymodule = imp.new_module('mymodule')
exec my_code in mymodule.__dict__
print(mymodule.b())
exec(my_code, mymodule.__dict__, mymodule.__dict__)