簡體   English   中英

TypeError: issubclass() arg 1 必須是 class,而我很確定 arg 1 是 class

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM