Python查询DynamoDB价格报'str' object is not callable如何解决
报错核心原因
本质是变量名与Python内置函数重名,触发了标识符引用覆盖:
- Python内置的
max()、min()是可调用的原生工具函数,用于计算可迭代对象的最值。你在代码中直接将计算得到的最值赋值给了和内置函数完全同名的max、min变量:max = max(priceList) min = min(priceList) - 第一次调用函数时,代码执行到赋值语句右侧的
max(priceList)逻辑时,标识符max还未被本地赋值覆盖,会沿作用域链找到真正的内置max()函数,正常计算出字符串类型的最高价格,将结果赋值给max变量后正常返回。 - 第一次赋值完成后,
max的引用就从原本可调用的内置函数,变成了字符串类型的价格值。第二次执行同一行代码时,右侧的max已经是字符串对象,不是可调用的函数,自然会抛出'str' object is not callable的类型错误。
修复方案
- 直接替换与内置函数重名的变量名,避免覆盖原生函数引用,将原代码中的
max、min改为语义明确且不冲突的命名:for i,product in enumerate(response['Items']): print(i) priceList.append(product['attr']['price']) # 替换原有重名变量 max_price = max(priceList) min_price = min(priceList) data = { "pk": "PRODUCT", "sk": item['sk'], "min": min_price, "max": max_price } - 补充健壮性处理:DynamoDB查询可能返回空结果,建议在计算最值前判断
priceList是否为空,避免空列表触发ValueError:if not priceList: return json.dumps({"pk": "PRODUCT", "sk": item['sk'], "min": None, "max": None}) max_price = max(priceList) min_price = min(priceList) - 额外逻辑优化:你存储的价格是字符串类型,直接通过字符串比较得到的最值可能不符合数值大小逻辑(比如字符串排序时"9"会大于"100"),建议在加入
priceList前将字符串转为数值类型计算,得到结果后再转回字符串存入返回结构,避免计算偏差。
内容的提问来源于stack exchange,提问作者Niloy Rony
相关产品推荐
相关产品推荐

