ValueError lors de l'utilisation de json module dans discord.py

0

La question

Mon intention est d'établir un canal de messages de bienvenue immédiatement lorsque le bot de jointures et d'être en mesure de le changer à l'aide de la commande assignée. C'est mon code:

import discord
from discord.ext import commands
import json

def get_welcomechannel(client, message,):
    with open('welcomechannel.json', 'r') as f:
        welcomechannel = json.load(f)
    
    return welcomechannel[str(message.guild.id)]
@client.event
async def on_guild_join(guild):
    general = find(lambda x: x.name == 'general',  guild.text_channels)
    if general and general.permissions_for(guild.me).send_messages:
        await general.send(f'Hello {guild.name}! My name is {client.user.name} and my prefix is ``?``! run ``?help`` to begin using me!')

    with open('prefixes.json', 'r') as f:
        prefixes = json.load(f)   
    prefixes[str(guild.id)] = "?"

    with open ('prefixes.json', 'w') as f:
        json.dump(prefixes, f, indent=4)

    with open('welcomechannel.json', 'r') as f:
        welcomechannel = json.load(f)   
    welcomechannel[str(guild.id)] = "general"

    with open ('prefixes.json', 'w') as f:
        json.dump(prefixes, f, indent=4)
@client.event
async def on_guild_remove(guild):
    with open('prefixes.json', 'r') as f:
        prefixes = json.load(f)   
    prefixes.pop(str(guild.id))

    with open ('prefixes.json', 'w') as f:
        json.dump(prefixes, f, indent=4)

    with open('welcomechannel.json', 'r') as f:
        welcomechannel = json.load(f)   
    welcomechannel.pop(str(guild.id))

    with open ('welcomechannel.json', 'w') as f:
        json.dump(welcomechannel, f, indent=4)
        print(f"{guild.name} kicked me!")


#rest of code here...

@client.command(name="changewelcomechannel")
async def changewelcomechannel(ctx, welcomechannel):
    with open('welcomechannel.json', 'r') as f:
        welcomechannel = json.load(f)   
    
    welcomechannel[str(ctx.guild.id)] = welcomechannel

    with open ('welcomechannel.json', 'w') as f:
        json.dump(welcomechannel, f, indent=4)
        await ctx.send(f"Welcome channel is now **{welcomechannel}**!"

mais j'ai cette erreur:

 Ignoring exception in command changewelcomechannel:
2021-11-24T09:38:41.247854+00:00 app[worker.1]: Traceback (most recent call last):
2021-11-24T09:38:41.247927+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python3.9/site-packages/discord/ext/commands/core.py", line 85, in wrapped
2021-11-24T09:38:41.247928+00:00 app[worker.1]:     ret = await coro(*args, **kwargs)
2021-11-24T09:38:41.247943+00:00 app[worker.1]:   File "/app/bot.py", line 352, in changewelcomechannel
2021-11-24T09:38:41.247943+00:00 app[worker.1]:     json.dump(welcomechannel, f, indent=4)
2021-11-24T09:38:41.247957+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python3.9/json/__init__.py", line 179, in dump
2021-11-24T09:38:41.247958+00:00 app[worker.1]:     for chunk in iterable:
2021-11-24T09:38:41.247976+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python3.9/json/encoder.py", line 431, in _iterencode
2021-11-24T09:38:41.247976+00:00 app[worker.1]:     yield from _iterencode_dict(o, _current_indent_level)
2021-11-24T09:38:41.248004+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python3.9/json/encoder.py", line 405, in _iterencode_dict
2021-11-24T09:38:41.248005+00:00 app[worker.1]:     yield from chunks
2021-11-24T09:38:41.248018+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python3.9/json/encoder.py", line 340, in _iterencode_dict
2021-11-24T09:38:41.248019+00:00 app[worker.1]:     raise ValueError("Circular reference detected")
2021-11-24T09:38:41.248041+00:00 app[worker.1]: ValueError: Circular reference detected

Je n'ai pas eu le message d'erreur code en local, donc j'ai eu copiez et collez le heroku code d'erreur que j'ai pu trouver.

J'ai utilisé la même structure dans une autre commande et cela a fonctionné très bien. Je ne suis pas tellement d'expérience avec l'utilisation de json module en python, donc si quelqu'un pouvait m'aider, ce serait génial. Merci beaucoup

edit: j'ai finalement réalisé ce que j'ai fait de mal, je devais utiliser une autre variable dans

welcomechannel[str(ctx.guild.id)] = welcomechannel# this is supposed to be the new variable#
discord.py python
2021-11-24 06:31:21
1

La meilleure réponse

0

L'erreur est de mentionner une référence circulaire, qui est l'endroit où vous essayez de faire référence à l'objet que vous êtes à l'intérieur de. Vous le faites quand vous écrivez:

welcomechannel[str(ctx.guild.id)] = welcomechannel

Comme vous pouvez le voir, l'affectation d'une propriété de l'objet welcomechannel à lui-même.

Mabey vous voulez essayez de renommer le paramètre de la fonction welcomechannel comme c'est actuellement ambigu-je.e quelques lignes après le déclenchement de la fonction vous écraser avec un objet json. Vous pouvez également renommer la variable ici:

welcomechannel = json.load(f)
2021-11-25 10:43:15

mais que dois-je faire pour remédier à l'erreur lors de la encore l'extraction de l'info?
Aadit John

J'ai aussi utilisé la même structure avec une autre commande et cela a fonctionné. Est-il bien si vous nous expliquer les différences? C'est la commande du client.commande(nom="changeprefix") async def changeprefix(ctx, préfixe): with open('préfixes.json', 'r') as f: les préfixes = json.charge(f) les préfixes[str(ctx.la guilde.id)] = préfixe avec open ('préfixes.json', 'w') as f: json.dump(préfixes, f, tiret=4) attendre ctx.envoyer(f"préfixe est maintenant {préfixe}!")
Aadit John

La différence est que dans ce nouvel exemple, vous utilisez le paramètre de la fonction 'prefix', et en l'assignant à une propriété de l'objet json 'préfixes". Je vais mettre à jour ma réponse.
ttrss

Ah, merci, mais il est venu avec une autre erreur. Cette fois, une exception TypeError. J'ai mis à jour ma question pour montrer l'erreur.
Aadit John

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................