Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

142 linhas
3.3 KiB

  1. import datetime
  2. import six
  3. import typing
  4. def _deserialize(data, klass):
  5. """Deserializes dict, list, str into an object.
  6. :param data: dict, list or str.
  7. :param klass: class literal, or string of class name.
  8. :return: object.
  9. """
  10. if data is None:
  11. return None
  12. if klass in six.integer_types or klass in (float, str, bool):
  13. return _deserialize_primitive(data, klass)
  14. elif klass == object:
  15. return _deserialize_object(data)
  16. elif klass == datetime.date:
  17. return deserialize_date(data)
  18. elif klass == datetime.datetime:
  19. return deserialize_datetime(data)
  20. elif type(klass) == typing.GenericMeta:
  21. if klass.__extra__ == list:
  22. return _deserialize_list(data, klass.__args__[0])
  23. if klass.__extra__ == dict:
  24. return _deserialize_dict(data, klass.__args__[1])
  25. else:
  26. return deserialize_model(data, klass)
  27. def _deserialize_primitive(data, klass):
  28. """Deserializes to primitive type.
  29. :param data: data to deserialize.
  30. :param klass: class literal.
  31. :return: int, long, float, str, bool.
  32. :rtype: int | long | float | str | bool
  33. """
  34. try:
  35. value = klass(data)
  36. except UnicodeEncodeError:
  37. value = six.u(data)
  38. except TypeError:
  39. value = data
  40. return value
  41. def _deserialize_object(value):
  42. """Return a original value.
  43. :return: object.
  44. """
  45. return value
  46. def deserialize_date(string):
  47. """Deserializes string to date.
  48. :param string: str.
  49. :type string: str
  50. :return: date.
  51. :rtype: date
  52. """
  53. try:
  54. from dateutil.parser import parse
  55. return parse(string).date()
  56. except ImportError:
  57. return string
  58. def deserialize_datetime(string):
  59. """Deserializes string to datetime.
  60. The string should be in iso8601 datetime format.
  61. :param string: str.
  62. :type string: str
  63. :return: datetime.
  64. :rtype: datetime
  65. """
  66. try:
  67. from dateutil.parser import parse
  68. return parse(string)
  69. except ImportError:
  70. return string
  71. def deserialize_model(data, klass):
  72. """Deserializes list or dict to model.
  73. :param data: dict, list.
  74. :type data: dict | list
  75. :param klass: class literal.
  76. :return: model object.
  77. """
  78. instance = klass()
  79. if not instance.swagger_types:
  80. return data
  81. for attr, attr_type in six.iteritems(instance.swagger_types):
  82. if data is not None \
  83. and instance.attribute_map[attr] in data \
  84. and isinstance(data, (list, dict)):
  85. value = data[instance.attribute_map[attr]]
  86. setattr(instance, attr, _deserialize(value, attr_type))
  87. return instance
  88. def _deserialize_list(data, boxed_type):
  89. """Deserializes a list and its elements.
  90. :param data: list to deserialize.
  91. :type data: list
  92. :param boxed_type: class literal.
  93. :return: deserialized list.
  94. :rtype: list
  95. """
  96. return [_deserialize(sub_data, boxed_type)
  97. for sub_data in data]
  98. def _deserialize_dict(data, boxed_type):
  99. """Deserializes a dict and its elements.
  100. :param data: dict to deserialize.
  101. :type data: dict
  102. :param boxed_type: class literal.
  103. :return: deserialized dict.
  104. :rtype: dict
  105. """
  106. return {k: _deserialize(v, boxed_type)
  107. for k, v in six.iteritems(data)}