in src/dynamo.py [0:0]
def dump_to_dynamodb(item):
context = decimal.Context(
Emin=-128, Emax=126, rounding=None, prec=38,
traps=[decimal.Clamped, decimal.Overflow, decimal.Underflow]
)
# don't catch str/bytes with Iterable check below;
# don't catch bool with numbers.Number
if isinstance(item, (str, ByteString, bool)):
return item
# ignore inexact, rounding errors
if isinstance(item, numbers.Number):
return context.create_decimal(item)
elif isinstance(item, Dict):
for key, value in item.items():
item[key] = dump_to_dynamodb(value)
return item
# mappings are also Iterable
elif isinstance(item, Mapping):
return {
key: dump_to_dynamodb(value)
for key, value in item.values()
}
# dynamodb.TypeSerializer checks isinstance(o, Set)
# so we cannot handle this as a list
elif isinstance(item, Set):
return set(map(dump_to_dynamodb, item))
# may not be a literal instance of List
elif isinstance(item, Iterable):
return list(map(dump_to_dynamodb, item))
# datetime, custom object, None
return item