Python开发Discord机器人出现IndentationError缩进不匹配问题求解
报错核心本质
你遇到的IndentationError: unindent does not match any outer indentation level和if amount == None的判断逻辑没有任何关系。Python没有大括号、分号这类标记划分代码块,完全靠缩进长度确定代码的从属关系,解析器读到第57行的时候,发现这行的缩进长度、缩进用的字符(空格和Tab混打)根本对不上它所属的外层代码块,直接拒绝往下运行。
代码中的具体缩进错位问题
对照你贴出的withdraw函数源码,缩进混乱的细节非常明确:
- 函数第一行
await open_account(ctx.author)前面凑了6个空格缩进,下一行同属函数体的if amount == None:前面只打了5个空格缩进,两个平级代码的缩进长度不一致,直接触发报错 - 后续
bal = await update_bank(ctx.author)前面仅打了3个空格缩进,比前面if块的缩进层级还低两级,代码块的从属关系完全乱套 - 函数内部的判断块缩进全程跳级:比如
if amount>bal[1]:下面的提示语句缩进了5个空格,紧随其后的return又缩进了7个空格,哪怕业务逻辑完全正确,缩进不匹配也通不过Python解析 - 隐形踩坑点:复制网上代码、按Tab打缩进、手动数空格凑视觉对齐时,哪怕行与行看起来齐平,实际解析器识别的缩进字符不统一、长度对不上,就会弹出这个报错。
修正后的规范代码
按照Python PEP8规范,统一使用4个空格作为单级缩进长度,修正后代码可直接运行:
@bot.command() async def withdraw(ctx,amount = None): await open_account(ctx.author) if amount == None: await ctx.send("Please enter a valid amount") return bal = await update_bank(ctx.author) amount = int(amount) if amount>bal[1]: await ctx.send("You don't have enough potatoes!") return if amount<0: await ctx.send("Can only send positive potatoes! No negative!") return await update_bank(ctx.author,amount) await update_bank(ctx.author,-1*amount, "bank") await ctx.send(f"You withdrew {amount} potatoes!")
补充优化点:判断空值的规范写法是
if amount is None:,相比== None执行效率更高,也能避免特殊对象重载等号判断带来的逻辑偏差,调整写法不影响当前报错的解决。
快速排查修正方法
- 打开编辑器的「显示不可见字符」功能,能直接看到哪些缩进是Tab、哪些是空格,整个代码块固定只用一种缩进方式(推荐统一用4个空格,不要混用Tab)
- 全选出问题的函数块,用编辑器自带的「统一缩进」功能一键规范所有缩进长度,不要手动数空格凑视觉对齐
- 写代码时保持编辑器的自动缩进功能开启,减少手动输入缩进带来的出错概率
内容的提问来源于stack exchange,提问作者CEUARS
相关产品推荐
相关产品推荐

