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.
Im einfachsten Falle einfach eval nehmen. Ist aber nicht sehr performant.
Andernfalls den String parsen, die Zeichen nach int oder float konvertieren und die math. Operation ausführen.
Im gezeigten Bsp. könnte man den String mit split('/') zerlegen.
Wie sähe das mit eval() aus? Außerdem is das doch ein wenig kritisch bzgl. Sicherheit oder?
Das mit dem Parsen ist IMHO keine so gute Idee, da da jeder beliebige mathematische (keine spezialsachen oder so, aber +-*/** sind durchaus möglich) Ausdruck oder auch nur eine Zahl stehen könnte.
Schau dir mal das ast-Modul an, damit sollte das recht schnell gehen. Ansonsten lassen sich mit der Suche auch noch einige kleine Parser für dieses Problem finden.
Bin mal kurz drüber geflogen und habe ast.literal_eval() ausprobiert, leider funktioniert das bei 1/8 oder anderen mathematischen ausdrücken nicht, float(eval()) hingegen schon. Was muss ich denn bei float(eval()) beachten, damit das ganze wieder sicher wird?
Wie wärs, wenn du einfach mal erzählen würdest, was du eigentlich genau machen willst. Ich habe den Eindruck dass du nicht einfach nur "1/8" in einen float umwandeln, sondern irgendwelche Mathematischen Ausdrücke auswerten willst.
Ich weiss nicht genau was Du exakt mit Sicherheit meinst, aber eval erwatet natürlich einen gültigen Python Ausdruck. Andernfalls kassierst Du eine Exception. Aber das ist im Grunde wie bei jedem anderen Python Code auch.
Es geht um ein Programm welches mit Wahrscheinlichkeiten arbeitet.
Die Wahrscheinlichkeiten werden in der Notation
P(<Ereignisname>) = <Wahrscheinlichkeit>
eingegeben. Den String teile ich intern in verschiedene Bereiche und den mathematischen Ausdruck (= <Wahrscheinlichkeit>) will ich auswerten und als float zwischenspeichern um später damit rechnen zu können.
@hendriks: Naja ich hab mal gehört eval sei unsicher, da es alles ausführt was man rein schiebt, also auch importe etc.
heiliga horsd hat geschrieben:Bin mal kurz drüber geflogen und habe ast.literal_eval() ausprobiert, leider funktioniert das bei 1/8 oder anderen mathematischen ausdrücken nicht
Dann solltest du vielleicht nicht nur mal kurz rüberfliegen, sondern dir das Modul mal richtig anschauen
heiliga horsd hat geschrieben:float(eval()) hingegen schon. Was muss ich denn bei float(eval()) beachten, damit das ganze wieder sicher wird?
Der beste Weg ist es, eval erst gar nicht zu verwenden.
heiliga horsd hat geschrieben:Bin mal kurz drüber geflogen und habe ast.literal_eval() ausprobiert, leider funktioniert das bei 1/8 oder anderen mathematischen ausdrücken nicht
Dann solltest du vielleicht nicht nur mal kurz rüberfliegen, sondern dir das Modul mal richtig anschauen
OK, habe ich, aber bis auf das genannte ast.literal_eval() seh ich da nichts was mir konkret hilft... oder worauf willst du hinaus?
EyDu hat geschrieben:
heiliga horsd hat geschrieben:float(eval()) hingegen schon. Was muss ich denn bei float(eval()) beachten, damit das ganze wieder sicher wird?
Der beste Weg ist es, eval erst gar nicht zu verwenden.
Was bleibt mir (so wies momentan aussieht) anderes übrig?
Ich habe nun ein wenig im Forum rumgestöbert aber nichts außer eval gefunden, was mir floats aus mathematischen ausdrücken liefert (ich habe auch nach ast float gesucht aber nix brauchbares gefunden)
DaMutz, dein Ansatz ist leider auch nicht besser als direkt eval() zu benutzen. Dies ist IMMER gefährlich, da es nahezu beliebigen Code auszuführen erlaubt. Ich bin mir sicher, ich hatte hier schon mal einen auf dem ast-Modul basierenden Interpreter für mathematische Ausdrücke gepostet, doch ich finde ihn auf die Schnelle nicht. Vielleicht hilft http://python-forum.de/viewtopic.php?p=147406#p147406. So schwer ist es nicht, zu prüfen, dass nur gewünschte Operationen und keine Funktionen vorkommen und dann erst eval auf dem Ergebnis aufzurufen.