Variable in aufruf mit einbauen.

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
DanielTheNew
User
Beiträge: 13
Registriert: Donnerstag 26. Oktober 2006, 14:37

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
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

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.
http://www.cs.unm.edu/~dlchao/flake/doom/
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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
DanielTheNew
User
Beiträge: 13
Registriert: Donnerstag 26. Oktober 2006, 14:37

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.
DanielTheNew
User
Beiträge: 13
Registriert: Donnerstag 26. Oktober 2006, 14:37

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.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Code: Alles auswählen

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

Bleibt die Frage warum `self.start` kein Dictionary ist.
DanielTheNew
User
Beiträge: 13
Registriert: Donnerstag 26. Oktober 2006, 14:37

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?
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.
DanielTheNew
User
Beiträge: 13
Registriert: Donnerstag 26. Oktober 2006, 14:37

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.

:(
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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