例外它不清楚,如果您更难以用写入识别表达式的长度,或者使用后在名称空间中留下剩余标识符的痕迹。
顺便说一句,如果你通过os.path.abspath
和os.path.dirnames
访问功能,这是不正确的说,功能(我想你的意思是他们的名字)垃圾的命名空间。由于它们属于模块os或os。路径(取决于哪一个已导入),只有模块名称'os'或'os.path'位于命名空间中,而模块对象位于内存中,而不是函数的名称直接在命名空间中。
因此,可以创建名为 “heavy_code.py” 的脚本:
def doing(x):
from os.path import abspath as a,dirname as d
## Execute all the desired processes and creations
def fufu(s,t):
return s+t
dedex = d[x]
#.........
#...........
#........
#............
#..........
## Return to the calling scope all that is needed there
return (dedex,fufu)
和主模块中,以gnibbler的回答帐户:
one_path = 'I:/all/magala/zeru/kiol.py'
try:
from pp.bududu import doing
w,ff = doing(one_path)
finally:
del doing
。
要看看它是如何工作的:在
in try :
['__builtins__', '__doc__', '__name__', '__package__', 'doing', 'one_path']
executing doing()
['__builtins__', '__doc__', '__name__', '__package__', 'doing', 'ff', 'one_path', 'w']
after finally :
['__builtins__', '__doc__', '__name__', '__package__', 'ff', 'one_path', 'w']
w == I:/all/magala/zeru
ff(10,12) == 22
的片段执行后,该函数做()不存在了:
one_path = 'I:/all/magala/zeru/kiol.py'
try:
from pp.bududu.heavy_code import doing
print "in try : "
print dir()
print "executing doing()"
w,ff = doing(one_path)
print dir()
finally:
del doing
print "\nafter finally : "
print dir()
print '\nw ==',w
print 'ff(10,12) ==',ff(10,12)
产生结果主模块,而是由做执行()现在躺在它没有名字的主模块的名称空间杂波创建的对象。此外,函数doing()内所需的所有标识符都是本地的。
所有需要的和需要的对象的创建可以委托给该模块heavy_code,不管他们有多少,而进口和执行功能做()只需要两行的主要模块,并功能做()在heavy_code加上其呼叫线可以很容易地修改。
是不是模块设计用于什么?
我认为“封闭”在这里不是合适的词。请参阅http://en.wikipedia.org/wiki/Closure_(computer_science)。也许“临时命名空间”是你的意思? –
@RaymondHettinger - 我认为这个词是'范围'。 “我可以在Python中定义除函数,模块全局或内置之外的范围吗?” – Omnifarious
通常,当你使用合理数量的代码行编码某个属于某个函数或方法的东西时。因此,“抛弃全局命名空间”应该不是问题,或者您的代码可能需要重新设计,而不是“范围”。 – MatthieuW