-
-
Notifications
You must be signed in to change notification settings - Fork 7.2k
Closed
Description
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.