You need to enable JavaScript to run this app. Discord.py开发等级系统时遇TypeError: int类型不可迭代报错
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 20:36:03