属性错误:模块'typing'没有'GenericMeta'属性。

3

我使用 flask, connexion 和 swagger UI 构建了我的 API。我使用 openapi 定义了我的 apispec。我从 swagger 编辑器创建了 swagger python 服务器存根,您可以在 Github 上找到示例项目。当我反序列化请求 JSON 数据进行验证时,将使用 util.py,但我遇到了以下错误:

错误信息:

Traceback (most recent call last):
  File "C:\Users\kim\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\kim\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\kim\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\kim\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\kim\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\kim\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\kim\AppData\Local\Programs\Python\Python37\lib\site-packages\connexion\decorators\decorator.py", line 48, in wrapper
    response = function(request)
  File "C:\Users\kim\AppData\Local\Programs\Python\Python37\lib\site-packages\connexion\decorators\security.py", line 327, in wrapper
    return function(request)
  File "C:\Users\kim\AppData\Local\Programs\Python\Python37\lib\site-packages\connexion\decorators\uri_parsing.py", line 144, in wrapper
    response = function(request)
  File "C:\Users\kim\AppData\Local\Programs\Python\Python37\lib\site-packages\connexion\decorators\validation.py", line 184, in wrapper
    response = function(request)
  File "C:\Users\kim\AppData\Local\Programs\Python\Python37\lib\site-packages\connexion\decorators\parameter.py", line 121, in wrapper
    return function(**kwargs)
  File "C:\Users\kim\codegen_server\openapi_server\controllers\default_controller.py", line 74, in immunomatch_ed_post
    body = ImmunomatchEdInput.from_dict(connexion.request.get_json())  # noqa: E501
  File "C:\Users\kim\codegen_server\openapi_server\models\immunomatch_ed_input.py", line 62, in from_dict
    return util.deserialize_model(dikt, cls)
  File "C:\Users\kim\codegen_server\openapi_server\util.py", line 111, in deserialize_model
    setattr(instance, attr, _deserialize(value, attr_type))
  File "C:\Users\kim\codegen_server\openapi_server\util.py", line 26, in _deserialize
    elif type(klass) == typing.GenericMeta:
AttributeError: module 'typing' has no attribute 'GenericMeta'

错误信息说typing模块没有属性'GenericMeta',我不明白为什么会出现这个错误。有谁能指出为什么会出现这个错误吗?这是因为typing模块版本错误吗?有什么可能的想法可以消除这个错误吗?请帮忙解决问题,谢谢。

更新:我尝试过的代码:

import six
import typing


def _deserialize(data, klass):
    """Deserializes dict, list, str into an object.

    :param data: dict, list or str.
    :param klass: class literal, or string of class name.

    :return: object.
    """
    if data is None:
        return None

    if klass in six.integer_types or klass in (float, str, bool):
        return _deserialize_primitive(data, klass)
    elif klass == object:
        return _deserialize_object(data)
    elif klass == datetime.date:
        return deserialize_date(data)
    elif klass == datetime.datetime:
        return deserialize_datetime(data)
    elif type(klass) == typing.GenericMeta:
        if klass.__extra__ == list:
            return _deserialize_list(data, klass.__args__[0])
        if klass.__extra__ == dict:
            return _deserialize_dict(data, klass.__args__[1])
    else:
        return deserialize_model(data, klass)

错误信息显示该行代码 elif type(klass) == typing.GenericMeta: 报错,有什么想法吗?


请发布生成此错误的代码。 - ngShravil.py
自从Python 3.7版本以后,GenericMeta已经不再可用。请查看此问题:https://github.com/pawamoy/mkdocstrings/issues/2 和解决方法:https://github.com/pawamoy/mkdocstrings/commit/febf2b9749d97cce80f5d20339372842fdffc908。 - Luka Mesaric
@ngShravil.py,我已经粘贴了我尝试的代码,你有什么可能的想法来解决它吗?谢谢。 - kim
1个回答

5

你可以将你的代码更改为以下内容:

elif hasattr(klass, '__origin__'):
    if klass.__origin__ == list:
        return _deserialize_list(data, klass.__args__[0])
    if klass.__origin__ == dict:
        return _deserialize_dict(data, klass.__args__[1])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接