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 `__.