Błąd wartości przy użyciu modułu json w discord.py

0

Pytanie

Moją intencją jest, aby ustawić kanał dla powitalne wiadomości natychmiast po podłączeniu bota i mieć możliwość jego zmiany za pomocą przypisanego polecenia. To jest mój kod:

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

ale pojawia się ten błąd:

 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

U mnie nie było pełnego kodu błędu lokalnie, więc musiałem skopiować i wkleić kod błędu heroku, który udało mi się znaleźć.

Użyłem tej samej struktury w drugiej drużynie i dobrze pracował. Nie mam dużego doświadczenia korzystania z modułu json w języku python, więc gdyby ktoś mógł pomóc, to byłoby wspaniale. Wielkie dzięki

Edit: w końcu zrozumiałem, co zrobiłem nie tak, powinienem był użyć innej zmiennej w

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

Najlepsza odpowiedź

0

Błąd polega na wspomnienie okrągłe linki, w której próbuje odwoływać się do obiektu, w którym jesteś. Robisz to, gdy piszesz:

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

Jak widać, można przypisać właściwość obiektu welcomechannel do siebie.

Мэйби, chcesz spróbować zmienić ustawienie funkcji welcomechannel ponieważ obecnie jest to niejednoznaczne, tzn. Po kilku wierszy po uruchomieniu funkcji перезаписываете jej obiektem json. Można również zmienić nazwę zmiennej tutaj:

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

ale co mam zrobić, aby naprawić błąd nadal wydobywając informacje?
Aadit John

Ja również wykorzystał tę samą strukturę z innym zespołem, i to się udało. Nic, jeśli wyjaśnij różnice? To zespół, klient.zespół(nazwa="changeprefix"): asynchroniczne def changeprefix(CTX, od prefiksu): open('prefiksy.JSON z', 'r') jako F: prefiksy = formacie JSON.siła(F) przedrostki [(ul. CTX.gildii.Idaho)] = prefiksu open ('prefiksy.w formacie JSON', 'g'), jak F: json pliku.wysypisko(prefiksy, pt, wcięcie=4) czekać na CTX.wysłać(F"w prefiks teraz {prefix}!")
Aadit John

Różnica polega na tym, że w tym nowym przykładzie używasz parametr funkcji "prefiks" i przypisać go do właściwości obiektu json "przedrostki". Ja uaktualnię swoją odpowiedź.
ttrss

Ach, dziękuję, ale to doprowadziło do jeszcze jednej błędzie. Tym razem błąd typu. Zaktualizowałem swoje pytanie, aby pokazać błąd.
Aadit John

W innych językach

Ta strona jest w innych językach

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