Seite 1 von 1
prüfen ob Variable existiert
Verfasst: Freitag 25. November 2022, 22:55
von _Mala_Fide_
Hallo,
habe im Internet gesucht, wie ich prüfen kann ob eine Variable bereits existiert oder nicht.
Bin auf folgende Lösung gestoßen:
Wollte fragen, ob das suchen in locals ein guter Weg ist, um zu prüfen ob eine Variable bereits existiert, oder ob es da einen besseren weg gibt?
Re: prüfen ob Variable existiert
Verfasst: Freitag 25. November 2022, 23:27
von sparrow
Es ist kein guter Weg, denn der Umstand, dass du das prüfen muss, sollte in einem Programm nie auftreten.
Warum denkst du, dass du das brauchst?
Re: prüfen ob Variable existiert
Verfasst: Freitag 25. November 2022, 23:32
von _Mala_Fide_
Zum besseren Verständnis hier noch die Methode, um die es geht:
Code: Alles auswählen
@staticmethod
def outside_coords(side, coords):
"""
gibt die Koordinaten der Aussenseiten der Figur zurück
"""
columns = sorted({column for row, column in coords})
if len(columns) == 1:
left_columns = right_columns = columns
if side == "left":
if "left_columns" not in locals():
left_columns = columns[:len(columns)//2]
left_coords = [(row, column) for row, column in coords
if column in left_columns
]
return left_coords
elif side == "right":
if "right_columns" not in locals():
right_columns = columns[len(columns)//2:]
right_coords = [(row, column) for row, column in coords
if column in right_columns
]
return right_coords
Ich hatte es erst so:
Code: Alles auswählen
@staticmethod
def outside_coords(side, coords):
"""
gibt die Koordinaten der Aussenseiten der Figur zurück
"""
columns = sorted({column for row, column in coords})
if len(columns) == 1:
left_columns = right_columns = columns
elif len(columns) > 1:
left_columns = columns[:len(columns)//2]
right_columns = columns[len(columns)//2:]
if side == "left":
left_coords = [(row, column) for row, column in coords
if column in left_columns
]
return left_coords
elif side == "right":
right_coords = [(row, column) for row, column in coords
if column in right_columns
]
return right_coords
Hier hatte ich aber überlegt, dass wenn side gleich "left" ist, right_columns zwar Werte zugewiesen werden, aber die Variable nicht verwendet wird und das wollte ich gerne vermeiden.
Nochmal davor hatte ich die Methode wie folgt:
Code: Alles auswählen
@staticmethod
def outside_coords(side, coords):
"""
gibt die Koordinaten der Aussenseiten der Figur zurück
"""
columns = sorted({column for row, column in coords})
if side == "left":
if len(columns) == 1:
left_columns = columns
elif len(columns) > 1:
left_columns = columns[:len(columns)//2]
left_coords = [(row, column) for row, column in coords
if column in left_columns
]
return left_coords
elif side == "right":
if len(columns) == 1:
right_columns = columns
elif len(columns) > 1:
right_columns = columns[len(columns)//2:]
right_coords = [(row, column) for row, column in coords
if column in right_columns
]
return right_coords
Hier fand ich aber, dass sich "if len(columns) == 1:" doppelt, was ich ebenfalls vermeiden wollte.
Re: prüfen ob Variable existiert
Verfasst: Freitag 25. November 2022, 23:35
von _Mala_Fide_
Ich wollte halt so testen, ob die Variablen "left_columns" und "right_columns" schon erstellt wurden.
Oder ist es besser am Anfang der Methode beide Variablen mit None zu deklarieren und dann zu prüfen, ob ihr Wert nicht mehr None ist?
Re: prüfen ob Variable existiert
Verfasst: Samstag 26. November 2022, 00:03
von _Mala_Fide_
Habe jetzt zwei Möglichkeiten erstellt:
Einmal eine mit der Zuweisung von None an beide Variablen:
Code: Alles auswählen
@staticmethod
def outside_coords(side, coords):
"""
gibt die Koordinaten der Aussenseiten der Figur zurueck
"""
left_columns = right_columns = None
columns = sorted({column for row, column in coords})
if len(columns) == 1:
left_columns = right_columns = columns
if side == "left":
if not left_columns:
left_columns = columns[:len(columns)//2]
left_coords = [(row, column) for row, column in coords
if column in left_columns
]
return left_coords
elif side == "right":
if not right_columns:
right_columns = columns[len(columns)//2:]
right_coords = [(row, column) for row, column in coords
if column in right_columns
]
return right_coords
Und eine mit tenärem if:
Code: Alles auswählen
@staticmethod
def outside_coords(side, coords):
"""
gibt die Koordinaten der Aussenseiten der Figur zurueck
"""
columns = sorted({column for row, column in coords})
if side == "left":
left_columns = (columns if len(columns) == 1 else
columns[:len(columns)//2]
)
left_coords = [(row, column) for row, column in coords
if column in left_columns
]
return left_coords
elif side == "right":
right_columns = (columns if len(columns) == 1 else
columns[len(columns)//2:]
)
right_coords = [(row, column) for row, column in coords
if column in right_columns
]
return right_coords
Hier doppelt sich aber auch wieder die Zeile "columns if len(columns) == 1 else", oder ist das keine wirkliche Codedopplung?
Finde auf jeden Fall, dass sich die zweite Version recht gut lesen lässt...
Re: prüfen ob Variable existiert
Verfasst: Samstag 26. November 2022, 00:13
von _Mala_Fide_
Glaube ich baue die Methode morgen Früh nochmal komplett um, die List-Comprehensions in "left" und "right" sehen ja auch nahezu identisch aus.
Re: prüfen ob Variable existiert
Verfasst: Samstag 26. November 2022, 12:08
von _Mala_Fide_
Habe die Methode jetzt umgeschrieben und damit hat sich auch meine Frage erledigt, dennoch danke für deine Antwort.
Code: Alles auswählen
@staticmethod
def outside_coords(side, coords):
"""
gibt die Koordinaten der linken oder rechten
Aussenseite der Figur zurueck
"""
columns = sorted({column for row, column in coords})
if len(columns) > 1:
columns = (columns[:len(columns)//2]
if side == "left" else
columns[len(columns)//2:]
)
side_coords = [(row, column) for row, column in coords
if column in columns
]
return side_coords
Re: prüfen ob Variable existiert
Verfasst: Samstag 26. November 2022, 12:57
von sparrow
Und warum ist das eine statische Methode und keine Funktion?
Re: prüfen ob Variable existiert
Verfasst: Samstag 26. November 2022, 17:30
von _Mala_Fide_
Weil die mit zur Klasse Human gehört und nur von dieser benötigt wird, bzw ist sie Teil eines Zuges eines Menschen. Ist ein Tetrisspiel mit Curses realisiert.
Den Computergegner habe ich noch nicht soweit, er wird diese Methode aber dennoch nicht brauchen.
Re: prüfen ob Variable existiert
Verfasst: Samstag 26. November 2022, 20:02
von Sirius3
Die Funktion ist halt so allgemein, dass sie wirklich nichts mit einem menschlichen Spieler zu tun hat. In Python tendiert man eher dazu einfache Funktionen statt statischer Methoden zu schreiben.
Re: prüfen ob Variable existiert
Verfasst: Samstag 26. November 2022, 21:00
von _Mala_Fide_
Kann ich denn Funktionen auch in Klassen schreiben und diese dann innerhalb der Klasse verwenden?
Dachte immer, das statische Methoden sozusagen Funktionen sind, die an Klassen gebunden sind.
Re: prüfen ob Variable existiert
Verfasst: Samstag 26. November 2022, 21:03
von _Mala_Fide_
Habe es gerade getestet indem ich @staticmethod entfernt habe und es funktioniert trotzdem alles wie vorher.
Ich glaube, dann muss ich mich nochmal etwas über statische Methoden belesen...