【问题标题】:Python architecture - import extra modules, or import modules in code execution section?Python 架构 - 导入额外的模块,还是在代码执行部分导入模块?
【发布时间】:2012-12-16 11:37:34
【问题描述】:

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

我喜欢第二个示例只导入使用的内容,但我不太喜欢 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)
...
...

【问题讨论】:

    标签: python architecture import module


    【解决方案1】:

    不只是卡在页面顶部的导入最常见的用途是同级模块代表不同的、互斥的选项的情况:最好的例子是 os.path,它会自动交换为适当的模块.即使在代码的顶部而不是向下的代码中进行差异导入也是很常见的。

    【讨论】:

      【解决方案2】:

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

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

      回答您的问题:

      1. 前者。使用了哪些其他文件很明显,而您必须深入挖掘第二个文件才能找到所有依赖项。
      2. 可以,但仅在启动时。
      3. 是的。

      【讨论】:

      • 加载未使用的模块是否存在资源损失(即内存)?
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-16
        • 2015-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多