【问题标题】:Two Objects Created from the Same Class, isinstance = False从同一个类创建的两个对象,isinstance = False
【发布时间】:2017-09-20 20:11:40
【问题描述】:

我正在尝试为工作中的一些代码创建一些单元测试。

代码接收一个对象,并根据该对象中的信息导入一个特定模块,然后创建它的一个实例。

我尝试编写的测试创建了对象,然后我检查它是否是我希望它导入的类的实例。问题是 isinstance 检查失败。

这是我的测试的样子。

import importlib
from path.to.imported_api import SomeApi

api = importlib.import_module("path.to.imported_api").create_instance()  # create_instance() is a function that returns SomeApi().

assert isinstance(api, SomeApi)  # This returns false, but I am not sure why.

【问题讨论】:

  • 你说你在写单元测试。你嘲笑过什么吗?
  • 在不知道create_instance 做什么的情况下,它可以返回任何东西。您可能需要包含type(api)type(api) is SomeApi。也可能是您使用 importlib 两次导入模块,在这种情况下,它可能是同一个类,但由于重新加载,它不被认为是相同的。
  • -1 这个代码示例太简单了,无法实际重现任何内容。由于您在上面有 from path.to.imported_api import SomeApi,动态 importlib 行不会做任何事情,它只会使用位于 sys.modules 中的现有模块。
  • @wim 不一定,我遇到过一些奇怪的情况,import_module 确实再次加载了模块。不过我不记得是什么原因造成的了。
  • @MSeifert 是的,必须的。两次完全相同的路径:“path.to.imported_api”。

标签: python python-2.7 python-unittest


【解决方案1】:

差异的原因是,虽然两个对象都引用同一个模块,但当您加载新模块并绕过 sys.modules 时,它们会获得不同的标识符。另请参阅此处的说明:https://bugs.python.org/issue40427

一个技巧可能是比较名称:

assert isinstance(api.__class__.__name__, SomeApi.__name__)

【讨论】:

    【解决方案2】:

    有几件事可能会导致: 所以首先,可能是 api 只是返回了一些看起来像 SomeApi() 的东西。也可能是 SomeApi 正在覆盖 isinstance 行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      相关资源
      最近更新 更多