そのため、サーバー内のすべてのメンバーをループするボットを作成しようとしています。私はget_all_members()ジェネレーターを使用しています。
for member in client.get_all_members():
userName = str(member.name)
userGame = str(member.game)
userID = str(member.id)
print(userName, userGame, userID)
await client.send_message(message.channel, "User " + userName + "
(<@" + userID + ">) is playing " + userGame)
実行時にランダムにこのエラーが発生しました:
File "C:\Program Files\Python36\lib\site-packages\discord\client.py", line 307, in _run_event
yield from getattr(self, event)(*args, **kwargs)
File "C:\Users\Stefan\Source\Repos\AABot3\AABot3\AABot3.py", line 41, in on_message
for member in client.get_all_members():
File "C:\Program Files\Python36\lib\site-packages\discord\client.py", line 595, in get_all_members
for member in server.members:
RuntimeError: dictionary changed size during iteration –
このエラーを回避するにはどうすればよいですか?
get_all_members
ループする前に、からリストを作成してみてください。
for member in list(client.get_all_members()):
...
何が起こっているのかというと、Server
オブジェクトは自分Member
のを辞書に保存します。あなたの場合はawait
コルーチンあなたが待っている間、あなたは、他のコルーチンを実行するために続けているの1許可Server
日までにオブジェクトを。メンバーシップServer
が変更されるたびに、辞書も変更されます。何かが変化するときにそれを繰り返すべきではないため、Pythonはこれを検出し、プログラムを終了します。
最初に値をリストに読み込むことで、辞書がいつ変更されたかに気付くことはありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加