On 08/22/18 09:30, Petr Blahos wrote:
Přátelé,

doporučíte mi někdo knihovnu pro vyhodnocení jednoduchých matemetických
výrazů se symboly? Představuju si to asi takto: Budu mít text typu:
expr = """R=1000*(VAR1+VAR2/2)-VAR3"""

a pak udělám:
result = knihovna.funkce(expr, {"VAR1": 54, "VAR2": 8", "VAR3": 982})

Případně ještě knihovna.zkontroluj_vyraz(expr).
Potřebuju tam opravdu jenom + - * / a závorky.

Ahoj,

tl;dr: použij pyparsing, viz:
https://github.com/pyparsing/pyparsing/blob/master/examples/fourFn.py


Delší odpověď:
Vidím tři hlavní možnosti.

1. Pokud věříš uživatelům (např. píšeš to pro sebe), dej jim prostě k dispozici celý Python. V budoucnu ti poděkují.
Nevýhoda je že jde napsat výraz který ti např. zformátuje disk...
Můžeš použít eval(), která vyhodnotí jeden výraz, nebo možná lépe exec() na sadu příkazů.

>>> namespace = {"VAR1": 54, "VAR2": 8, "VAR3": 982}
>>> expr = """R=1000*(VAR1+VAR2/2)-VAR3"""
>>> exec(expr, namespace)
>>> namespace["R"]
57018.0


2: Často uvidíš lidi používat či doporučovat compile() nebo modul `ast`.
Doporučuju se jim vyvarovat: jsou to implementační detaily vázané na konkrétní verzi CPythonu. Až vyjde nový Python, takový kód může rozbít, a za dva roky budeš těžko mít náladu a čas to opravit (nemluvě o udržování a testování kompatibility s dnešní verzí). Tyhle věci jsou dobré na studium toho, jak Python uvnitř funguje, ne na implementaci kalkulačky.


3. Napiš parser. Doporučuju vybrat nějakou udržovanou knihovnu, spíš než vzít z internetu něčí úkol do hodiny algoritmů :) Pyparsing není ideální (co je?), ale funguje a kalkulačku má jako ukázku použití.
_______________________________________________
Python mailing list
python@py.cz
http://www.py.cz/mailman/listinfo/python

Visit: http://www.py.cz

Odpovedet emailem