Python架构 - 导入额外的模块,或在代码执行部分导入模块?

时间:2013-01-02 02:52:47

标签: python architecture import module

我有一个模块,它定义了一个类,它从两个(或更多)其他模块中的一个实例化一个类。下面是几个代码示例。在第一个示例中,导入了两个模块,但只使用了一个模块(每个MyIo实例一个)。在第二个示例中,仅导入所需的模块。在更高级别的模块中可能存在一个或多个MyIo实例。

我喜欢第二个例子只导入使用的内容,但我不是真的希望import发生在'代码执行'部分。

我的问题是:

  1. 哪个例子是更好的架构选择,为什么?
  2. 导入最终没有的模块是否会受到惩罚 使用
  3. Python中代码执行部分的导入是否被认为是“糟糕的形式?”
  4. 此示例导入​​两个模块,但仅使用一个...

    ''' 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)
    ...
    ...
    

3 个答案:

答案 0 :(得分:1)

根据PEP 8,所有导入都应该放在文件的顶部。将它们传播到整个文件中会导致难以维护和调试软件。

我能想到的唯一性能开销是在程序启动时 - 它必须加载更多模块。一旦程序运行,就不应该有任何额外的开销。

回答你的问题:

  1. 前者。很明显,使用其他文件是什么,而你必须深入研究第二种文件以找到所有依赖项。
  2. 是的,但仅限于启动时。

答案 1 :(得分:0)

实际上,即使您将模块导入函数,一旦您的函数执行完毕,它们仍将存在于sys.modules中,除非您手动删除它们。所以是的,没有必要不直接在代码的顶部导入它们(例如#1)。

答案 2 :(得分:0)

对于不仅仅是在页面顶部卡住的导入的最常见用途是,兄弟模块代表不同的,互斥的选项:最好的例子是os.path,它会自动交换为适当的模块。即使存在共同的差异导入在顶部而不是在代码中。