Klassen aus einer weiteren Datei richtig einlesen

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
Rayano
User
Beiträge: 22
Registriert: Freitag 7. Juli 2023, 09:21

Hallo,

ich habe folgendes Prpblem:

ich habe in der Der Datei: daten.py ein Klasse erstellt mit dazugehöriger liste:

Code: Alles auswählen

class Frage:
    def __init__(self, text, richtige_antwort, falsche_antworten):
        self.text = text
        self.richtige_antwort = richtige_antwort
        self.falsche_antworten = falsche_antworten

fragen = [
    Frage("Ca. wieviele Charaktere gibt es in FF14?", "13 Mio", ["20 Mio", "8 Mio"]),
    Frage("Welche ist die am häufigsten gespielt männliche Rasse?", "Hyur", ["Miqo'te", "Lalafell"]),
    Frage("Welche ist die am häufigsten vertretene Klasse?", "Barde", ["Paladin", "Weißmagier"]),
    Frage("Wieviele Datenzentren gibt es aktuell?", "77", ["83", "65"]),
    Frage("Wieviele Hochzeiten gab es ca. Ingame (ewiger Bund)?", "400000", ["200,000", "1 Mio"]),
    Frage("Wer ist der Schutzgott von Ul'dah?", "Nald'thal", ["Thaliak", "Halone"]),
    Frage("Die Miqo'te (Sonnentatzen) haben am Anfang ihres Namens einen Buchstaben, der ihren Stamm repräsentiert. Der Name steht jeweils für ein Tier, wofür steht das M?", "Murmelhörnchen", ["Mull", "Morbol"]),
    Frage("Wie viele Ätheryten gibt es im Spiel?", "2155", ["736", "1,498"]),
wenn ich aber die Klasse in meine main.py laden will

Code: Alles auswählen

import random
from daten import Frage, fragen
wird mir in Pycame Frage in Grau angezeigt. fragen wird aber normal angezeigt also in weiß. was mache ich falsch kann mir das jemand sagen?
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich weiß zwar nicht was "Pycame" ist, aber wenn etwas grau im Editor angezeigt wird, ist das normalerweise ein Zeichen dafür, dass dieser Name nirgends verwendet wird. Man kann also den Import aufräumen.
Konstanten schreibt man komplett gross, es sollte also FRAGEN sein und nicht fragen.
Rayano
User
Beiträge: 22
Registriert: Freitag 7. Juli 2023, 09:21

Ok danke, ich habe Frage entfernt und nun klappt es. Das Programm ist noch lange nicht fertig, Den Code werde ich später noch optimieren. Jetzt muss ich erstmal paar bookmarks schreiben damit ich später änderungen machen kann. An den Code habe ich jetzt einen Monat geschrieben. Zum Glück habe ich ein paar leute die das Programm schonmal testen wäre ich mir neue sachen ausdenken kann :D

Ich verstehe nur trotzdem nicht warum ich zwar listen inportieren kann aber keine Klassen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie kommst du darauf, dass du keine Klassen importieren koenntest? Wenn das nicht ginge, wuerde dein Programm abschmieren. Tut es nicht. PyCharm zeigt lediglich an, dass du die importierte Klasse *nicht benutzt* an der Stelle, an der sie importiert wird, wie Sirius3 schon ausgefuehrt hat. Das ist ein Code-Smell, darum wird das angemaekelt. Aber es ist kein *FEHLER*.

Das die Liste die Objekte vom Typ Frage enthael, hat damit nichts zu tun. Die muessen nicht von dir importiert werden, damit das geht.
Rayano
User
Beiträge: 22
Registriert: Freitag 7. Juli 2023, 09:21

ok jetzt habe ich es verstanden danke. Es war mir nicht ganz klar. Aber wenn ich es richtig verstehe ist die liste mit meiner Class verknüpft und deswegen brauche ich nur eins inportieren.Der Grund warum ich nachgefragt habe ist folgender:

Hier mal der Ganze code:

Code: Alles auswählen

import random
from daten import Frage, fragen_liste

def main():
    print("Willkommen bei")
    print("Wer wird Gillinonär")
    print("Alle Fragen die Final Fantasy 14 betreffen, sind auf den Stand von August 2022")
    name = input("Verrate mir deinen Namen: ")

    while True:
        antwort = input("Ist " + name + " korrekt? Antworte mit Ja/Nein: ").lower()
        if antwort == "ja":
            print("Dann fangen wir an, " + name + ".")
            break
        elif antwort == "nein":
            name = input("Verrate mir deinen Namen: ")
        else:
            print("Ungültige Eingabe. Antworte mit Ja/Nein.")

    print("Willkommen, " + name + "!")

    used_indices = []  # Liste für bereits verwendete Fragen-Indizes
    punkte = 0
    while len(used_indices) < len(fragen):
        index = random.randint(0, len(fragen) - 1)
        if index not in used_indices:
            used_indices.append(index)
            frage_objekt = fragen[index]

            print(frage_objekt.text)

            answers = [frage_objekt.richtige_antwort] + frage_objekt.falsche_antworten
            random.shuffle(answers)

            for i, answer in enumerate(answers):
                letter = chr(65 + i)
                print(f"{letter}: {answer}")

            user_antwort = input("Deine Antwort (A/B/C/D): ").upper()
            if user_antwort == chr(65 + answers.index(frage_objekt.richtige_antwort)):
                print("Richtig!\n")
                punkte = +1
            else:
                print("Falsch!\n")
                break

    print("Vielen Dank fürs Spielen!")
    print("Du hast " + str(punkte) + " fragen Richtig")


if __name__ == "__main__":
    main()
Ich weis da sind noch einige sachen drin die ich ändern kann aber in diesen code hatte ich noch den Import befehl, da ich zur besseren Lesbarkeit zumindest für mich und zu lernzwecken die fragen ausgelagert habe.

Code: Alles auswählen

class Frage:
    def __init__(self, text, richtige_antwort, falsche_antworten):
        self.text = text
        self.richtige_antwort = richtige_antwort
        self.falsche_antworten = falsche_antworten

fragen = [
    Frage("Ca. wieviele Charaktere gibt es in FF14?", "13 Mio", ["20 Mio", "8 Mio"]),
    Frage("Welche ist die am häufigsten gespielt männliche Rasse?", "Hyur", ["Miqo'te", "Lalafell"]),
    Frage("Welche ist die am häufigsten vertretene Klasse?", "Barde", ["Paladin", "Weißmagier"]),
    Frage("Wieviele Datenzentren gibt es aktuell?", "77", ["83", "65"]),
    Frage("Wieviele Hochzeiten gab es ca. Ingame (ewiger Bund)?", "400000", ["200,000", "1 Mio"]),
    Frage("Wer ist der Schutzgott von Ul'dah?", "Nald'thal", ["Thaliak", "Halone"]),
    Frage("Die Miqo'te (Sonnentatzen) haben am Anfang ihres Namens einen Buchstaben, der ihren Stamm repräsentiert. Der Name steht jeweils für ein Tier, wofür steht das M?", "Murmelhörnchen", ["Mull", "Morbol"]),
    Frage("Wie viele Ätheryten gibt es im Spiel?", "2155", ["736", "1,498"]),
    Frage("Lalafell sind die kleinste Rasse im Spiel. Was ist die geringste Größe, die man wählen kann?", "86.9 cm", ["79,2 cm", "90,8 cm"]),
    Frage("Der Gold Saucer stammt ursprünglich aus welchem Teil?", "7", ["9", "11"]),
    Frage("Das Kartenspiel Triple Triad stammt aus Teil 8. Wie hieß es dort?", "Balamb Card", ["Stratego Card", "Monster Card"]),
    Frage("Wie viele Baurezepte (alle Kategorien) hat derzeit der Gourmet?", "719", ["553", "1012"]),
    Frage("Die Revolverklinge stammt ursprünglich aus welchem Teil?", "8", ["7", "10"]),
    Frage("Wie viele Dungeons gibt es derzeit?", "86", ["65", "73"])
Die zeile mit dem inport hat nicht vollständig funktioniert deswegen habe ich nachgefragt. aber jetzt habe ich es verstanden. Danke
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

Jetzt importierst Du ja auch fragen_liste, und das existiert nicht.
Strings stückelt man nicht per + zusammen, sondern benutzt Formatstrings.
Man benutzt keine Indices. Wenn Du eh alle Fragen durchgehen willst, benutzt man einmal random.shuffle und geht dann alle Fragen mit for durch.
Alles in Python ist ein Objekt, `frage_objekt` ist also in komischer Name.
Um eins Hochzuzählen benutzt man += 1 nicht = +1

Code: Alles auswählen

import random
from daten import fragen

def main():
    print("Willkommen bei")
    print("Wer wird Gillinonär")
    print("Alle Fragen die Final Fantasy 14 betreffen, sind auf den Stand von August 2022")
    name = input("Verrate mir deinen Namen: ")

    while True:
        antwort = input(f"Ist {name} korrekt? Antworte mit Ja/Nein: ").lower()
        if antwort == "ja":
            break
        elif antwort == "nein":
            name = input("Verrate mir deinen Namen: ")
        else:
            print("Ungültige Eingabe. Antworte mit Ja/Nein.")
    print(f"Dann fangen wir an, {name}.")

    print(f"Willkommen, {name}!")

    random.shuffle(fragen)
    punkte = 0
    for frage in fragen:
            print(frage.text)

            answers = [frage.richtige_antwort] + frage.falsche_antworten
            random.shuffle(answers)

            for i, answer in enumerate(answers, 65):
                print(f"{chr(i)}: {answer}")

            user_antwort = input("Deine Antwort (A/B/C/D): ").upper()
            if ord(user_antwort) - 65 == answers.index(frage.richtige_antwort):
                print("Richtig!\n")
                punkte += 1
            else:
                print("Falsch!\n")
                break

    print("Vielen Dank fürs Spielen!")
    print(f"Du hast {punkte} fragen Richtig")


if __name__ == "__main__":
    main()
Antworten