Seite 1 von 1

Variable Variabelbenennung

Verfasst: Montag 14. Juli 2008, 10:14
von Chill-man
Ich weiß, der Titel klingt etwas komisch, jedoch weiß ich nicht wie ich es besser ausdrücken soll.

Ich bin gerade dabei eine Art Monopolyspiel zu programmieren und hänge an der Definition meiner Variabeln fest.

Mein Spielbrett besitzt 40 Felder die Field_1 - Field_40 heißen.

Das Script ist an den Spieler angehängt und so muss die Variable Field_XY variabel sein.

Ich hatte an etwas in die Richtung gedacht:

Code: Alles auswählen

if Field_%s.normal == TRUE % go_to:
allerdings kommt dann die Fehlermeldung, dass "Field_" nicht definiert wurde.

Kann mir irgendwer weiterhelfen?

Vielen Dank schonmal für eure Hilfe,

Chill-man

Verfasst: Montag 14. Juli 2008, 10:27
von Zap
Am besten vorab ein Tutorial durcharbeiten.
Dann würdest du wissen das man für sowas Listen verwendet. ;)

Re: Variable Variabelbenennung

Verfasst: Montag 14. Juli 2008, 10:30
von lunar
Chill-man hat geschrieben:Mein Spielbrett besitzt 40 Felder die Field_1 - Field_40 heißen.
Das ist nicht dein Ernst, oder? Dafür nutzt man Datenstrukturen wie Listen oder Mappings.

String-Formatting heißt deswegen "String-Formatting", weil es nur mit Strings funktioniert, nicht aber mit Bezeichnern. Eine Möglichkeit, sowas zu machen, ist, den entsprechenden Namespace als Dict anzusprechen (siehe die Dokumentation zu "locals()" und "globals()". Der Code, der daraus resultiert, ist mit Sicherheit schlecht les- und wartbar und eher unpythonisch.

Eine größere Anzahl gleichartiger Objekte legt man korrekterweise in Dicts oder Listen ab. Ich denke, du solltest dir die entsprechenden Abschnitte im Tutorial mal durchlesen.

Verfasst: Montag 14. Juli 2008, 10:31
von audax
Falsche Datenstruktur.

Wenn du aufgereihte Objekte hast, dann benutz doch einfach ne Liste!

Falls du dir wirklich in den Fuß schießen willst:

Code: Alles auswählen

import sys
getattr(sys.modules[__name__], "Field_%s" % go_to).normal
Das ist aber wirklich eine blöde Idee.

Verfasst: Montag 14. Juli 2008, 10:47
von lunar
audax hat geschrieben:Falls du dir wirklich in den Fuß schießen willst:

Code: Alles auswählen

import sys
getattr(sys.modules[__name__], "Field_%s" % go_to).normal
Also das ist nun wirklich eine komische Art, sich in den Fuß zu schießen. Was spricht gegen folgendes?

Code: Alles auswählen

globals()['Field_%s' % go_to] = 'foobar'
@OP
Was natürlich nicht heißen soll, dass die diese Möglichkeit einsetzen solltest. Das ist ganz schlechter Code!

Verfasst: Montag 14. Juli 2008, 10:57
von Chill-man
Hallo, danke für die Zahlreichen Antworten.

Inzwischen bin ich auf eine funktionierende Lösung gestoßen:

Code: Alles auswählen

Feld = scene.getObjectList()["OBField_%s" % go_to]

If Feld.normal == True:
Wie siehts denn mit dieser Möglichkeit aus?

Ist sie zu empfehlen, oder eher davon abzuraten?

Verfasst: Montag 14. Juli 2008, 11:06
von lunar
Ich weiß nicht, in wie fern du Kontrolle über die benutzen Klassen hast, aber dieser Code sieht ebenfalls "komisch" aus. Wenn man 40 Objekte in klar definierter aufsteigender Reihenfolge speichern möchte, dann nimmt man eine Liste. Namen wie "Feld_1", "Feld_2" usw. sind nur armselige Umschreibungen für Listen. Imho ist da dringed Refactoring an der Spielfeldklasse nötig!

Eine vernünftige Datenstruktur würde die Felder so ansprechen:

Code: Alles auswählen

field = scene[to_go]
Bei Monopoly könnte ich mir auch gut eine Struktur vorstellen, die die Felder über ihren "Namen" anspricht und "getObjectList" eher "get_object_list" heißen.

Btw, bei Bezeichnern sollte man sich an PEP 8 halten, "Feld" sollte klein geschrieben werden.

Verfasst: Montag 14. Juli 2008, 11:46
von audax
lunar hat geschrieben:
audax hat geschrieben:Falls du dir wirklich in den Fuß schießen willst:

Code: Alles auswählen

import sys
getattr(sys.modules[__name__], "Field_%s" % go_to).normal
Also das ist nun wirklich eine komische Art, sich in den Fuß zu schießen. Was spricht gegen folgendes?

Code: Alles auswählen

globals()['Field_%s' % go_to] = 'foobar'
Dagegen spricht, dass es nicht ganz so abschreckend ist und ich erst einen Becher Kaffee hatte :D

Verfasst: Montag 14. Juli 2008, 13:17
von mitsuhiko
Schöner in den Fuß schießen mit sys._getframe: http://paste.pocoo.org/show/79405/

Verfasst: Montag 14. Juli 2008, 14:27
von lunar
Wird das jetzt ein neuer Wettbewerb: Wer sich am schönsten selbst in den Fuss schießen kann?

Verfasst: Montag 14. Juli 2008, 14:35
von audax
Wir brauchen C-Extensions dafür! \o/

Verfasst: Montag 14. Juli 2008, 16:27
von Leonidas
lunar hat geschrieben:Wird das jetzt ein neuer Wettbewerb: Wer sich am schönsten selbst in den Fuss schießen kann?
Nö, wer die meisten Python-Interpreter interna dazu verwendet. :twisted:

Verfasst: Montag 14. Juli 2008, 17:41
von mitsuhiko
Leonidas hat geschrieben:
lunar hat geschrieben:Wird das jetzt ein neuer Wettbewerb: Wer sich am schönsten selbst in den Fuss schießen kann?
Nö, wer die meisten Python-Interpreter interna dazu verwendet. :twisted:
Klingt ja fast nach ctypes. Damit könnte man auch ein schreibbares f_locals hinbekommen :)