【问题标题】:How do I do python unittest doc's recommended method of lazy import?python unittest doc推荐的惰性导入方法怎么做?
【发布时间】:2018-10-29 04:34:24
【问题描述】:

Python 的文档说有一个替代本地导入的方法来防止在启动时加载模块:

https://docs.python.org/3/library/unittest.mock-examples.html#mocking-imports-with-patch-dict

...通过延迟进口来防止“前期成本”。 这也可以用比无条件本地更好的方式解决 import(将模块存储为类或模块属性,只做 首次使用时导入)。

我不明白括号中的解释。我该怎么做呢?不管我怎么想,我似乎还是以本地进口告终。

【问题讨论】:

  • 写的不是很清楚。也许括号中的句子是“无条件本地导入”的示例,而不是相反的示例?
  • @HåkenLid 在该段的前一部分中,它指出“有时这样做是为了防止循环依赖,为此通常有更好的方法来解决问题(重构代码)”。所以我假设括号意味着解决方案。
  • 这可能指的是 importimportlib 的使用,如下面的回答所述。

标签: python python-import


【解决方案1】:

文档可能提到了importlib.import_module 的使用,它公开了 Python 的 import 功能:

import importlib

class Example():

    TO_IMPORT = "os"  # the name of the module to lazily import
    __module = None

    def __init__(self):
        if self.__module is None:
            self.__module = importlib.import_module(self.TO_IMPORT)

请注意,这种方式只在类第一次实例化时才导入一次,并且在全局命名空间中不可用。

此外,它允许您更改导入的模块,这可能很有用,例如如果将同一个类用作不同后端的接口:

import importlib

class Example():

    def __init__(self, backend="some_module"):
        self.module = importlib.import_module(backend)

【讨论】:

  • 你能解释一下为什么这样更好吗?这似乎与无条件本地导入没有什么不同,只是它使用 import_module 函数,例如为什么不def __init__(self): import os self.module = os? (遗憾的是,我无法在 cmets 中创建换行符,但我希望你明白我的意思)
  • 不同的是import os导入到全局命名空间,每次实例化类时都会导入模块。我编辑了示例,以便导入只发生一次。
  • 抱歉,我花了一段时间才回复,我想我可以看到您的第一个示例的作用。但是,我认为 importlib 的使用是一个红鲱鱼。通常,延迟导入不需要动态导入行为。
  • 是什么让你相信使用importlib 是一个红鲱鱼?
  • 我可以在函数中使用import os 做同样的事情。 importlib 的唯一目的是允许动态导入(能够更改您在代码中导入的内容)。延迟导入的目的是延迟导入,这样启动就没有导入的成本。其实目的不同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多