类实例未通过isinstance检查

时间:2019-07-18 15:08:36

标签: python python-3.x partial-classes isinstance

你好

我的CI上有一些代码失败(本地运行不会失败)。 问题在于类实例未能通过isinstance()检查。

代码:

文件:main.py

class MyController(SuperController):
    # Overrides default definition of get_variables_context()
    from my_options import get_variables_context

文件:my_options.py

...
def get_variables_context(self: SuperController, **kwargs):
    from main import MyController
    self: MyController

    print(f"type(self) is {type(self)} (it {'IS' if (isinstance(self, MyController)) else 'IS NOT'} a subclass of MyController)")
    _super = super(MyController, self).get_variables_context(**kwargs) or dict()
    _super.update(result)
    return _super

输出错误:

type(self) is <class '__main__.SomeController'> (it IS NOT a subclass of SomeController
Traceback (most recent call last):
  File "main.py", line 24, in <module>
    SomeController.main(**params)
  File "/builds/RND/my/rcv-nginx/tests/nginx_tests/flow.py", line 391, in main
    _tests_suite, _, _ = self.prepare()
  File "/builds/RND/my/rcv-nginx/tests/nginx_tests/flow.py", line 359, in prepare
    context['variables_context'] = self.get_variables_context(**context)
  File "/builds/RND/my/tests/integration/my_options.py", line 81, in get_variables_context
    _super = super(SomeController, self).get_variables_context(**kwargs) or dict()
TypeError: super(type, obj): obj must be an instance or subtype of type

1 个答案:

答案 0 :(得分:0)

我在调查根本原因时找到了解决方案。

在本地运行中,...

实际上调用python unittest,然后调用main.py,然后创建一个类MyController,然后再调用my_options.py,并将该类添加到已加载模块'main'。 然后,MyController.get_variables_context询问已加载的模块'main',然后询问该模块中的类MyController,因此返回相同的类型实例,并且类型检查成功。

在CI运行中,...

我直接用参数main.py调用"test"(应该创建一个控制器并通过unittest运行所有测试),因此类MyController是在模块{{1 }}。 __main__仍要求MyController.get_variables_context中的MyController类,但此处未加载模块main.py,因此python加载了它,创建了 new 'main',然后返回它。

所以,基本上答案是...

MyControllerMyController移到另一个文件,即main.py