You need to enable JavaScript to run this app. Python开发Discord机器人出现IndentationError缩进不匹配问题求解
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 14:06:08