python-telegram-bot执行NFT总价值计算后续命令返回异常值排查
问题根源分析
最可能的bug是计算总价值的变量未在每次命令调用时重置,导致重复累加,具体分两种常见场景:
1. 全局变量未重置
如果存储总价值的变量定义在命令处理函数外部(全局作用域),每次调用/Ben_eth时没有重新初始化,而是在原有值上继续累加,就会出现后续结果是初始值的倍数的情况。
示例错误代码:
total_value = 0 # 全局变量,会保留之前调用的结果 def ben_eth(update, context): global total_value # 获取单款NFT的地板价和ETH汇率 floor_price = get_opensea_floor() eth_usd = get_coinbase_rate() # 错误:每次调用都往旧值上加,而非重新计算 total_value += floor_price * eth_usd update.message.reply_text(f"总价值:{total_value} USD")
2. 上下文存储变量未重置
如果使用context.user_data或context.chat_data存储总价值,但每次计算前没有重置该值,而是直接累加,也会导致同样问题。
示例错误代码:
def ben_eth(update, context): floor_price = get_opensea_floor() eth_usd = get_coinbase_rate() nft_value = floor_price * eth_usd # 错误:仅首次初始化,后续调用直接累加 if 'total' not in context.user_data: context.user_data['total'] = 0 context.user_data['total'] += nft_value update.message.reply_text(f"总价值:{context.user_data['total']} USD")
修复方案
核心是每次执行命令时,重新初始化总价值变量,确保单次计算的累加只在当前命令周期内进行:
方案1:在函数内初始化变量
def ben_eth(update, context): total_value = 0 # 每次调用都重置为0 # 遍历你的NFT组合,逐个计算价值并累加 for collection in your_nft_portfolio: floor_price = get_opensea_floor(collection) eth_usd = get_coinbase_rate() total_value += floor_price * eth_usd update.message.reply_text(f"总价值:{total_value} USD")
方案2:使用上下文时先重置
def ben_eth(update, context): context.user_data['total'] = 0 # 计算前重置为0 for collection in your_nft_portfolio: floor_price = get_opensea_floor(collection) eth_usd = get_coinbase_rate() context.user_data['total'] += floor_price * eth_usd update.message.reply_text(f"总价值:{context.user_data['total']} USD")
原因说明
python-telegram-bot的bot进程是长期运行的,全局变量和上下文存储的变量会在多次命令调用间保留值。如果不重置,每次调用都会把新计算的价值加到旧结果上,自然出现倍数增长的错误。
内容的提问来源于stack exchange,提问作者spidermarn
相关产品推荐
相关产品推荐

