其他答案表明import
真的有效。
本聲明:
import foo
大約相當於本聲明:
foo = __import__('foo', globals(), locals(), [], -1)
也就是說,它會在當前範圍內使用相同的名稱所請求的模塊的變量,並且受讓人它是調用__import__()
與該模塊名稱和一堆默認參數的結果。
__import__()
功能處理從概念上將字符串('foo'
)轉換爲模塊對象。模塊緩存在sys.modules
,這是第一個__import__()
看起來 - 如果sys.modules有一個條目'foo'
,這就是__import__('foo')
將返回,無論它是什麼。它真的不關心這種類型。你可以親自看到這一點;嘗試運行下面的代碼:
import sys
sys.modules['boop'] = (1, 2, 3)
import boop
print boop
撇開風格擔憂的時刻,有一個import語句中的函數工作你會如何想。如果之前從未導入模塊,則會將其導入並緩存在sys.modules中。然後它將該模塊分配給具有該名稱的局部變量。它確實不是不是修改任何模塊級別的狀態。它確實可能會修改某些全局狀態(向sys.modules添加一個新條目)。
這就是說,我幾乎從來沒有在一個函數裏面使用import
。如果導入模塊會在你的程序中產生明顯的減速 - 就像它在靜態初始化中執行長計算一樣,或者它只是一個巨大的模塊 - 並且你的程序實際上很少需要模塊來完成任何事情,它使用的功能。 (如果這太令人厭惡,Guido會跳進他的時間機器並更改Python以防止我們這樣做。)但是,通常,我和一般Python社區將所有導入語句放在模塊範圍的模塊頂部。
這將是一個非常好的「with(import StringIO)as moduleName:syntax – JeremyKun 2012-02-07 21:31:37
@Bean:如果這樣你不必輸入長或笨拙的模塊名稱,那麼有一個簡單的方法:''導入StringIO'然後'sio = StringIO',現在你可以執行'file_handle = sio.StringIO('hello world')'並保存那些寶貴的五個字符,但我會盡量少用這個,因爲它可以使代碼變得更難(這項任務很容易被忽略;非標準的模塊名稱可能會讓人分心) – cvoinescu 2012-05-02 21:30:32