Variablen automatisch erzeugen

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
pylife
User
Beiträge: 3
Registriert: Samstag 31. Mai 2008, 18:03

Hallo,

wie kann ich aus Strings neue Variablen erzeugen?

Code: Alles auswählen

def erzeuge_var(name_als_string, inhalt_variable):
#code?

erzeuge_var('x',70)

print x==70
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Was du da vor hast ist sehr unsauberer Stil. Immern wenn du automatisch Variablen erzeugen willst, dann ist es ein Zeichen, dass an deinem Design etwas falsch ist. Mit hoher Wahrscheinlichkeit möchtest du wohl ein Dictionary oder eine Liste verwenden.
pylife
User
Beiträge: 3
Registriert: Samstag 31. Mai 2008, 18:03

In dem Fall vielleicht nicht :D Könnte gut sein, dass ich etwas einfaches übersehe.

Ich habe nämlich die Variablennamen vorgegeben und will diese beibehalten.

Momentam habe ich das gelöst indem ich mit einem Pythonskript die Liste in ein File schreibe und diese dann in den Quellcode kopiere.

Code: Alles auswählen

Alt_A = 101
Alt_B = 102

meine_liste[Alt_A]
Insgesamt geht es um folgendes: ich migriere ein Excel Sheet in eine Datenbank (in dem Fall nicht mit ODBC zu lösen). Die erste Zeile enthält die Namen der Variablen. Die Variablennamen habe ich also als Strings vorliegen. Die oben genannte Lösung funktioniert zwar, aber möglicherweise will ich später aus den Daten Klassen erzeugen oder die Datentypen konvertieren und ähnliches. Sie ist auch nicht dynamisch, d.h. ich muss bei jeder Änderung des Sheets die Variablenindizes neu anlegen.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Angenommen, ich möchte bei einem Programm in Laufzeit objekte generieren und auch vernichten. Wie soll ich das machen, ohne Variablen irgendwie zu generieren? Wobei, jetz wo ichs schreibe, fällt mir ein das das eventuell über irgendnelist.append(Klasse()) vllt ginge, und der rest dann über die index nummer als eine art ID... scheint sogar zu klappen. Naja, jetzt wo ichs schon geschrieben hab kann ichs auch posten.

@pylife: wenn du wirklich variablen aus strings erzeugen willst, könnte das mit exec oder eval gehen, da gehen allerdings viele auf die barrikaden.

Ach übringens: Hallo alle zusammen.^^
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

str1442 hat geschrieben:Angenommen, ich möchte bei einem Programm in Laufzeit objekte generieren und auch vernichten.
Tut ich immer. In jedem Programm, auch hier:

Code: Alles auswählen

print "Hello world!"
@Topic:
Nimm nen Dictionary, die sind dafür gemacht.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

audax hat geschrieben:
str1442 hat geschrieben:Angenommen, ich möchte bei einem Programm in Laufzeit objekte generieren und auch vernichten.
Tut ich immer. In jedem Programm, auch hier:

Code: Alles auswählen

print "Hello world!"
:lol: Joa schon klar, ich meinte auch eher wenn das programm selbständig ein object generieren soll. Wenn zb die variable resource den wert 1000 erreicht dann generiere neue Einheit und gib der KI die kontrolle darüber + Einheit.machiwas bis du tot bist. Im Falle eines Echtzeitstrategiespieles zb.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

str1442 hat geschrieben: :lol: Joa schon klar, ich meinte auch eher wenn das programm selbständig ein object generieren soll. Wenn zb die variable resource den wert 1000 erreicht dann generiere neue Einheit und gib der KI die kontrolle darüber + Einheit.machiwas bis du tot bist. Im Falle eines Echtzeitstrategiespieles zb.

Code: Alles auswählen

class Facility(Foo):
    [...]
    def create_soldier(self):
        soldier = Soldier()
        self.owner.gain_control(soldier)

class Solder(Bar):
    [...]
    def do_stuff(self):
        while self.alive:
            do_something()

class Ai(User):
    [...]
    def gain_control(self, unit):
        self._controlled.append(unit)
        unit.do_stuff()      
Ich seh da ehrlich gesagt nicht den Hauch eines Problems Oo
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

naja zuerst wäre soldier nur eine lokale variable, und auch an self gebunden hat man dann nur nen Krieger, der an das Object, also hier die facility, gebunden ist. Würde man soldier1, soldier2 etc haben wollen, müßte man die Variablen zuerst konstruieren.

Aber ich denk, man könnte es vllt einfach über eine klassenliste der klasse AI realisieren, die dann einfach per Ai.einheitenliste.append(Soldier(parameter)) das objekt generiert und dann einfach mit der indexnummer arbeitet, parameter müßten dann nur noch funktionen sein, die grundlegende dinge wie name generieren, welche nicht von der Ki zugewiesen werden würden (wie etwa Soldier().position = Facility().position, wenn der soldat auch beim konstruktionsort erscheinen soll)...

Ich denke, das ist auch was EyDu und du auch mit der liste/dictionary lösung meintet.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ja, das in etwa meinte ich. Nur die Soldaten an die Soldaten-Klasse zu binden ist etwas unglücklich. Du wirs doch sichher noch eine Klasse "Spiel" oder so etwas haben, dort ist es als Attribut der Instanz viel besser aufgehoben.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich bin mir sicher, das der Frage ein fundamentales Missverständnis des Programmiermodells von Python vorangeht, aber dennoch soll eine Lösung nicht verschwiegen werden:

Code: Alles auswählen

def erzeuge_var(name_als_string, inhalt_variable):
    globals()[name_als_string] = inhalt_variable
Wenn es um das Erzeugen von Code geht, würde ich ja lieber den Weg über eine Datei wählen, zumal ich das so verstanden habe, dass man das nur einmal braucht und dann weiterverarbeiten will.

Objekte erzeugen hat übrigens nichts mit Variablen zu tun. Diese Schleife erzeugt (und verwirft sofort wieder, aber das sei egal) 1000 Objekte, ohne das diese jemals in eine Variable geschrieben werden:

Code: Alles auswählen

class Foo: pass
for i in range(1000): Foo()
Stefan
BlackJack

Ist wahrscheinlich eine Frage die jeder für sich beantworten muss, aber ich finde solche "Lösungen" *sollten* verschwiegen werden.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Warum muss ein Soldat einen eigenen Variablennamen haben?

Man hat doch Listen und Dicts zum Objekte ablegen und verwalten...
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

BlackJack hat geschrieben:Ist wahrscheinlich eine Frage die jeder für sich beantworten muss, aber ich finde solche "Lösungen" *sollten* verschwiegen werden.
Mir war einfach danach zu korrumpieren... :twisted:
pylife
User
Beiträge: 3
Registriert: Samstag 31. Mai 2008, 18:03

Danke für den Code.
sma hat geschrieben:Ich bin mir sicher, das der Frage ein fundamentales Missverständnis des Programmiermodells von Python vorangeht
Interessanter als die Aussage wären die Gründe. Zur genauen Erläuterung eine Code Beispiel:

Code: Alles auswählen

headers = ['X','Y','Z']
daten = [2.4,1.3,9.9]

# jede menge legacy code der so bestehen bleiben soll
X = Y+Z
Y = Z/100

aktuelle Lösung

Code: Alles auswählen

# indizes automatisch erzeugt (statisch)
INDEX_X = 0
INDEX_Y = 1
INDEX_Z = 2

X = daten[INDEX_X]
Y = daten[INDEX_Y]
Z = daten[INDEX_Z]

#legacy code
X = Y+Z
Y = Z/100
Antworten