2013-01-02 49 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,它会自动替换为适当的模块。即使在顶端进行差分输入,而不是在代码中输入差异也是如此。