Python &引用;errorMessage";:&引用;[<;class';十进制。不精确';<;class';十进制。四舍五入';];,在更新DynamoDb时

Python &引用;errorMessage";:&引用;[<;class';十进制。不精确';<;class';十进制。四舍五入';];,在更新DynamoDb时,python,aws-lambda,amazon-dynamodb,Python,Aws Lambda,Amazon Dynamodb,代码如下 import json from decimal import Decimal from pprint import pprint import boto3 def update_movie(title, year, rating=None, plot=None, actors=None, dynamodb=None): if not dynamodb: dynamodb = boto3.resource('dynamodb') table = d

代码如下

import json
from decimal import Decimal
from pprint import pprint
import boto3


def update_movie(title, year, rating=None, plot=None, actors=None, dynamodb=None):
    if not dynamodb:
        dynamodb = boto3.resource('dynamodb')

    table = dynamodb.Table('Movies')

    response = table.update_item(
        Key={
            'year': year,
            'title': title
        },
        UpdateExpression="set info.rating=:r, info.plot=:p, info.actors=:a",
        ExpressionAttributeValues={
            ':r': Decimal(rating),
            ':p': plot,
            ':a': actors
        },
        ReturnValues="UPDATED_NEW"
    )
    return response


def lambda_handler(event, context):
    update_response = update_movie(
        "Rush", 2013, 8.3, "Car show",
        ["Daniel", "Chris", "Olivia"])
    print("Update movie succeeded:")
    pprint(update_response, sort_dicts=False)
在更新dynamodb中的一个密钥时,我得到了下面的错误

  "errorMessage": "[<class 'decimal.Inexact'>, <class 'decimal.Rounded'>]",
  "errorType": "Inexact",
试一下这个:

表达式属性值={
“:r”:十进制(str(评级)),
“:p”:绘图,
“:a”:演员
},

问题在于DynamoDB的浮点数表示法与Python的不同:

  • DynamoDB表示浮点数,表示形式为十进制。所以“8.3”可以精确地表示出来——没有舍入或不精确
  • Python使用传统的base-2表示法,因此它不能准确地表示8.3。8.3实际上表示为8.30000000000000007105,并且已知不精确(python不知道您打算在最后使用哪个数字)
  • SDK知道浮点8.3是不精确的,并拒绝使用它

    解决方案是按预期使用
    Decimal
    类:它应该使用字符串参数而不是浮点参数构造。也就是说,使用
    十进制(“8.3”)
    (注意引号),而不是
    十进制(8.3)

    在上面的代码中,修复这一问题就像将8.3改为“8.3”一样简单,并加上引号

    这是最好的办法。另一种不太好的方法是使用十进制(str(8.3)),但要为数字的不精确表示做好准备。此外,使用字符串创建
    十进制
    ,可以创建Python不支持的数字。例如,
    Decimal(“3.1415926535897932384626433832795028841”)
    将为您提供38位精度的十进制数字(DynamoDB支持的最大值)-这在Python浮点中是无法做到的。

    您能检查以下内容吗
    update_response = update_movie(
            "Rush", 2013, 8.3, "Car show",
            ["Daniel", "Chris", "Olivia"])
        print("Update movie succeeded:")```