Variable Variabelbenennung

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
Chill-man
User
Beiträge: 24
Registriert: Dienstag 8. Januar 2008, 10:46

Montag 14. Juli 2008, 10:14

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
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Montag 14. Juli 2008, 10:27

Am besten vorab ein Tutorial durcharbeiten.
Dann würdest du wissen das man für sowas Listen verwendet. ;)
lunar

Montag 14. Juli 2008, 10:30

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.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Montag 14. Juli 2008, 10:31

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.
lunar

Montag 14. Juli 2008, 10:47

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!
Chill-man
User
Beiträge: 24
Registriert: Dienstag 8. Januar 2008, 10:46

Montag 14. Juli 2008, 10:57

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?
lunar

Montag 14. Juli 2008, 11:06

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.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Montag 14. Juli 2008, 11:46

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
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Montag 14. Juli 2008, 13:17

Schöner in den Fuß schießen mit sys._getframe: http://paste.pocoo.org/show/79405/
TUFKAB – the user formerly known as blackbird
lunar

Montag 14. Juli 2008, 14:27

Wird das jetzt ein neuer Wettbewerb: Wer sich am schönsten selbst in den Fuss schießen kann?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Montag 14. Juli 2008, 14:35

Wir brauchen C-Extensions dafür! \o/
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 14. Juli 2008, 16:27

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:
My god, it's full of CARs! | Leonidasvoice vs Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Montag 14. Juli 2008, 17:41

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 :)
TUFKAB – the user formerly known as blackbird
Antworten