code: async def field(self, elem=None, elem_type=None, params=None):
          
          elem_type = elem_type if elem_type else elem.__class__
          fvalue = None
  
          etype = self._get_type(elem_type)
          if self._is_type(etype, UVarintType):
              fvalue = await self.uvarint(get_elem(elem))
  
          elif self._is_type(etype, IntType):
              fvalue = await self.uint(
                  elem=get_elem(elem), elem_type=elem_type, params=params
              )
  
          elif self._is_type(etype, BlobType):
              fvalue = await self.blob(
                  elem=get_elem(elem), elem_type=elem_type, params=params
              )
  
          elif self._is_type(etype, UnicodeType):
              fvalue = await self.unicode_type(get_elem(elem))
  
          elif self._is_type(etype, VariantType):
              fvalue = await self.variant(
                  elem=get_elem(elem), elem_type=elem_type, params=params
              )
  
          elif self._is_type(etype, ContainerType):  # container ~ simple list
              fvalue = await self.container(
                  container=get_elem(elem), container_type=elem_type, params=params
              )
  
          elif self._is_type(etype, TupleType):  # tuple ~ simple list
              fvalue = await self.tuple(
                  elem=get_elem(elem), elem_type=elem_type, params=params
              )
  
          elif self._is_type(etype, MessageType):
              fvalue = await self.message(get_elem(elem), msg_type=elem_type)
  
          else:
              raise TypeError(
                  "unknown type: %s %s %s" % (elem_type, type(elem_type), elem)
              )
  
          return fvalue if self.writing else set_elem(elem, fvalue)
docs: Archive field
          :param elem:
          :param elem_type:
          :param params:
          :return: