Design Notes for Botocore#
This document outlines the rationale behind various design decisions in botocore.
Casing of Arguments#
One of the most noticeable differences between botocore and boto
is that the client objects 1) require parameters to be provided
as **kwargs
and 2) require the arguments typically be provided as
CamelCased
values.
For example:
ddb = session.create_client('dynamodb')
ddb.describe_table(TableName='mytable')
In boto, the equivalent code would be:
layer1.describe_table(table_name='mytable')
There are several reasons why this was changed in botocore.
The first reason was because we wanted to have the same casing for
inputs as well as outputs. In both boto and botocore, the response
for the describe_table
calls is:
{'Table': {'CreationDateTime': 1393007077.387,
'ItemCount': 0,
'KeySchema': {'HashKeyElement': {'AttributeName': 'foo',
'AttributeType': 'S'}},
'ProvisionedThroughput': {'ReadCapacityUnits': 5,
'WriteCapacityUnits': 5},
'TableName': 'testtable',
'TableStatus': 'ACTIVE'}}
Notice that the response is CamelCased
. This makes it more difficult
to round trip results. In many cases you want to get the result of
a describe*
call and use that value as input through a corresponding
update*
call. If the input arguments require snake_casing
but
the response data is CamelCased
then you will need to manually convert
all the response elements back to snake_case
in order to properly
round trip.
This makes the case for having consistent casing for both input and
output. Why not use snake_casing
for input as well as output?
We choose to use CamelCasing
because this is the casing used by
AWS services. As a result, we don’t have to do any translation from
CamelCasing
to snake_casing
. We can use the response values
exactly as they are returned from AWS services.
This also means that if you are reading the AWS API documentation for services, the names and casing referenced there will match what you would provide to botocore. For example, here’s the corresponding API documentation for dynamodb.describe_table.