Seite 1 von 1
Einfache Rechnung: Ergebnis muss Fliesskommazahl sein
Verfasst: Mittwoch 14. November 2007, 19:10
von pot
Hallo
Ich arbeite gerade an einem Projekt (welches ich auch bald vorstellen werde

) das mit Formeln hantiert.
Folgender String kommt von einer Fremdeingabe:
Variable m und v sind definiert:
Nun wird der obere String (Formel) mittels "exec" ausgeführt. Folglich wird in der Variable "W" das Resultat gespeichert. Dummerweise ist dies 0 anstatt 2. Ich weiss auch wieso: Nur wenn die Faktoren Fliesskommazahlen sind, wird das Ergebnis eine Fliesskommazahl. Nur blöderweise kann ich die Faktoren nicht ändern, die sind so fest.
Wie kann ich python trotzdem zwingen, das Resultat 2.0 zu speichern?
Grüsse
Pot
Re: Einfache Rechnung: Ergebnis muss Fliesskommazahl sein
Verfasst: Mittwoch 14. November 2007, 19:13
von BlackVivi
Verfasst: Mittwoch 14. November 2007, 19:17
von pot
Jup, das ist mir schon klar. Dummerweise bekommt das Skript nur "W = 1/2 * m * v ** 2" und nicht "W = 1.0/2.0 * m * v ** 2.0"
Grüsse
Pot
Verfasst: Mittwoch 14. November 2007, 19:18
von nkoehring
Darfst du den String manipulieren? Wie laeuft das ueberhaupt ab... wie "bekommt" dein Script diesen String?
Verfasst: Mittwoch 14. November 2007, 19:19
von pot
nkoehring hat geschrieben:Darfst du den String manipulieren? Wie laeuft das ueberhaupt ab... wie "bekommt" dein Script diesen String?
Ja, darf ich, sofern er noch korrekt bleibt. Dieser String wird früher eingelesen von einer XML Datei. Diese Datei beinhaltet die Formeln sowie alle Auflösungen für die anderen Variablen.
Grüsse
Pot
Verfasst: Mittwoch 14. November 2007, 19:44
von Zap
Hilft dir das vielleicht ?
Code: Alles auswählen
In [6]: from __future__ import division
In [7]: 1/2
Out[7]: 0.5
Verfasst: Mittwoch 14. November 2007, 19:48
von BlackJack
Das sollte helfen. Ausserdem ist es keine so gute Idee einfach irgendwelchen fremden Code im Namensraum des Moduls oder der Funktion auszuführen. ``exec()`` nimmt auch ein oder zwei Dictionaries entgegen, die als globaler und/oder lokaler Namensraum benutzt werden:
Code: Alles auswählen
from __future__ import division
def main():
namespace = dict(m=1.0, v=2.0)
formula = 'W = 1/2 * m * v ** 2'
exec(formula, namespace)
print namespace['W']
if __name__ == '__main__':
main()
Verfasst: Mittwoch 14. November 2007, 20:08
von pot
Danke Zap.
BlackJack hat geschrieben:Ausserdem ist es keine so gute Idee einfach irgendwelchen fremden Code im Namensraum des Moduls oder der Funktion auszuführen. ``exec()`` nimmt auch ein oder zwei Dictionaries entgegen, die als globaler und/oder lokaler Namensraum benutzt werden:
Danke BlackJack für die Ergänzung mit dem Namespace, das kann ich sehr gut gebrauchen und muss auch keine Angst mehr haben, dass es eventuell schon vorhandene Variablen (z.B. Zählvariablen) überschrieben werden.
So gefährlich jedoch ist es nicht, da das Script eigentlich die Variable (W) und die Formel (1 / 2 * v ** 2) von zwei verschiedenen Strings einliest, ein Gleichheitszeichen dazwischen fabriziert und erst dann ausführt.
Freundliche Grüsse
Pot
Verfasst: Mittwoch 14. November 2007, 20:20
von BlackJack
Berühmte letzte Worte.
Die zweite Zeichenkette könnte ja auch so aussehen: '1 / 2 * v ** 2; wichtiger_name = 42'
Verfasst: Mittwoch 14. November 2007, 20:27
von pot
BlackJack hat geschrieben:Die zweite Zeichenkette könnte ja auch so aussehen: '1 / 2 * v ** 2; wichtiger_name = 42'

oder '1 / 2 * v ** 2; os.system("halt")' -.-
Okay ich weiss, ist unsicher
Danke für den Hinweis.
Grüsse
Pot