Alternative mathematische Evaluatoren in Python

Was ich suche

Ich suche einen mathematischen Evaluator in Python, der Variablen und die Auswertung von Ausdrücken basierend auf Variablenzuweisungen unterstützt.

Was ich gefunden habe

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 + 5in dem Fall auswerten, in dem x3 und y4 ist.

Aber es wird nicht gepflegt

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 READMEAkte. 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 floatFehler, 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.

Dann frage ich:

Kennen Sie eine gut gepflegte Bibliothek, die eine Alternative zu python-expression-eval?

Vielleicht möchten Sie ein anspruchsvolleres Beispiel hinzufügen. Für Ihre brauchen Sie überhaupt keine Bibliothek: eval('x * x + 2*y + 5', {"x":3,"y":4}macht den Job.
Ich werde die Frage bald mit einem anspruchsvolleren Beispiel bearbeiten, das ich bereits im Sinn habe (und ich werde diesen Kommentar von mir danach löschen).

Antworten (1)

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.