Discord.py开发等级系统时遇TypeError: int类型不可迭代报错
报错根因
触发该TypeError的核心原因是Python中in操作符的使用规则和传入的变量类型不匹配:in关键字的作用是检查左侧的值是否存在于右侧的*可迭代对象(列表、集合、元组等)*中。本质上是代码里的判断逻辑(预设talk_channels为存了多个频道ID的可迭代容器)和实际配置赋值不匹配——你直接将talk_channels赋值为了整数类型的单频道ID,整数不属于可迭代类型,当代码执行到第28行的if message.channel.id in talk_channels时,Python无法在单个整数中完成“包含关系”判断,就会抛出argument of type 'int' is not iterable的错误。
对应修正方案
根据实际功能需求调整即可,不需要改动用户经验累加、等级阈值判定、等级自动发角色、rank查询、排行榜查询这类核心逻辑:
- 场景1:仅需支持单个频道作为经验获取渠道
直接把第28行的包含判断改成等值判断,保留talk_channels为整数类型单频道ID的赋值方式即可,修改后代码为:if message.channel.id == talk_channels - 场景2:需要支持多个频道共同作为经验获取渠道(也是当前判断写法的设计初衷)
把talk_channels的赋值从单个整数改成可迭代的集合/列表类型,将所有允许累计经验的频道ID存入容器。比如原来的赋值为talk_channels = 1234567890123456,修改后可以写成:talk_channels = {1234567890123456, 1234567890123457}
这种写法下in操作符会正常工作,集合的查询效率比普通列表更高,后续新增、删除可刷经验的频道时直接修改集合内的ID值即可。
同类问题排查提示
你提到bot_channel也采用了单整数频道ID的赋值方式,需要全局检查代码中所有和这两个配置相关的判断逻辑:凡是用in关联这两个配置的位置,要么统一改成等值判断适配单ID场景,要么把配置改成多值容器适配多ID场景,避免在其他事件触发点抛出同类类型错误。
针对这套接入MongoDB的等级系统,后续也可以把可刷经验的频道ID、等级对应角色的规则存在MongoDB的服务器配置集合里,调整规则时不需要修改代码重启机器人,仅修改数据库内容即可完成更新。
内容的提问来源于stack exchange,提问作者Finniedj
相关产品推荐
相关产品推荐

