<div dir="ltr"><div>dobra sada odpovedi je k videni na <a href="https://stackoverflow.com/questions/2371436/evaluating-a-mathematical-expression-in-a-string">https://stackoverflow.com/questions/2371436/evaluating-a-mathematical-expression-in-a-string</a></div><div><br></div><div>me se tam nejvic libi reseni s AST<br></div><br></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Aug 22, 2018 at 11:16 AM starenka . <<a href="mailto:starenka0@gmail.com">starenka0@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">Zalezi na slozitosti vyrazu, ale obcas staci dobrej regular a namapovat operatory na operator.* <div dir="auto"><br></div><div dir="auto">Tady sem to ukazoval na LT na pyvu <a href="https://github.com/aleszoulek/pyvo-stdlib-gems-notebooks/blob/master/04_starenka_heges.ipynb" target="_blank">https://github.com/aleszoulek/pyvo-stdlib-gems-notebooks/blob/master/04_starenka_heges.ipynb</a><br><br><div data-smartmail="gmail_signature" dir="auto">-----<br>'aknerats'[::-1]</div></div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Aug 22, 2018, 11:12 Petr Viktorin <<a href="mailto:encukou@gmail.com" target="_blank">encukou@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 08/22/18 09:30, Petr Blahos wrote:<br>
> Přátelé,<br>
> <br>
> doporučíte mi někdo knihovnu pro vyhodnocení jednoduchých matemetických<br>
> výrazů se symboly? Představuju si to asi takto: Budu mít text typu:<br>
> expr = """R=1000*(VAR1+VAR2/2)-VAR3"""<br>
> <br>
> a pak udělám:<br>
> result = knihovna.funkce(expr, {"VAR1": 54, "VAR2": 8", "VAR3": 982})<br>
> <br>
> Případně ještě knihovna.zkontroluj_vyraz(expr).<br>
> Potřebuju tam opravdu jenom + - * / a závorky.<br>
<br>
Ahoj,<br>
<br>
tl;dr: použij pyparsing, viz:<br>
<a href="https://github.com/pyparsing/pyparsing/blob/master/examples/fourFn.py" rel="noreferrer noreferrer" target="_blank">https://github.com/pyparsing/pyparsing/blob/master/examples/fourFn.py</a><br>
<br>
<br>
Delší odpověď:<br>
Vidím tři hlavní možnosti.<br>
<br>
1. Pokud věříš uživatelům (např. píšeš to pro sebe), dej jim prostě k <br>
dispozici celý Python. V budoucnu ti poděkují.<br>
Nevýhoda je že jde napsat výraz který ti např. zformátuje disk...<br>
Můžeš použít eval(), která vyhodnotí jeden výraz, nebo možná lépe exec() <br>
na sadu příkazů.<br>
<br>
 >>> namespace = {"VAR1": 54, "VAR2": 8, "VAR3": 982}<br>
 >>> expr = """R=1000*(VAR1+VAR2/2)-VAR3"""<br>
 >>> exec(expr, namespace)<br>
 >>> namespace["R"]<br>
57018.0<br>
<br>
<br>
2: Často uvidíš lidi používat či doporučovat compile() nebo modul `ast`.<br>
Doporučuju se jim vyvarovat: jsou to implementační detaily vázané na <br>
konkrétní verzi CPythonu. Až vyjde nový Python, takový kód může rozbít, <br>
a za dva roky budeš těžko mít náladu a čas to opravit (nemluvě o <br>
udržování a testování kompatibility s dnešní verzí).<br>
Tyhle věci jsou dobré na studium toho, jak Python uvnitř funguje, ne na <br>
implementaci kalkulačky.<br>
<br>
<br>
3. Napiš parser. Doporučuju vybrat nějakou udržovanou knihovnu, spíš než <br>
vzít z internetu něčí úkol do hodiny algoritmů :)<br>
Pyparsing není ideální (co je?), ale funguje a kalkulačku má jako ukázku <br>
použití.<br>
_______________________________________________<br>
Python mailing list<br>
<a href="mailto:python@py.cz" rel="noreferrer" target="_blank">python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" rel="noreferrer noreferrer" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz" rel="noreferrer noreferrer" target="_blank">http://www.py.cz</a><br>
</blockquote></div>
_______________________________________________<br>
Python mailing list<br>
<a href="mailto:python@py.cz" target="_blank">python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" rel="noreferrer" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz" rel="noreferrer" target="_blank">http://www.py.cz</a><br>
</blockquote></div>