<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def create_or_update_user(self, username, policies=None, groups=None, mount_point=DEFAULT_MOUNT_POINT):
 """ Create or update LDAP users policies and group associations. Supported methods: POST: /auth/{mount_point}/users/{username}. Produces: 204 (empty body) :param username: The username of the LDAP user :type username: str | unicode :param policies: List of policies associated with the user. This parameter is transformed to a comma-delimited string before being passed to Vault. :type policies: str | unicode :param groups: List of groups associated with the user. This parameter is transformed to a comma-delimited string before being passed to Vault. :type groups: str | unicode :param mount_point: The "path" the method/backend was mounted on. :type mount_point: str | unicode :return: The response of the create_or_update_user request. :rtype: requests.Response """

        if policies is None:
            policies = []
        if groups is None:
            groups = []
        list_required_params = {
            'policies': policies,
            'groups': groups,
        }
        for param_name, param_arg in list_required_params.items():
            if not isinstance(param_arg, list):
                error_msg = '"{param_name}" argument must be an instance of list or None, "{param_type}" provided.'.format(
                    param_name=param_name,
                    param_type=type(param_arg),
                )
                raise exceptions.ParamValidationError(error_msg)

        params = {
            'policies': ','.join(policies),
            'groups': ','.join(groups),
        }
        api_path = '/v1/auth/{mount_point}/users/{username}'.format(
            mount_point=mount_point,
            username=username,
        )
        return self._adapter.post(
            url=api_path,
            json=params,
        )