def METHOD_NAME(self) -> BaseClient:
    s3_client: Union[BaseClient, None] = self._s3_client
    if not s3_client:
        # Validate that "boto3" library was successfully imported and attempt to create "s3_client" handle.
        if aws.boto3:
            _check_config_substitutions_needed(
                self, self.boto3_options, raise_warning_if_provider_not_present=True
            )
            # pull in needed config substitutions using the `_config_provider`
            # The `FluentBaseModel.dict()` call will do the config substitution on the serialized dict if a `config_provider` is passed
            boto3_options: dict = self.dict(
                config_provider=self._config_provider
            ).get("boto3_options", {})
            try:
                s3_client = aws.boto3.client("s3", **boto3_options)
            except Exception as e:
                # Failure to create "s3_client" is most likely due invalid "boto3_options" dictionary.
                raise PandasS3DatasourceError(
                    f'Due to exception: "{type(e).__name__}:{e}", "s3_client" could not be created.'
                ) from e
        else:
            raise PandasS3DatasourceError(
                'Unable to create "PandasS3Datasource" due to missing boto3 dependency.'
            )
        self._s3_client = s3_client
    return s3_client