3 votes

Python et DynamoDB decimal.Inexact

J'essaie de supprimer un élément de ma table dynamodb, mais j'obtiens cette exception :

decimal.Inexact: [<class 'decimal.Inexact'>, <class 'decimal.Rounded'>]

Je n'ai aucune idée de la façon de le réparer, mais je peux vous aider ? Voici le code :

dynamodb = boto3.resource('dynamodb', region_name='***')

table = dynamodb.Table('***')

propid = 1234
column_set = Decimal(44.30912302164986)

print("Attempting a conditional delete...")

try:
    response = table.delete_item(
        Key={
            'hashkey': propid,
            'rangekey': column_set
        },
    )
except ClientError as e:
    if e.response['Error']['Code'] == "ConditionalCheckFailedException":
        print(e.response['Error']['Message'])
    else:
        raise
else:
    print("DeleteItem succeeded:")

Modification ultérieure :

Il semble qu'il ne se stocke pas correctement, lorsque je fais cela :

year = decimal.Decimal(44.309123021649860)

Il imprime :

44.30912302164986016350667341612279415130615234375

2voto

Milan Cermak Points 995

Je ne sais pas pourquoi cela se produit, mais pour ce que cela vaut, vous pouvez faire quelque chose comme ce qui suit (en vous basant sur les éléments suivants ce commentaire trouvé dans le fil de discussion sur les problèmes de boto3) :

with decimal.localcontext(boto3.dynamodb.types.DYNAMODB_CONTEXT) as ctx:
    ctx.traps[decimal.Inexact] = False
    ctx.traps[decimal.Rounded] = False
    column_set = ctx.create_decimal_from_float(v)

    response = table.delete_item(
        Key={
            'hashkey': propid,
            'rangekey': column_set
        },
    )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X