Seite 1 von 1

Variable in aufruf mit einbauen.

Verfasst: Freitag 3. November 2006, 17:12
von DanielTheNew
Hallo

Ich habe da ein Problemchen.
Um das leichter austesten zu können hab ich das mal in ein "sinnloses' Programmchen gebaut.

Code: Alles auswählen

#!/usr/bin/python

print 'lietentest...'
eineliste = []

ad = 'append'

eineliste.ad('eintrag')

print eineliste
Wie kann ich python dazu veranlassen ad nicht als "string" sodern als befehl zu sehen?

mfg Daniel

Verfasst: Freitag 3. November 2006, 17:29
von murph
das ist im forum schonmal angesprochen worden.
so, wie du das hast, geht das nicht.
eher kannst du ein dictionairy von allen funktionen, die du haben willst, aufbauen...

Code: Alles auswählen

{'append':eine_liste.append, 'sort':eine_liste.sort}
kannst aber nur auf die hinterlegte liste zugreifen.
sonst musst du exec nehmen, ist aber immer nicht schön,
verscuht man aus sicherheitsgründen zu vermeiden.

Verfasst: Freitag 3. November 2006, 17:39
von keppla
klar geht das.
es ist nur die Frage, ob man das so machen möchte, mit ziemlich hoher Sicherheit ist der Grund dafür nämlich ein schlechtes Anwendungsdesign. Schilder doch mal, was du eigentlich erreichen möchtest, oder anders gefragt, warum du glaubst, das zu brauchen.

Wieauchimmer, hier der code:

Code: Alles auswählen

eineliste = []
ad = 'append'

method = getattr(eineliste, ad)
method("eintrag")

print eineliste

Verfasst: Freitag 3. November 2006, 17:42
von DanielTheNew
Hallo murph

Danke für die Antwort das bringt mich meiner lösung aber nicht näher.

da das append ja nur ein beispiel ist.
In dem realen script weis ich vorher nicht was append ist.

ich versuche das noch mal deutlisch zu erklären.

Code: Alles auswählen

for i in programmliste:
  erg = self.start.i.value + '\n'
  f.write(erg)
Das i muss also ersetzt werden. aber wie?
Damit sollte es klarer werden.

Verfasst: Freitag 3. November 2006, 17:48
von DanielTheNew
Hallo keppla

Danke für den den ansatz.

Evtl. hast du ja noch eine bessere methode mein problem zu lösen.
Siehe im beispiel oben.

Danke im voraus.

Verfasst: Freitag 3. November 2006, 19:17
von rayo
Hi

Code: Alles auswählen

erg = getattr(self.start,i).value
Gruss

Verfasst: Freitag 3. November 2006, 20:38
von BlackJack
Bleibt die Frage warum `self.start` kein Dictionary ist.

Verfasst: Freitag 3. November 2006, 21:24
von DanielTheNew
BlackJack hat geschrieben:Bleibt die Frage warum `self.start` kein Dictionary ist.

Also ich (versuche) hier einen plugin zu schreiben. Deshalb kann ich leider nicht am hauptquelltext rum schreiben.

Aus diesem grund kann ich auch kein dict machen. Bzw. weis ich evtl nur nicht wie.
Aber das mit dem getattr funktioniert nun sehr gut.

Gibt es den einen bestimmten grund wieso man das getattr nicht verwende soll?

Verfasst: Freitag 3. November 2006, 22:49
von BlackJack
`getattr()` ist nicht per se schlecht, aber bei Anfängern oft ein Zeichen dafür das sie etwas 1:1 aus anderen Sprachen nachbauen wollen, z.B. PHP, oder besser ein Dictionary benutzt hätten.

Wenn Du da gar keinen Einfluss drauf hast und eine Reihe von Attributen von dem Objekt brauchst, dann ist das schon eine gute Lösung sie mit `getattr()` abzufragen.

Verfasst: Samstag 4. November 2006, 15:33
von DanielTheNew
BlackJack hat geschrieben:`getattr()` ist nicht per se schlecht, aber bei Anfängern oft ein Zeichen dafür das sie etwas 1:1 aus anderen Sprachen nachbauen wollen, z.B. PHP, oder besser ein Dictionary benutzt hätten.

Wenn Du da gar keinen Einfluss drauf hast und eine Reihe von Attributen von dem Objekt brauchst, dann ist das schon eine gute Lösung sie mit `getattr()` abzufragen.
Danke für die Antwort.

Ich muss leider dort etwas abholen und komme da anders wohl nicht rann.
Das Problem ist die dynamik die da drin ist.

Allerdings kann ich nicht leugnen das ich ein python anfänger bin und daher eher schlecht als recht meine programmchen zusammenbastle.

:(

Verfasst: Montag 6. November 2006, 16:04
von keppla
Ich muss leider dort etwas abholen und komme da anders wohl nicht rann.
Das Problem ist die dynamik die da drin ist.
Da du den quelltext ja nicht ändern darfst, ist die Lösung über getattr die beste.
Besser wäre, wenn der schreiber des Hauptprogrammes eine vernünftige Schnittstelle für die Pluginschreiber definiert hätte, also du nicht per name an die members des self.start-objektes ranmüsstest, sondern dieses objekt z.B., wie yaho sagt, ein dictionary bereitstellt, was die members enthält.
Allerdings kann ich nicht leugnen das ich ein python anfänger bin und daher eher schlecht als recht meine programmchen zusammenbastle.
Och, so schlimm kanns nicht sein. Du hast erfolgreich der Versuchung widerstanden, in deinem Beispiel über eine Range zu iterieren, und dann per index auf "programmliste" zuzugreifen ;)
Gegenüber meinen Anfängerprogrammen ist das schon Gold.