I prefer functional style over changing shared objects where it's possible - so I would use `request_params = self._get_request_params(**kwargs)` here or something like that.  Also I would return `pre_send` hook - it looks very useful atm (typical usage - to send content type and json dump request's data).  (It's only very personal opinion) - but I see our request sending logic like:

```python
# get common stuff for all requests (set in service __init__), like http auth and client identification, verify etc...
# and update it with **kwargs - but, update should be intelligent enough to populate request_params only with fields accepted by 
# `requests` and ignore all others otherwise we'll break sending
request_params = self._get_request_params(**kwargs)

# allow clients to override/change request_params, and build their own pre-send logic by passing any additional data in `**kwargs`
self.pre_send(request_params, **kwargs)

url = urljoin(self.service_url, path)
response = super(HTTPService, self).request(method, url, **request_params)

# allow clients to implement their specific post-send logic, + pass `expected_response_codes` and other similar stuff to the 
# post_send via **kwargs.  Since such things like `expected_response_codes` are API specific not service specific
self.post_send(response, **kwargs)
````

I don't insist on what I listed above :)  Just shared my opinion