2012-03-08 134 views
7

哪種風格更適合?導入模塊級別還是功能級別?

風格答:

def foo(): 
    import some_module 
    some_module.something 

樣式B:

import some_module 

def foo(): 
    some_module.something 

假設some_module未在代碼別處使用,僅此函數內。

回答

15

事實上,正如已經指出的那樣,通常最好遵循PEP 8的建議,並在頂部進行進口。雖然有一些例外。理解它們的關鍵在於你的第二段中的嵌入問題:「進口......在什麼階段發生?」

導入實際上是一個可執行語句。導入模塊時,模塊中的所有可執行語句都會運行。 「def」也是一個可執行語句;其執行導致定義的名稱與(已編譯的)代碼相關聯。所以,如果您有:

def f(): 
    import something 
    return None 
您導入的(編譯)進口和返回語句得到一個名爲「F」在這一點上相關的模塊中

。當你運行時,運行 f(),那裏運行的是import語句。

如果推遲導入「非常大」或「沉重」的東西,然後永遠不運行該函數(在本例中爲f),則導入從不會發生。這節省了時間(以及一些空間)。當然,一旦你真正調用了f(),導入就會發生(如果Python一旦使用緩存結果就已經發生了,但仍然需要檢查),這樣你就失去了時間優勢。

因此,作爲一個經驗法則,「將所有內容導入頂部」直到進行了大量的分析並發現導入「巨大的東西」在90%的運行中浪費大量時間,有10%的時間有一點時間。

6

PEP 8建議所有導入發生在模塊的頂部。按照該順序,在本地,非本地,全局和內置範圍內搜索所有名稱,包括綁定到模塊的名稱。

+0

+1對於PEP8。 [pep8模塊](http://pypi.python.org/pypi/pep8)會根據PEP8準則檢查您的代碼。 – 2012-03-08 07:35:18