【问题标题】:discord.py Warns command "data is not defined"discord.py 警告命令“数据未定义”
【发布时间】:2021-05-25 19:50:39
【问题描述】:

我有这个警告命令,我试图让它显示用户的警告,我尝试发出命令,每当我尝试启动我的机器人时,它都会显示"data is not defined"

这是我的代码:

@bot.command()
async def test(ctx, user:discord.Member):
 with open("warns.json", "r") as f:
    data = json.load(f)

user_data = data[str(user.id)]

print(f"Total warnings: {len(user_data)}")

for warn in user_data:
    warn_id, mod, reason, time = warn.values()
    print(f"ID: {warn_id}, mod: {mod}, reason: {reason}")

【问题讨论】:

  • 使用上下文管理器后,您的所有代码都在函数之外
  • @12944qwerty 对于open() 函数,文件的内容,无论如何读取,都可以在上下文管理器之外引用。所以data 可以在with 子句之外被引用,但它仍然必须在async def test() 函数体内被引用。
  • @JacobLee 我知道,这就是我的意思。抱歉,如果不清楚。

标签: discord.py


【解决方案1】:

正如 cmets 中提到的 12944qwerty:您的代码在函数之外。

请确保正确缩进代码。

试试你的新代码:

@bot.command()
async def test(ctx, user: discord.Member):
    with open("warns.json", "r") as f:
        data = json.load(f)

        user_data = data[str(user.id)]
        print(f"Total warnings: {len(user_data)}")

        for warn in user_data:
            warn_id, mod, reason, time = warn.values()
            print(f"ID: {warn_id}, mod: {mod}, reason: {reason}")

【讨论】:

  • 只有data = json.load(f) 行必须在上下文管理器中。所有其他行,即使它们引用data,也可以在with 子句之外。
  • @JacobLee 这将是正确的方法。如果我理解正确,所有其他表示都会出错。
  • 如果减少user_data = data[str(user.id)] 之后和包括user_data = data[str(user.id)] 的行的缩进,使它们在async def test(...): 内部,但在with open(...) as f: 外部,则不会产生任何错误。只有data = json.load(f) 需要在上下文管理器中,而不是整个函数体。
猜你喜欢
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 2020-03-31
  • 2021-05-05
  • 1970-01-01
  • 2022-12-10
相关资源
最近更新 更多