'Create a new item or replace an old item with a new
item (including all attributes).  If an item already
exists in the specified table with the same primary
key, the new item will completely replace the old item.
You can perform a conditional put by specifying an
expected rule.
:type table_name: str
:param table_name: The name of the table in which to put the item.
:type item: dict
:param item: A Python version of the Item data structure
defined by DynamoDB.
:type expected: dict
:param expected: A Python version of the Expected
data structure defined by DynamoDB.
:type return_values: str
:param return_values: Controls the return of attribute
name-value pairs before then were changed.  Possible
values are: None or \'ALL_OLD\'. If \'ALL_OLD\' is
specified and the item is overwritten, the content
of the old item is returned.'

def put_item(self, table_name, item, expected=None, return_values=None, object_hook=None):

    data = {'TableName': table_name, 'Item': item}
    if expected:
        data['Expected'] = expected
    if return_values:
        data['ReturnValues'] = return_values
    json_input = json.dumps(data)
    return self.make_request('PutItem', json_input, object_hook=object_hook)
