Ich suche einen mathematischen Evaluator in Python, der Variablen und die Auswertung von Ausdrücken basierend auf Variablenzuweisungen unterstützt.
Ich habe python-expression-eval (auch auf PyPi verfügbar ) gefunden, das genau das zu sein schien, wonach ich gesucht hatte. Tatsächlich bringt es Sie dazu, die folgenden Dinge zu tun.
>>> parser = Parser()
>>> ev = parser.parse('x * x + 2*y + 5')
>>> ev.evaluate({'x': 3, 'y': 4})
22.0
Wobei dieser Aufruf der evaluate()
Methode bedeutet "den Ausdruck x * x + 2*y + 5
in dem Fall auswerten, in dem x
3 und y
4 ist.
Alles ist perfekt, außer dass, wie Sie auf der Github-Seite sehen können, das Projekt nicht viel gepflegt zu werden scheint. Es gibt nur zwei "aktuelle" Änderungen, eine vor fünf Monaten und eine vor fünf Monaten, aber sie sind beide sehr klein und eine der beiden ist nur in der README
Akte. Die von den Benutzern geöffneten Ausgaben werden seit November 2017 nicht geschlossen und es gibt keine Antworten von den Autoren, nicht einmal für einige Ausgaben, die 2016 geöffnet wurden.
Die von den Benutzern gemeldeten Fehler werden nicht behoben, und ich habe einen weiteren wichtigen Fehler gefunden, der mich daran hindert, meinen eigenen Code zu debuggen. Insbesondere bekomme ich einen cannot concatenate str and float
Fehler, wenn ich die toString()
Methode aufrufe, wenn der mathematische Ausdruck negative'-2 + x'
Zahlen enthält (z. B. ). Dies hindert mich daran, toString()
zu überprüfen, ob ein Ausdruck korrekt geparst wurde.
Kennen Sie eine gut gepflegte Bibliothek, die eine Alternative zu python-expression-eval
?
SymPy ist in der Lage, das zu tun, wonach Sie fragen (und noch viel mehr):
from sympy import sympify
from sympy.abc import x,y
expr = sympify('x * x + 2*y + 5')
expr.subs({ x:3, y:4 })
Beachten Sie, dass dies nur eine von mehreren Möglichkeiten ist, das zu tun, wonach Sie in SymPy fragen.
Es befindet sich nicht nur in aktiver Entwicklung , sondern ist das Rückgrat anderer Python-Module. Daher besteht ein großes Interesse daran, es gewartet, abwärtskompatibel und robust zu halten.
Wrzlprmft
eval('x * x + 2*y + 5', {"x":3,"y":4}
macht den Job.Kubuntuer82