SyntaxError: invalid syntax

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
H8der
User
Beiträge: 3
Registriert: Samstag 11. Januar 2020, 13:39

Dienstag 14. Januar 2020, 20:57

mein Quelltext:

import asyncio
from random import randint
import discord
from discord import member
import random
import time

client = discord.Client()

@client.event
async def on_ready():

print('Ich bin {}'.format(client.user.name))
client.loop.create_task(status_task())

async def status_task():
while True:
await client.change_presence(activity=discord.Game('mit euren Leben'), status=discord.Status.online)

def server(random):
pass

@client.event
async def on_message(message):
if message.author.bot:
return

if message.content.startswith('!gott'):
x = random.randint(1,4)

if x==1:
y = ""
elif x==2:
y = ""
elif x==3:
y = ""
elif x == 4:
roleMembers = []
for member in server.members:
for role in member.roles:
if role.name == 'your_role_name' and member.status == 'online':
roleMembers.append(member)
memberCount = len(roleMembers)
randomNumber = random.randint(0, (memberCount - 1))
y = "{0.author.mention} findet".roleMembers(randomNumber). "toll."

await message.channel.send(y)



Fehlermeldung:
C:\Users\valen\AppData\Local\Programs\Python\Python38-32\python.exe C:/DiscordBot/bot/Bot.py
File "C:/DiscordBot/bot/Bot.py", line 45
y = "{0.author.mention} kommt".roleMembers(randomNumber). "sehr nah."
^
SyntaxError: invalid syntax

Process finished with exit code 1


Könnte mir bitte jemand sagen was ich falsch gemacht habe, dass dieser Fehler angezeigt wird?

Lg Valle
Benutzeravatar
noisefloor
User
Beiträge: 2928
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Dienstag 14. Januar 2020, 21:13

Hallo,

die ganze Zeile ist kein valides Python. Was hast du denn da genau vor? Wenn du etwas zu einem String verknüpfen willst musst du entweder die format-Methoden von Strings oder ab Python 3.6 f-Strings benutzen. Deine Zeile sieht da wie ein misslungener Versuch aus...

Bitte Code in Zukunft in einen Code-Block setzen, damit der Code lesbar ist. Einen Codde-Block bekommst du durch einen Klick auf die Schaltfläche </> im Editor über dem Eingabefeld.

Gruß, noisefloor
H8der
User
Beiträge: 3
Registriert: Samstag 11. Januar 2020, 13:39

Mittwoch 15. Januar 2020, 08:33

Leider ist das alles beim absenden verrutscht. Ich wollte einen random Spieler vom Discord-Server erwähnen. Der Fehler wird unter den ersten " nach dem .roleMembers(randomNumber)
Benutzeravatar
sparrow
User
Beiträge: 2003
Registriert: Freitag 17. April 2009, 10:28

Mittwoch 15. Januar 2020, 09:33

Setze deinen Code in Code-Tags. Diese werden automatisch eingefügt, wenn du "Vollständiger Editor & Vorschau" unter der Schnellantwort wählst und dort den </>-Button drückst.

Ansonsten hat der Fehler nichts mit einer fehlenden Einrückung zu tun. Wie Noisefloor bereits schrieb: die Zeile ist kein Python. Benutze die .format-Methode oder bei aktuellen Python-Verisonen f-Strings um Zeichenketten mit Platzhaltern zu formatieren.
Hier der Teil in der Dokumentation.

Code: Alles auswählen

>>> name = "Fu"
>>> "Hallo {0}".format(name,)
'Hallo Fu'
>>> f"Hallo {name}"
'Hallo Fu'
Benutzeravatar
__blackjack__
User
Beiträge: 6543
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mittwoch 15. Januar 2020, 10:34

@H8der: Anmerkungen: `asyncio`, `time`, `random.randint()`, und `discord.member` werden importiert, aber nicht verwendet.

Namen schreibt man in Python klein_mit_unterstrichen. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Wenn der Memberstatus entscheided ob eine Rolle zur Auswahl in Frage kommt, braucht man sich Rollen von Membern mit dem falschen Status gar nicht erst anschauen. Bei `role_members` würde sich auch eine „list comprehension“ anbieten:

Code: Alles auswählen

            role_members = [
                member
                for member in server.members
                if member.status == "online"
                and "your_role_name" in (role.name for role in member.roles)
            ]
Was hier noch falsch ist, ist das `server` das aus dem nichts kommt. Auf Modulebene ist das der Name einer Funktion (die nichts tut‽) und die sicher kein `members`-Attribut hat.

`y` ist ein guter Name wenn es um einen Zahlenwert geht der eine Y-Koordinate beschreibt, aber ein sehr schlechter Name wenn es um den Inhalt einer Textnachricht geht.

Um zufällig ein Element aus einer Sequenz wie einer Liste auszuwählen gibt es die `random.choice()`-Funktion. Falls man sich das aus irgendwelchen Gründen selber basteln möchte, würde man auch eher `random.randrange()` statt `random.randint()` verwenden.

Die ``if``/``elif`` für die Werte 1 bis 3 kann man sich sparen wenn man aus dem für 4 ein ``if`` macht und die leere Zeichenkette einfach in einem ``else`` dazu dem Namen für die Nachricht zuweist.
long long ago; /* in a galaxy far far away */
H8der
User
Beiträge: 3
Registriert: Samstag 11. Januar 2020, 13:39

Mittwoch 15. Januar 2020, 14:11

Code: Alles auswählen

import asyncio
import random
import discord

client = discord.Client()

@client.event
async def on_ready():

    print('Ich bin {}'.format(client.user.name))
    client.loop.create_task(status_task())

async def status_task():
    while True:
        await client.change_presence(activity=discord.Game('mit euren Leben'), status=discord.Status.online)

def server(random):
    pass

@client.event
async def on_message(message):
    if message.author.bot:
        return

    if message.content.startswith('!gott'):
        x = random.randint(1,4)

        if x==1:
            y = "Yserius hat die Kraft die Individualität seiner Feinde zu rauben und damit die Besonderheit und dessen Fähigkeiten zu absorbieren."
        elif x==2:
            y = "Mr"
        elif x==3:
            y = "{0.author.mention} kommt Jaspega sehr nah.".format(message)
        elif x == 4:
            role_members = [
                member
                for member in server.members
                if member.status == "online"
                   and "your_role_name" in (role.name for role in member.roles)
            ]
            y = "{0.author.mention} kommt".roleMembers(randomNumber)
            'sehr nah.'

        await message.channel.send(y)

    if 'Bist du sicher?' in message.content:
        await message.channel.send('Absolut.')
        await asyncio.sleep(10)
        await message.channel.send(';D')
        await asyncjio.sleep(7200)
 
 client.run("NjY0MjAzMzg2NjU2MjYwMTA2.Xb3zyg.5ctPZaQeGaUEuhR-vKD6Z2ohWvQ")
Der Bot startet jetzt aber er zeigt trotzdem den Fehler an:
Task exception was never retrieved
future: <Task finished name='Task-15' coro=<status_task() done, defined at C:/DiscordBot/bot/Bot.py:13> exception=ConnectionClosed('WebSocket connection is closed: code = 4008 (private use), reason = Rate limited.')>
Traceback (most recent call last):
File "C:/DiscordBot/bot/Bot.py", line 15, in status_task
await client.change_presence(activity=discord.Game('mit euren Leben'), status=discord.Status.online)
File "C:\Users\valen\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\client.py", line 874, in change_presence
await self.ws.change_presence(activity=activity, status=status, afk=afk)
File "C:\Users\valen\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\gateway.py", line 510, in change_presence
await self.send(sent)
File "C:\Users\valen\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\gateway.py", line 480, in send
await super().send(data)
File "C:\Users\valen\AppData\Local\Programs\Python\Python38-32\lib\site-packages\websockets\protocol.py", line 361, in send
yield from self.ensure_open()
File "C:\Users\valen\AppData\Local\Programs\Python\Python38-32\lib\site-packages\websockets\protocol.py", line 511, in ensure_open
raise ConnectionClosed(
websockets.exceptions.ConnectionClosed: WebSocket connection is closed: code = 4008 (private use), reason = Rate limited.



Und sobald der Befehl kommen sollte zeigt er den Fehlercode an (vielleicht weil ich alleine auf den Server bin):
Ignoring exception in on_message
Traceback (most recent call last):
File "C:\Users\valen\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\client.py", line 270, in _run_event
await coro(*args, **kwargs)
File "C:/DiscordBot/bot/Bot.py", line 37, in on_message
for member in server.members
AttributeError: 'function' object has no attribute 'members'
Benutzeravatar
__blackjack__
User
Beiträge: 6543
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mittwoch 15. Januar 2020, 14:18

@H8der: Ja, genau das habe ich ja in meinem letzten Beitrag auch schon beschrieben. Die Funktion `server` hat halt kein `members`-Attribut. Warum auch. Die Funktion macht zudem auch gar nichts und wird ansonsten auch überhaupt nicht verwendet. Warum gibt es die da?

Die Zeile mit dem Syntaxfehler ist zwar nun syntaktisch korrekt, macht aber immer noch überhaupt gar keinen Sinn und wird zu einem Laufzeitfehler führen, weil Zeichenketten keine `roleMembers()`-Methode haben. `randomNumber` wäre auch nirgends definiert. Und ein Ausdruck der nur aus dem Zeichenkettenliteral 'sehr nah.' besteht mit dem nichts gemacht wird, ist auch komplett sinnfrei.
long long ago; /* in a galaxy far far away */
Antworten