code: async def parse(
          self,
          argmap: ArgMap,
          req: Request = None,
          locations: typing.Iterable = None,
          validate: Validate = None,
          error_status_code: typing.Union[int, None] = None,
          error_headers: typing.Union[typing.Mapping[str, str], None] = None,
      ) -> typing.Union[typing.Mapping, None]:
          
          self.clear_cache()  # in case someone used `parse_*()`
          req = req if req is not None else self.get_default_request()
          assert req is not None, "Must pass req object"
          data = None
          validators = core._ensure_list_of_callables(validate)
          schema = self._get_schema(argmap, req)
          try:
              parsed = await self._parse_request(
                  schema=schema, req=req, locations=locations or self.locations
              )
              result = schema.load(parsed)
              data = result.data if core.MARSHMALLOW_VERSION_INFO[0] < 3 else result
              self._validate_arguments(data, validators)
          except ma.exceptions.ValidationError as error:
              await self._on_validation_error(
                  error, req, schema, error_status_code, error_headers
              )
          return data
docs: Coroutine variant of `webargs.core.Parser`.
  
          Receives the same arguments as `webargs.core.Parser.parse`.