Skip to content

[REQ] Python-Flask - Python 3.7 util._deserialization #1866

@nathan5280

Description

@nathan5280

Is your feature request related to a problem? Please describe.

Unable to deserialize model objects when using Python 3.7.

When running with Python 3.7 openapi_server.util._deserialize fails because typing.GenericMeta was removed from 3.7.

Describe the solution you'd like

I'm not sure on where we are at with support for 3.7, but I worked on this fix and figured I should pass it along for when we get ready to support 3.7. Other than this I haven't found other issues.

Describe alternatives you've considered

Python 3.6

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.
    """
    from cdst_places_app.openapi_server.models.base_model_ import Model

    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)

Python 3.7

import typing_inspect


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.
    """
    from cdst_places_app.openapi_server.models.base_model_ import Model

    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 typing_inspect.is_generic_type(klass):
        if typing_inspect.get_origin(klass) == list:
            return _deserialize_list(data, klass.__args__[0])
        if typing_inspect.get_origin(klass) == dict:
            return _deserialize_dict(data, klass.__args__[1])
    else:
        return deserialize_model(data, klass)

I'm not sure if the dict piece

        if typing_inspect.get_origin(klass) == dict:
            return _deserialize_dict(data, klass.__args__[1])

works or not. I don't have a spec that triggers this code.

Additional context

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions