docs: def to_python(self):
          """ Return an object as native Python """
  
          result = None
          if self.type == PythonTypes.null:
              result = None
          elif self.type == PythonTypes.bool:
              result = self.value == 1
          elif self.type == PythonTypes.integer:
              if self.value is None:
                  result = 0
              else:
                  result = ctypes.c_int32(self.value).value
          elif self.type == PythonTypes.double:
              result = self._double_value()
          elif self.type == PythonTypes.str_utf8:
              buf = ctypes.c_char_p(self.value)
              ptr = ctypes.cast(buf, ctypes.POINTER(ctypes.c_char))
              result = ptr[0:self.len].decode("utf8")
          elif self.type == PythonTypes.array:
              if self.len == 0:
                  return []
              ary = []
              ary_addr = ctypes.c_void_p.from_address(self.value)
              ptr_to_ary = ctypes.pointer(ary_addr)
              for i in range(self.len):
                  pval = PythonValue.from_address(ptr_to_ary[i])
                  ary.append(pval.to_python())
              result = ary
          elif self.type == PythonTypes.hash:
              if self.len == 0:
                  return {}
              res = {}
              hash_ary_addr = ctypes.c_void_p.from_address(self.value)
              ptr_to_hash = ctypes.pointer(hash_ary_addr)
              for i in range(self.len):
                  pkey = PythonValue.from_address(ptr_to_hash[i*2])
                  pval = PythonValue.from_address(ptr_to_hash[i*2+1])
                  res[pkey.to_python()] = pval.to_python()
              result = res
          elif self.type == PythonTypes.function:
              result = JSFunction()
          elif self.type == PythonTypes.parse_exception:
              msg = ctypes.c_char_p(self.value).value
              raise JSParseException(msg)
          elif self.type == PythonTypes.execute_exception:
              msg = ctypes.c_char_p(self.value).value
              raise JSEvalException(msg.decode('utf-8', errors='replace'))
          elif self.type == PythonTypes.oom_exception:
              msg = ctypes.c_char_p(self.value).value
              raise JSOOMException(msg)
          elif self.type == PythonTypes.timeout_exception:
              msg = ctypes.c_char_p(self.value).value
              raise JSTimeoutException(msg)
          elif self.type == PythonTypes.date:
              timestamp = self._double_value()
              # JS timestamp are milliseconds, in python we are in seconds
              result = datetime.datetime.utcfromtimestamp(timestamp / 1000.)
          else:
              raise WrongReturnTypeException("unknown type %d" % self.type)
          return result