Class 实例未通过 isinstance 检查
Class instance fails isinstance check
你好
我有一些关于我的 CI 失败的代码(本地运行不会失败)。
问题是 class 实例未通过 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
我在调查根本原因时找到了解决方案。
在本地运行, ...
我 实际上 调用 python 单元测试然后调用 main.py
然后创建 class MyController
然后调用my_options.py
,并将 class 添加到加载的模块 'main'
。
然后,MyController.get_variables_context
请求已加载的模块 'main'
,然后请求该模块中的 class MyController
,因此返回相同类型的实例并且类型检查成功.
在 CI 运行, ...
我用参数 "test"
直接调用 main.py
(它应该创建一个控制器,运行 通过单元测试从它进行所有测试),所以 class MyController
是在模块 __main__
中创建的。 MyController.get_variables_context
仍然在 main.py
中请求 MyController
class,但模块 'main'
未在此处加载,因此 python 加载它,创建 newclassMyController
,然后returns.
所以,基本上答案是...
将 MyController
从 main.py
移动到另一个文件,即 controller.py
我有一些关于我的 CI 失败的代码(本地运行不会失败)。
问题是 class 实例未通过 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
我在调查根本原因时找到了解决方案。
在本地运行, ...
我 实际上 调用 python 单元测试然后调用 main.py
然后创建 class MyController
然后调用my_options.py
,并将 class 添加到加载的模块 'main'
。
然后,MyController.get_variables_context
请求已加载的模块 'main'
,然后请求该模块中的 class MyController
,因此返回相同类型的实例并且类型检查成功.
在 CI 运行, ...
我用参数 "test"
直接调用 main.py
(它应该创建一个控制器,运行 通过单元测试从它进行所有测试),所以 class MyController
是在模块 __main__
中创建的。 MyController.get_variables_context
仍然在 main.py
中请求 MyController
class,但模块 'main'
未在此处加载,因此 python 加载它,创建 newclassMyController
,然后returns.
所以,基本上答案是...
将 MyController
从 main.py
移动到另一个文件,即 controller.py