TypeError:'bool' 对象不可迭代

Posted

技术标签:

【中文标题】TypeError:\'bool\' 对象不可迭代【英文标题】:TypeError: 'bool' object is not iterableTypeError:'bool' 对象不可迭代 【发布时间】:2019-02-20 16:30:27 【问题描述】:

您好,我遇到了一些代码问题,我收到了类型错误 这是TypeError: 'bool' object is not iterable 我应该使用if 状态而不是for 语句吗?

我想要实现的是,如果on_message 一条消息已被固定 7 天或更长时间,则取消固定该消息。

这是我正在使用的:

async def on_message(self, message):
    """Listen for a message then unpin any other messages older than 7 days"""
    server = message.server
    channelid = '490899209067823135'
    limit_date = datetime.now() - timedelta(days=7)
    if server:
        for message.content in message.channel.id == channelid:
            if limit_date:
                try:
                    await self.bot.unpin_message(message)

                except discord.Forbidden:
                    print("No permissions to do that!")

不知道我哪里错了。

【问题讨论】:

for message.content in message.channel.id == channelid: - 你认为message.channel.id == channelid 的结果是什么?虽然整行对我来说没有多大意义 【参考方案1】:

在您的 for 循环中,message.channel.id == channelid 的计算结果为布尔值 TrueFalse。所以你的for 循环变成了

for message.content in True

for message.content in False

这里in的右边一定是一些可迭代的。编译器抱怨,因为它不是。

为了建议解决此问题的方法,我们需要更多关于您正在尝试做的事情的信息。

【讨论】:

【参考方案2】:

问题:

for message.content in message.channel.id == channelid:

== 是检查mess.age.channel.id 和channelid 是否相等,所以你的statemnts 有效地变成了

for message.content in true:

for message.content in false:

for 循环遍历列表或类似结构中的每个元素,因此它不能在“in”之后使用布尔值

我的猜测是您想分别分配 channelid 给 message.channel.id,然后循环遍历它。例如

message.channel.id = channelid
for message.content in message.channel.id:

【讨论】:

【参考方案3】:

for message.content in message.channel.id == channelid:

也许你的意思是

if message.channel.id == channelid:
    for message.content in message.channel.id

【讨论】:

【参考方案4】:

正如其他人指出的那样,因为 message.channel.id == channelid 要么返回 TrueFalse,所以你的 for 循环基本上变成了要么 对于 true 中的 message.content 要么 对于 False 中的 message.content

我想你在这里试图实现的是循环messages,其message.channel.id 等于channelid。因为你得到一个 message 作为函数 on_message 的参数传递,所以你根本不需要循环,因为你没有 multiple messages 来迭代 on_message 本身中。循环必须在外面,这里调用on_message,即;或获取作为参数传递的messages 列表。

对于您的代码,您可以简单地更改

for message.content in message.channel.id == channelid:

if message.channel.id == channelid:

【讨论】:

【参考方案5】:

所有答案都可以让您很好地了解为什么您的代码不起作用,但您可以通过以下方式实现您想要的:

async def on_message(self, message):
  """Listen for a message then unpin any other messages older than 7 days"""
  messages = await self.bot.pins_from(self.bot.get_channel('490899209067823135'))
  for msg in messages:
    if (datetime.now() - msg.timestamp).days > 7:
      try:
        await self.bot.unpin_message(msg)
  except discord.Forbidden:
    print("No permissions to do that!")

【讨论】:

当我在for msg in messages: 行之前添加if server: 我会得到一个AttributeError: 'Context' object has no attribute 'server' 上面的server = message.server加了吗?

以上是关于TypeError:'bool' 对象不可迭代的主要内容,如果未能解决你的问题,请参考以下文章

Python TypeError:'bool'对象不可调用[重复]

Flask-Login 引发 TypeError: 'bool' 对象在尝试覆盖 is_active 属性时不可调用

pyspark:TypeError:'float'对象不可迭代

TypeError: 'float' 类型的对象没有 len() & TypeError: 'float' 对象不可迭代

TypeError:“通知”对象不可迭代

“TypeError:'StratifiedShuffleSplit'对象不可迭代”的原因可能是啥?