python-3.x 类示例未通过isinstance检查[已关闭]

o7jaxewo  于 2023-10-21  发布在  Python
关注(0)|答案(1)|浏览(182)

**已关闭。**此问题需要debugging details。它目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
8天前关闭
Improve this question

我有一些代码在我的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({ 'some_field': 'some value' })
    return _super

得到输出和错误:

type(self) is <class '__main__.MyController'> (it IS NOT a subclass of MyController)
Traceback (most recent call last):
  File "main.py", line 24, in <module>
    MyController.main(**params)
  File "/tmp/example/flow.py", line 391, in main
    _tests_suite, _, _ = self.prepare()
  File "/tmp/example/flow.py", line 359, in prepare
    context['variables_context'] = self.get_variables_context(**context)
  File "/tmp/example/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
unftdfkk

unftdfkk1#

我在调查根本原因的同时找到了解决办法。

在本地运行中,...

我实际上调用了python unittest,它调用了main.py,然后创建了一个类MyController,然后调用了my_options.py,这个类被添加到加载的模块'main'中。然后,MyController.get_variables_context请求已经加载的模块'main',然后请求该模块中的类MyController,因此返回相同类型的示例,类型检查成功。

在CI运行中,.

我直接用参数"test"调用main.py(它应该创建一个控制器,并通过unittest运行所有测试),所以类MyController在模块__main__中创建。MyController.get_variables_context仍然要求main.py中的MyController类,但是模块'main'没有在这里加载,所以python加载它,创建 newMyController,然后返回它。
所以,基本上答案是...
MyControllermain.py移动到另一个文件,即controller.py

相关问题