哪種風格更適合?導入模塊級別還是功能級別?
風格答:
def foo():
import some_module
some_module.something
樣式B:
import some_module
def foo():
some_module.something
假設some_module
未在代碼別處使用,僅此函數內。
哪種風格更適合?導入模塊級別還是功能級別?
風格答:
def foo():
import some_module
some_module.something
樣式B:
import some_module
def foo():
some_module.something
假設some_module
未在代碼別處使用,僅此函數內。
事實上,正如已經指出的那樣,通常最好遵循PEP 8的建議,並在頂部進行進口。雖然有一些例外。理解它們的關鍵在於你的第二段中的嵌入問題:「進口......在什麼階段發生?」
導入實際上是一個可執行語句。導入模塊時,模塊中的所有可執行語句都會運行。 「def」也是一個可執行語句;其執行導致定義的名稱與(已編譯的)代碼相關聯。所以,如果您有:
def f():
import something
return None
您導入的(編譯)進口和返回語句得到一個名爲「F」在這一點上相關的模塊中
。當你運行時,運行 f(),那裏運行的是import語句。
如果推遲導入「非常大」或「沉重」的東西,然後永遠不運行該函數(在本例中爲f),則導入從不會發生。這節省了時間(以及一些空間)。當然,一旦你真正調用了f(),導入就會發生(如果Python一旦使用緩存結果就已經發生了,但仍然需要檢查),這樣你就失去了時間優勢。
因此,作爲一個經驗法則,「將所有內容導入頂部」直到進行了大量的分析並發現導入「巨大的東西」在90%的運行中浪費大量時間,有10%的時間有一點時間。
PEP 8建議所有導入發生在模塊的頂部。按照該順序,在本地,非本地,全局和內置範圍內搜索所有名稱,包括綁定到模塊的名稱。
+1對於PEP8。 [pep8模塊](http://pypi.python.org/pypi/pep8)會根據PEP8準則檢查您的代碼。 – 2012-03-08 07:35:18