【问题标题】:get_cog doesn't return loaded cog but None insteadget_cog 不返回加载的 cog,而是返回 None
【发布时间】:2020-04-19 13:39:21
【问题描述】:

在我的机器人中,我有一个命令,它只打印出所有加载的 cog 的名称(以及后来的描述)。 对于他们中的大多数人来说,它工作得非常好,但它似乎有一个名为 RNG 的问题

for c in bot.cogs:
    if c is None:
        continue
    else:
        cog_list.append(c)
cog_list = sorted(cog_list)
print(cog_list)
>>> ['General', 'Misc', 'RNG']`  # (all loaded cogs, so this is correct)
for cog in cog_list:
    cog = bot.get_cog(cog.title())
    print(cog)
    >>> <general.General object at [...]>  # 'General' cog
    >>> <misc.Misc object at [...]>        # 'Misc' cog
    >>> None                               # 'RNG' cog, but it's not found? 
                                           # (expected <rng.RNG object at [...]>)

只是为了显示 RNG cog 实际已加载,这是print(bot.cogs) 的输出:

{'General': <general.General object at [...]>, 'Misc': <misc.Misc object at [...]>, 'RNG': <rng.RNG object at [...]>}

我从文档中知道,当找不到 cog 时会返回 None,但我可以清楚地看到,RNG cog 已加载很多并且包含的​​命令工作正常。

现在我想知道它是否可能是名称,但对机器人执行 help RNG 也可以正常工作。

有没有办法让get_cog找到我的RNG模块?

【问题讨论】:

  • bot.cogs 返回一个对象字典,其中也包含 RNG 模块,为什么不直接使用它而不是尝试再次获取 cog(使用名称)?这种方法也会使您的代码更加健壮。
  • 我没有意识到我可以直接以这种方式使用它,但我也希望模块名称按字母顺序排序,并采用我已经熟悉的这种迂回方式。但你说得对,直接使用bot.cogs 更有意义!非常感谢!

标签: python discord.py-rewrite


【解决方案1】:

一些更具描述性的命名可以帮助您了解发生了什么

for cog_name in cog_list:
    print(cog_name.title())

打印

General
Misc
Rng

请注意,RNG 已变为 Rng。这是因为.title() 字符串方法正在制作字符串标题大小写,其中每个单词都大写。因此,在您的搜索中,您正在查找 Rng 并期望它找到 RNG,这不起作用,因为搜索区分大小写。

【讨论】:

  • 我不记得为什么我把 title() 放在那里......显然这会与区分大小写的搜索发生冲突!感谢您指出这一点!
猜你喜欢
  • 2023-03-20
  • 2018-03-08
  • 1970-01-01
  • 2019-10-13
  • 2012-09-24
  • 2015-11-16
  • 2016-04-20
  • 1970-01-01
  • 2019-06-12
相关资源
最近更新 更多