Seite 1 von 1

NameError: name '__mannschaftsname__' is not defined

Verfasst: Donnerstag 9. April 2020, 10:10
von Bill987654321
Habe jetzt die "Begriffe" angeglichen und schon wieder eine neue Frage.

Wenn in der vorletzten Zeile (if__......) "name" steht funktioniert das Programm. Habe auch hier den Begriff auf "mannschaftsname" geändert, um ihn anzugleichen. Mit "mannschaftsname" funktioniert es nicht (s. Bildschirmausdruck). Es kommt dann die Fehlermeldung "NameError: name '__mannschaftsname__' is not defined"
Warum funktioniert es nicht?

Code: Alles auswählen

#!/usr/bin/env python3

MANNSCHAFTSANZAHL = 4
MANNSCHAFTSNAMEN_DATEINAME = "Mannschaftsnamen.txt"

def mannschaftsnamen_eingeben(MANNSCHAFTSANZAHL):
    mannschaftsnamen = []
    for i in range(1, MANNSCHAFTSANZAHL + 1):
        mannschaftsnamen.append(input(f"Gebe den Namen der {i}. Mannschaft ein: "))
    mannschaftsnamen.sort()
    return mannschaftsnamen

def mannschaftsnamen_speichern(mannschaftsnamen, MANNSCHAFTSNAMEN_DATEINAME):
    with open(MANNSCHAFTSNAMEN_DATEINAME, "w", encoding="utf-8") as datei:
        for mannschaftsname in mannschaftsnamen:
            datei.write(f"{mannschaftsname}\n")

def mannschaftsnamen_laden(MANNSCHAFTSNAMEN_DATEINAME):
    mannschaftsnamen = []
    with open(MANNSCHAFTSNAMEN_DATEINAME, encoding="utf-8") as lines:
        for line in lines:
            mannschaftsnamen.append(line.rstrip())
    return mannschaftsnamen

def print_numbered_items(items):
    for i, item in enumerate(items, 1):
        print(f"{i}. {item}")

def main():
    print("Eingabe")
    mannschaftsnamen = mannschaftsnamen_eingeben(MANNSCHAFTSANZAHL)
    print_numbered_items(mannschaftsnamen)

    print("Speichern")
    mannschaftsnamen_speichern(mannschaftsnamen, MANNSCHAFTSNAMEN_DATEINAME)

    print("Laden")
    mannschaftsnamen = mannschaftsnamen_laden(MANNSCHAFTSNAMEN_DATEINAME)
    print_numbered_items(mannschaftsnamen)

if __mannschaftsname__ == "__main__":
    main()
Eingabe
Gebe den Namen der 1. Mannschaft ein: Dortmund
Gebe den Namen der 2. Mannschaft ein: HSV
Gebe den Namen der 3. Mannschaft ein: Augsburg
Gebe den Namen der 4. Mannschaft ein: Schalke
1. Augsburg
2. Dortmund
3. HSV
4. Schalke
Speichern
Laden
1. Augsburg
2. Dortmund
3. HSV
4. Schalke
>>>
= RESTART: C:/Users/pc/Desktop/Python Programme/20200407 Code von User def ergänzt von mir 02.py
Traceback (most recent call last):
File "C:/Users/pc/Desktop/Python Programme/20200407 Code von User def ergänzt von mir 02.py", line 41, in <module>
if __mannschaftsname__ == "__main__":
NameError: name '__mannschaftsname__' is not defined
>>>

Re: NameError: name '__mannschaftsname__' is not defined

Verfasst: Donnerstag 9. April 2020, 10:20
von __deets__
Die Namen mit doppelten Unterstrichen um sie herum sind von Python vordefiniert. Die kannst du dir nicht selbst ausdenken. Die Konvention wird verwendet um Kollisionen mit in der Domaene des Programmes zu vermeiden. Und __mannschaftsname__ ist eben nicht darunter. Der Name __name__ beinhaltet den Namen des Skriptes, das hier gerade ausgefuert wird. Und zwar nicht den Dateinamen, sondern den Modulnamen. Und mit einer Ausnahme: "__main__" ist das Skript, das gestartet wurde. Also wenn man ein Skript so startet:

$ python meinskript.py

dann ist

__name__ == "__main__"

Macht man hingegen

$ python -c 'import meinskript' # also als IMPORT!

dann ist

__name__ == "meinskript"

Und mit dieser if-Bedingung untercheidet man jetzt eben, ob ein Skript gestartet wurde, oder importiert. Du musst also __name__ beibehalten.

Re: NameError: name '__mannschaftsname__' is not defined

Verfasst: Donnerstag 9. April 2020, 10:26
von Bill987654321
Werde "name" beibehalten.
Vielen Dank für die Auskunft.

Re: NameError: name '__mannschaftsname__' is not defined

Verfasst: Donnerstag 9. April 2020, 11:07
von Sirius3
Nein, nicht name beibehalten, sondern __name__. Das ist ein ganz normaler Variablennamen wie sonst auch jeder andere, der nur aus Buchstaben, Unterstrich und Zahlen besteht. Da ist nichts magisches Dabei. sonst müsstest Du ja mannschaftsname in mannschaftsmannschaftsname in mannschaftsmannschaftsmannschaftsname ... umbenennen.

Re: NameError: name '__mannschaftsname__' is not defined

Verfasst: Donnerstag 9. April 2020, 11:14
von __blackjack__
@Bill987654321: Komm bitte endlich davon weg das Du den Überblick über alle im Quelltext verwendeten Namen brauchst und die deswegen überall angleichen musst. Das ist Python, mit Namensräumen, und kein uralt BASIC wo alle im gleichen Programm verwendeten Namen in *einem* globalen Namensraum coexistieren müssen, und man deshalb immer alle Namen des ganzen Programms im Kopf haben muss, damit man nicht aus versehen einen Namen für etwas anderes verwendet.

Darauf muss man nur innerhalb eines Namensraums achten, und dort verwendet man jeweils nur eine handvoll Namen, so dass solche Namenskollisionen nicht passieren können, weil man den Überblick dort sehr leicht behalten kann.

Re: NameError: name '__mannschaftsname__' is not defined

Verfasst: Donnerstag 9. April 2020, 11:35
von sparrow
Und Funktionen sind flexibel. Deshalb macht es auch keinen Sinn Parameter als KONSTANTEN groß zu schreiben. Denn man kann ihnen ja auch etwas anderes übergeben als eine Konstante. Zum Beispiel, wenn einem hinterher einfällt, dass man mehr als eine Datei zum Speichern verwendet.

Beispiel:

Code: Alles auswählen

def mannschaftsnamen_speichern(mannschaftsnamen, dateiname):
    with open(dateiname, "w", encoding="utf-8") as datei:
        for mannschaftsname in mannschaftsnamen:
            datei.write(f"{mannschaftsname}\n")
Ist auch gleich viel angenehmer zu lesen.

Re: NameError: name '__mannschaftsname__' is not defined

Verfasst: Donnerstag 9. April 2020, 13:45
von Bill987654321
Danke für die vielen Auskünfte.

Werde mit diesem Code weiterarbeiten:

Code: Alles auswählen

#!/usr/bin/env python3

MANNSCHAFTSANZAHL = 4
MANNSCHAFTSNAMEN_DATEINAME = "Mannschaftsnamen.txt"

def mannschaftsnamen_eingeben(anzahl):
    namen = []
    for i in range(1, anzahl + 1):
        namen.append(input(f"Gebe den Namen der {i}. Mannschaft ein: "))
    namen.sort()
    return namen

def mannschaftsnamen_speichern(namen, dateiname):
    with open(dateiname, "w", encoding="utf-8") as datei:
        for name in namen:
            datei.write(f"{name}\n")

def mannschaftsnamen_laden(dateiname):
    namen = []
    with open(dateiname, encoding="utf-8") as lines:
        for line in lines:
            namen.append(line.rstrip())
    return namen

def print_numbered_items(items):
    for i, item in enumerate(items, 1):
        print(f"{i}. {item}")

def main():
    print("Eingabe")
    mannschaftsnamen = mannschaftsnamen_eingeben(MANNSCHAFTSANZAHL)
    print_numbered_items(mannschaftsnamen)

    print("Speichern")
    mannschaftsnamen_speichern(mannschaftsnamen, MANNSCHAFTSNAMEN_DATEINAME)

    print("Laden")
    mannschaftsnamen = mannschaftsnamen_laden(MANNSCHAFTSNAMEN_DATEINAME)
    print_numbered_items(mannschaftsnamen)

if __name__ == "__main__":
    main()