eine frage:
kann ich ein Python Statement, das in einem String gespeichert ist zur Ausführung bringen?
Code: Alles auswählen
pythonStatement='print "Hallo ich bin ein Statement"'
Danke schon mal
D
Code: Alles auswählen
pythonStatement='print "Hallo ich bin ein Statement"'
Code: Alles auswählen
eval('print "hallo"')
>>
eval('print "hallo"')
File "<string>", line 1
print "hallo"
^
SyntaxError: invalid syntax
Wie gesagt, ein SyntaxError ist nicht das Problem. Diesen kannst du ohne Probleme abfangen:da.dom hat geschrieben:eval('sys.stdout.write("hallo")')
funktioniert danke. Die Frage bleibt offen: warum keine gute Idee, wenn es nicht an der Syntax liegt? Hab im dem Thread was von Sicherheit gelesen??!
Code: Alles auswählen
try:
eval(raw_input())
except SyntaxError:
print "SyntaxError!"
Nicht nur das, es ist unsicher und der Code der ``eval`` nutzt wird sehr schnell unübersichtlich, weil man damit dynamisch Code konstruieren und ausführen kann - das will ich nicht debuggen müsen. Zudem noch die meisten ``eval`` dazu benutzen numerierte Variablen anzulegen, was man sich durch Listen und Dictionaries sparen kann.da.dom hat geschrieben:Hab im dem Thread was von Sicherheit gelesen??!
Code: Alles auswählen
eval('os.remove("wichtig.txt")')
Code: Alles auswählen
eval('wichtiges_objekt.wichtige_funktion()')
Argh. eval() ist hier einfach nicht das richtige Werkzeug. Die Fehler, die daraus resultieren, abzufangen, bringt doch überhaupt nichts.Karl hat geschrieben:Wie gesagt, ein SyntaxError ist nicht das Problem. Diesen kannst du ohne Probleme abfangenda.dom hat geschrieben:eval('sys.stdout.write("hallo")')
funktioniert danke. Die Frage bleibt offen: warum keine gute Idee, wenn es nicht an der Syntax liegt? Hab im dem Thread was von Sicherheit gelesen??!
Hab ich das etwa behauptet? Ich wollte damit nur deutlich machen, dass es nicht darum geht, dass eval() Syntaxerror erzeugen kann, sondern die anderen Dinge, die hier erwähnt wurden. Dass eval() nicht das richtige Werkzeug ist, ist mir klar, darum hab ich auch auf die Alternative in diesem Thread verwiesen.birkenfeld hat geschrieben:Argh. eval() ist hier einfach nicht das richtige Werkzeug. Die Fehler, die daraus resultieren, abzufangen, bringt doch überhaupt nichts.Karl hat geschrieben:Wie gesagt, ein SyntaxError ist nicht das Problem. Diesen kannst du ohne Probleme abfangenda.dom hat geschrieben:eval('sys.stdout.write("hallo")')
funktioniert danke. Die Frage bleibt offen: warum keine gute Idee, wenn es nicht an der Syntax liegt? Hab im dem Thread was von Sicherheit gelesen??!
Code: Alles auswählen
"""Strings
- Folge von Zeichen = ein sequenzieller Datentyp
"""
print "Hallo" " Du" #aufeinander Folgende Strings werden zusammengezogen
Print *ist* ein Statement, aber keine Expression. Das gilt auch für def, class, import, from, with etc.da.dom hat geschrieben:Warum ist "print" kein 'echtes'(?) Statement was ich mit eval ausführen kann?
uff und der Unterschied liegt wo?mitsuhiko hat geschrieben:Print *ist* ein Statement, aber keine Expression. Das gilt auch für def, class, import, from, with etc.da.dom hat geschrieben:Warum ist "print" kein 'echtes'(?) Statement was ich mit eval ausführen kann?
Praktisch gesagt, alles was auf der rechten seine einer Zuweisung stehen kann, ist eine expression.da.dom hat geschrieben:uff und der Unterschied liegt wo?
Expressions geben was zurück. Und wenn es nur None ist. 1 + 1 gibt zb 2 zurück. int("42") gibt einen integer zurück, dict.update() verändert ein dict und gibt zumindest None zurück.da.dom hat geschrieben:uff und der Unterschied liegt wo?
Dass die Statements Keywords sind und du keine Objekte an ``print`` etc. binden kannst. Noch dazu haben Statements keinen Rückgabewert. Also Programmieranfänger ist der Unterschied zwischen Statement und Expression nicht besonders relevant, auch später ändert es sich nicht sonderlich.da.dom hat geschrieben:uff und der Unterschied liegt wo?
Code: Alles auswählen
def foo():
"Docstring"
Code: Alles auswählen
map={1337:"leet",abc:123,123:XXX}
#der Code der als String ausgeführt werden soll:
print len(map)