Ich habe verschiedenste mathematische formeln als String vorliegen:
Code: Alles auswählen
formel='a=b+c*d'
b=4.0
c=2.0
d=2.5
#Wie kann ich a berrechnen und einer Variable zuordnen?
Lg
Johannes
Code: Alles auswählen
formel='a=b+c*d'
b=4.0
c=2.0
d=2.5
#Wie kann ich a berrechnen und einer Variable zuordnen?
Code: Alles auswählen
b=4.0
c=2.0
d=2.5
a=b+c*d
print a
Das bedeutet also, dass es sein kann, besonders wenn die mathematischen Formeln, dass du einen Parser schreiben musst, der die Formeln verarbeitet. Sind die ganzen Formeln denn gültige Python-Syntax? Dann wirds nämlich wesentlich einfacher und du kannst dir den Parser sparen! Wäre nicht schlecht, wenn du ein paar dieser Formeln postet, damit wir sehen was du berechnen willst.modelnine hat geschrieben:Wenn Du wirklich willst dass er 3x erkennt, dann kannst Du nicht einfach eine Python-Funktion draus machen, dann mußt Du einen eigenen kleinen Parser für den String schreiben der selbst dynamisch die Funktion draus macht.
Wie wärs damit:keboo hat geschrieben:Geht es nicht irgendwie, dass ich den String in einen Befehl umwandle?
Quasi so, als ob ich den Inhalt des Strings in die Kommandozeile schreiben würde?
Code: Alles auswählen
In [10]: eval('b+c*d', globals(), {'b' : 4, 'c' : 2, 'd' : 3})
Out[10]: 10
Code: Alles auswählen
>>> formel='a=b+c*d'
>>> b=4.0
>>> c=2.0
>>> d=2.5
>>> exec formel
>>> print a
9.0
Code: Alles auswählen
>>> formel = "a = b + c * d"
>>> namespace = {'b': 4.0, 'c': 2.0, 'd': 2.5, '__builtins__': {}}
>>> exec formel in namespace
>>> namespace['a']
9.0
Zumindestr das geht mit meine version nicht, was aber jetzt nicht heißt, dass die sicherer ist.Joghurt hat geschrieben:Bedenke aber, dass du Eingaben nur aus "vertrauenswürdigen Quellen" annimmst. Man kann eval auch sowas wie "import os; os.remove(r"C:\windows\system32\kernel.dll")" übergeben und das wird dann auch fleißig ausgeführt.
Code: Alles auswählen
eval("__import__(\"os\").remove(r\"c:\\windows\\system32\\kernel.dll\")")
Das ist ja auch nicht die Lösung, die ich vorgeschlagen habemodelnine hat geschrieben:blackbird, es geht aber:und das ist böse genug...Code: Alles auswählen
eval("__import__("os").remove(r"c:\\windows\\system32\\kernel.dll")")