You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python开发Discord工具elif分支触发TypeError报错排查

Discord工具删除服务器模块报错排查

问题背景

开发包含16项功能的Discord工具过程中,开发删除Discord服务器功能模块时,elif语句块执行触发报错,已尝试所有已知排查方法均未解决,核心报错为执行for guild in acc['guildsID']语句时,抛出TypeError: 'NoneType' object is not subscriptable异常。

关联代码

登录函数代码

def login(token):
    data = {}
    @client.event
    async def on_ready():
        try:
            os.system(f'title 8300 │ Authenticated: {client.user.name}#{client.user.discriminator}')
            RPC.close()
            RPC.connect()
            RPC.update(state=f'Authorized Token: {client.user.name}#{client.user.discriminator}', details='Awaiting Nuke Option', large_image='8300',small_image="8300",large_text="discord.gg/83",small_text="8300")
        except Exception as e:
            pass

删除服务器函数代码

def deleteg(guild, token):
    re = requests.delete(f'https://discord.com/api/v8/guilds/{guild}', headers={"Authorization": token})
    if re.status_code == 200 or re.status_code == 201 or re.status_code == 204:
        print(f"{r}[{g}STATUS{r}] {g}Deleted {r}>> [ {g}{guild} {r}]")
    elif re.status_code == 429:
        print(f"{r}[{g}STATUS{r}] {g}Failed Delete {r}>> [ {g}{guild} {r}]")
        time.sleep(re.json()['retry_after'])

elif分支业务逻辑代码

elif opcija == 2:
        clear()
        token = input("Enter a token of the user: ")
        acc = login(token)
        for guild in acc['guildsID']:
            threading.Thread(target=deleteG(), args=(guild,token,))

完整报错栈

Traceback (most recent call last):
  File "C:\Users\OVDE KLIK\Documents\Projekat\main.py", line 191, in <module>
    dizajn()
  File "C:\Users\OVDE KLIK\Documents\Projekat\main.py", line 187, in dizajn
    for guild in acc['guildsID']:
TypeError: 'NoneType' object is not subscriptable

根因分析

  • 核心触发原因:login()函数没有写任何return返回值,Python中无显式return的函数默认返回None,因此变量acc实际是None类型,对None做下标取值['guildsID']必然触发类型错误。函数内定义的data = {}既没有填充用户、服务器相关数据,也没有被返回,属于无效代码。
  • 登录流程不完整:login()函数内只注册了on_ready事件,没有调用客户端启动方法(比如client.run(token))发起连接,注册的回调根本不会触发,永远拿不到登录后的用户数据。
  • 逻辑时序错误:on_ready是discord客户端的异步回调事件,就算补了客户端启动逻辑,调用login后客户端还没完成连接鉴权、没拉取到用户的服务器列表,代码就直接往下执行遍历逻辑,也拿不到有效数据。
  • 线程调用错误:定义的删除函数名为deleteg(末尾g为小写),调用线程时写的deleteG(大写G)会触发名称错误;且target=deleteG()加了括号会直接同步执行函数,不会把函数对象传给线程做异步执行;另外创建线程后没有调用start()方法,线程根本不会运行。
  • 限流逻辑缺失:429限流分支只做了sleep,没有重试逻辑,限流等待结束后不会重新发起删除请求。

修复要点

  1. 补全login逻辑:添加客户端启动代码,等on_ready事件触发、客户端拉取到当前用户所有所属服务器ID后,把数据存入返回值,再执行后续遍历逻辑;也可以直接把删服务器的逻辑放到on_ready回调里,规避异步时序问题。
  2. 修正线程调用写法:target参数传函数对象不要加括号,函数名和定义保持一致,创建线程后必须调用start()启动,示例写法:threading.Thread(target=deleteg, args=(guild,token)).start()。
  3. 补全429限流后的重试逻辑,sleep结束后重新调用删除接口。
  4. 增加acc非空判断,鉴权失败时直接抛出明确提示,避免类型错误。

内容的提问来源于stack exchange,提问作者Peruska

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:30:48