2013-01-02 48 views
0

我有一個模塊,它定義了一個類,它從兩個(或更多)其他模塊中的一個實例化一個類。以下是幾個代碼示例。在第一個示例中,導入了兩個模塊,但只使用了一個模塊(每個MyIo實例一個)。在第二個示例中,僅導入所需的模塊。在更高級別的模塊中可能有一個或多個MyIo實例。Python體系結構 - 導入額外的模塊,或在代碼執行部分導入模塊?

我喜歡第二個例子只導入使用的內容,但我並不喜歡import發生在'代碼執行'部分。

我的問題是:

  1. 其中的例子是一個更好的架構選擇,爲什麼?
  2. 導入的模塊最終是否使用了 是否有懲罰?
  3. Python中的代碼執行節中的導入是否被認爲是「不良格式?」

此示例導入​​兩個模塊,但僅使用一個...

''' MyIo.py ''' 

... 
... 
from DevSerial import Device as DeviceSerial 
from DevUSB import Device as DeviceUSB 

class MyIo: 

    def __init__(self, port) 
    if port.lower() == 'usb': 
     self.device=DeviceUSB() 
    else: 
     self.device=DeviceSerial(port) 
... 
... 

以下僅導入正在使用的模塊...

''' MyIo.py ''' 

... 
... 
class MyIo: 

    def __init__(self, port) 
    if port.lower() == 'usb': 
     from DevUSB import Device 
     self.device=Device() 
    else: 
     from DevSerial import Device 
     self.device=Device(port) 
... 
... 

回答

1

作爲每PEP 8,所有進口應該一起在文件的頂部。讓它們遍佈整個文件會導致難以維護和調試軟件。

我能想到的唯一性能開銷是程序啓動 - 它必須加載更多模塊。程序運行後不應該有任何額外的開銷。

回答您的問題:

  1. 前者。很顯然,使用其他文件的方式很明顯,但您必須深入研究第二個文件才能找到所有依賴關係。
  2. 是的,但只在啓動時。
  3. 是的。
+1

是否有加載未使用模塊的資源損失(即內存)? –

0

實際上,即使你將模塊導入到函數中,一旦你的函數完成執行,它們仍然存在sys.modules中,除非你正在手動刪除它們。所以是的,沒有必要不要直接在代碼的頂部導入它們(例如#1)。

0

對於不只是卡在頁面頂部的導入而言,最常見的用途是用於兄弟模塊表示不同的互斥選項的情況:最好的例子是os.path,它會自動替換爲適當的模塊。即使在頂端進行差分輸入,而不是在代碼中輸入差異也是如此。