':type service_description: dict
:param service_description: The service description model.  This value
is obtained from a botocore.loader.Loader, or from directly loading
the file yourself::
service_description = json.load(
open(\'/path/to/service-description-model.json\'))
model = ServiceModel(service_description)
:type service_name: str
:param service_name: The name of the service.  Normally this is
the endpoint prefix defined in the service_description.  However,
you can override this value to provide a more convenient name.
This is done in a few places in botocore (ses instead of email,
emr instead of elasticmapreduce).  If this value is not provided,
it will default to the endpointPrefix defined in the model.'

def __init__(self, service_description, service_name=None):

    self._service_description = service_description
    self.metadata = service_description.get('metadata', {})
    self._shape_resolver = ShapeResolver(service_description.get('shapes', {}))
    self._signature_version = NOT_SET
    self._service_name = service_name
    self._instance_cache = {}
