ValueError cuando el uso de json módulo en discord.py

0

Pregunta

Mi intención es crear un canal para los mensajes de bienvenida de inmediato cuando el robot se une y para ser capaz de cambiar mediante el comando asignado. Este es mi código:

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}**!"

pero me da este error:

 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

Yo no contó con el código de error localmente de modo que tuve que copiar y pegar el heroku código de error que pude encontrar.

He utilizado la misma estructura en otro de los comandos y funcionó muy bien. Yo no soy tan experimentado con el uso de json módulo en python, por lo que si alguien puede ayudar, sería impresionante. Muchas gracias

edit: finalmente me di cuenta de lo que hice mal, se suponía que yo uso otra variable en

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

Mejor respuesta

0

El error es de mencionar una referencia circular, que es donde se intenta hacer referencia al objeto que está dentro de él. Hacer esto cuando escribe:

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

Como usted puede ver, usted está asignando una propiedad del objeto welcomechannel a sí mismo.

Mabey desea intentar cambiar el nombre del parámetro de la función welcomechannel como actualmente es ambigua yo.e un par de líneas después de que comienza la función sobrescribir con un objeto json. Usted puede también cambiar el nombre de la variable de aquí:

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

pero, ¿qué puedo hacer para rectificar el error, mientras que todavía la extracción de la información?
Aadit John

También he utilizado la misma estructura con otro comando, y funcionó. Está bien si usted explicar las diferencias? Este es el comando cliente.comando(name="changeprefix") async def changeprefix(ctx, prefijo): open('prefijos.json', 'r') como f: prefijos = json.de carga(f) los prefijos[str(ctx.el gremio.id)] = prefijo con open ('prefijos.json', 'w') como f: json.dump(prefijos, f, sangría=4) esperan ctx.enviar(f"prefijo es ahora {prefix}!")
Aadit John

La diferencia es que en este nuevo ejemplo, se utiliza el parámetro de la función 'prefix', y asignar a una propiedad del objeto json 'prefijos'. Voy a actualizar mi respuesta.
ttrss

Ah, gracias, pero llegó con otro error. Esta vez, un TypeError. He actualizado mi pregunta para mostrar el error.
Aadit John

En otros idiomas

Esta página está en otros idiomas

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