![](/img/trans.png)
[英]TypeError: issubclass() arg 1 must be a class in Django tests
[英]TypeError: issubclass() arg 1 must be a class, while I am quite sure arg 1 is a class
在我的代碼中的某處,我有以下代碼行。
from inspect import isclass
if isclass(route.handler) and issubclass(route.handler, web.View):
不幸的是,這行代碼在我的生產環境中給出了以下異常。
TypeError: issubclass() arg 1 must be a class
據我所知,Python (3.7.7) 編譯器將首先檢查if
語句的第一個條件,如果計算結果為false
,則不會檢查第二個條件。 因此我必須得出結論, route.handler
必須是 class,因此我得到的TypeError
不應該發生。 我在這里錯過了什么嗎? 有人知道這可能是什么原因嗎?
(不幸的是我無法重現錯誤)
編輯:
錯誤源自swagger-aiohttp
package。這是整個回溯:
Traceback (most recent call last):
File "/var/www/app/main.py", line 249, in <module>
run_app(cfg)
File "/var/www/app/main.py", line 225, in run_app
setup_swagger(app, ui_version=SWAGGER_VERSION, swagger_url=SWAGGER_URL)
File "/home/webapp/.venv/lib/python3.7/site-packages/aiohttp_swagger/__init__.py", line 72, in setup_swagger
security_definitions=security_definitions
File "/home/webapp/.venv/lib/python3.7/site-packages/aiohttp_swagger/helpers/builders.py", line 163, in generate_doc_from_each_end_point
end_point_doc = _build_doc_from_func_doc(route)
File "/home/webapp/.venv/lib/python3.7/site-packages/aiohttp_swagger/helpers/builders.py", line 44, in _build_doc_from_func_doc
if isclass(route.handler) and issubclass(route.handler, web.View):
File "/home/webapp/.venv/lib/python3.7/abc.py", line 143, in __subclasscheck__
return _abc_subclasscheck(cls, subclass)
TypeError: issubclass() arg 1 must be a class
編輯2:
route.handler
應該是一個基於aiohttp
類的視圖。 例如,這就是創建一個 swagger UI 的方式。
class PingHandler(web.View):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
async def get(request):
"""
---
description: This end-point allow to test that service is up.
tags:
- Health check
produces:
- text/plain
responses:
"200":
description: successful operation. Return "pong" text
"405":
description: invalid HTTP Method
"""
return web.Response(text="pong")
app = web.Application()
app.router.add_route('GET', "/ping", PingHandler)
setup_swagger(app, swagger_url="/api/v1/doc", ui_version=3)
在我當前的實現中,我還在處理程序 class 中添加了一個裝飾器。
編輯3:
在本地調試時(它工作正常),route.handler 似乎是一個<class 'abc.ABCMeta'>
。
我終於發現了問題。 每當將wrapt
庫中的裝飾器與abc.ABCMeta
class 一起使用時,就會引發錯誤。這是wrapt
庫目前未解決的問題。 一個例子如下所示:
import abc
from inspect import isclass
import wrapt
class Base:
pass
class BaseWithMeta(metaclass=abc.ABCMeta):
pass
@wrapt.decorator
def pass_through(wrapped, instance, args, kwargs):
return wrapped(*args, **kwargs)
@pass_through
class B(BaseWithMeta):
pass
@pass_through
class C(Base):
pass
isclass(C)
>>>
True
issubclass(C, Base)
>>>
True
isclass(B)
>>>
True
issubclass(B, BaseWithMeta)
>>>
TypeError: issubclass() arg 1 must be a class
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.