Discord货币机器人报错get_bank_data()未定义该如何解决?
问题原因及解决方案
核心错误原因
- 函数定义顺序错误:Python解释器按从上到下的顺序加载代码,你代码中
balance、beg、open_account三个调用get_bank_data的函数,定义位置在get_bank_data的完整有效定义之前,调用时函数还未被注册,因此触发未定义报错。你开头写的半截无返回值的get_bank_data属于无效冗余代码,实际生效的函数定义在所有调用逻辑之后,直接导致报错。 - 装饰器语法缺失:
balance函数上方的client.command()前缺少@符号,会导致命令注册失败同时引发语法异常。 - JSON读写模式错误:你写入JSON文件时统一使用了只读模式
r,运行到写入逻辑时会直接报错,需要改为写入模式w。 - 字符串插值语法缺失:
beg命令中发送收益的字符串前缺少f前缀,会导致变量earnings无法正常解析输出。
修正后的代码结构
import json import random import discord from discord.ext import commands # 工具函数统一放在所有命令逻辑之前定义 async def get_bank_data(): with open("kromerbank.json", "r") as f: users = json.load(f) return users async def open_account(user): users = await get_bank_data() if str(user.id) in users: return False else: users[str(user.id)] = {} users[str(user.id)]["wallet"] = 0 users[str(user.id)]["bank"] = 0 # 写入文件使用w模式 with open("kromerbank.json", "w") as f: json.dump(users,f) return True # 命令函数放在工具函数之后定义 @client.command() async def balance(ctx): await open_account(ctx.author) user = ctx.author users = await get_bank_data() wallet_amt = users[str(user.id)]["wallet"] bank_amt = users[str(user.id)]["bank"] em = discord.Embed(title = f"{ctx.author.name}'s balance",color = discord.Color.red()) em.add_field(name = "wallet balance",value = wallet_amt) em.add_field(name = "bank balance",value = bank_amt) await ctx.send(embed = em) @client.command() async def beg(ctx): await open_account(ctx.author) users = await get_bank_data() user = ctx.author earnings = random.randrange(101) # 字符串前加f前缀解析变量 await ctx.send(f"Someone gave you {earnings} kromer!") users[str(user.id)]["wallet"] += earnings # 写入文件使用w模式 with open("kromerbank.json", "w") as f: json.dump(users,f)
验证操作
删除开头冗余的半截get_bank_data代码,按上述顺序调整代码结构后重启机器人即可解决未定义报错,同时修复其他隐藏逻辑问题。
内容的提问来源于stack exchange,提问作者Ryan K
相关产品推荐
相关产品推荐

