Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义python模块中的分层名称空间_Python_Module_Namespaces - Fatal编程技术网

自定义python模块中的分层名称空间

自定义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

已尝试搜索网站,但找不到我的问题的答案:

假设我有一个名为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()
'''

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__)