例外它不清楚,如果您更難以用寫入識別表達式的長度,或者使用後在名稱空間中留下剩餘標識符的痕跡。
順便說一句,如果你通過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