通常,不要使用 from modulename import * 。這樣做會使導入器的命名空間變得混亂,并且使得連接器更難以檢測未定義的名稱。
在文件的頂部導入模塊。這樣做可以清楚地了解代碼所需的其他模塊,并避免了模塊名稱是否在范圍內的問題。每行導入一個模塊可以輕松添加和刪除導入的模塊,但每行導入多個模塊會占用更少的屏幕空間。
如果按以下順序導入模塊,這是一種很好的做法:
標準庫模塊 – 例如: sys, os, getopt, re
第三方庫模塊(安裝在Python的site-packages目錄中的任何內容) – 例如mx.DateTime,ZODB,PIL.Image等
本地開發的模塊
有時需要將模塊導入語句移動到函數或類里面,以避免循環導入問題。Gordon McMillan 說:
當兩個模塊都使用 “import ” 的導入形式時,循環導入就可以了。但是當第 2 個模塊想從第 1 個模塊中獲取一個名稱 (“from module import name”) 并且導入位于頂層時,就會出錯。 這是因為第 1 個模塊中的名稱還不可用,因為第 1 個模塊正在忙著導入第 2 個模塊。
在這種情況下,如果第二個模塊僅用于一個函數,則可以輕松地將模塊導入語句移動到該函數中。調用導入時,第一個模塊將完成初始化,第二個模塊可以進行導入。
如果某些模塊是特定于平臺的,則可能還需要將模塊導入語句移出頂級代碼。在這種情況下,甚至可能無法導入文件頂部的所有模塊。在這種情況下,在相應的特定于平臺的代碼中導入正確的模塊是一個很好的選擇。
只有當需要解決諸如避免循環導入或試圖減少模塊初始化時間的問題時,才可以將導入移動到本地范圍,例如在函數定義中。如果根據程序的執行方式,許多導入是不必要的,這種技術尤其有用。如果僅在某個函數中使用模塊,您還可能希望將導入移到該函數中。請注意,第一次加載模塊可能會因為模塊的一次初始化而代價高昂,但多次加載模塊實際上是免費的,只需進行幾次字典查找。即使模塊名稱超出了作用域,模塊也可能在 sys.modules 中可用。