Discord.py 的审计日志问题

时间:2021-02-24 05:29:09

标签: python discord.py

我正在为我的经济创建审计日志。在这一点上,我让它在有人使用经济命令时向频道发送消息。

async def audit_log(ctx, bot, action, stats=None, new_bank=None, new_money=None):
        audit_channel = bot.get_channel(813610020943953920)
        old_stats = stats
        new_stats = stats
        if new_bank is not None:
            new_stats['bank'] = new_bank
        if new_money is not None:
            new_stats['money'] = new_money

        await audit_channel.send(f'{ctx.author} did {action},\nprev-bank: {old_stats["bank"]}, prev-cash: {old_stats["money"]}\nnew-bank: {new_stats["bank"]}, new-cash: {new_stats["money"]}')

Stats 是分配给数据库中某人文档的字典。其中两个值是货币和银行。不是每个命令都会更新银行和货币,如果命令更新它通过它。现在我已经描述了代码,我将描述问题。当我收到不和谐的消息时,它的新旧都等于新。当我做一些打印时,我最终发现它改变了 if 语句中的 old_stats。它改变了货币中的货币和银行中的银行。

我花了大约 5 个小时试图解决这个问题,我们将不胜感激。

1 个答案:

答案 0 :(得分:2)

这里的错误是您将 old_statsnew_stats 都分配给 stats,并且由于字典是可变的,python 使 old_statsnew_stats 保持相同的字典,所以如果你更新一个,你就会更新“两者”。要解决此问题,您可以使用复制模块复制功能:copy.copy(stats)

这就是你的代码看起来固定的样子:

# imports
import copy

# ... other code
async def audit_log(ctx, bot, action, stats=None, new_bank=None, new_money=None):
        audit_channel = bot.get_channel(813610020943953920)
        old_stats = copy.copy(stats)
        new_stats = copy.copy(stats)
        if new_bank is not None:
            new_stats['bank'] = new_bank
        if new_money is not None:
            new_stats['money'] = new_money

        await audit_channel.send(f'{ctx.author} did {action},\nprev-bank: {old_stats["bank"]}, prev-cash: {old_stats["money"]}\nnew-bank: {new_stats["bank"]}, new-cash: {new_stats["money"]}')

说明

  1. 导入副本
  2. new_stats 分配给 stats 的副本并将 old_stats 分配给 stats 的副本。