[python] Vyhodnocení jednoduchých výrazů

Honza Král honza.kral na gmail.com
Středa Srpen 22 11:58:41 CEST 2018


dobra sada odpovedi je k videni na
https://stackoverflow.com/questions/2371436/evaluating-a-mathematical-expression-in-a-string

me se tam nejvic libi reseni s AST


On Wed, Aug 22, 2018 at 11:16 AM starenka . <starenka0 na gmail.com> wrote:

> Zalezi na slozitosti vyrazu, ale obcas staci dobrej regular a namapovat
> operatory na operator.*
>
> Tady sem to ukazoval na LT na pyvu
> https://github.com/aleszoulek/pyvo-stdlib-gems-notebooks/blob/master/04_starenka_heges.ipynb
>
> -----
> 'aknerats'[::-1]
>
> On Wed, Aug 22, 2018, 11:12 Petr Viktorin <encukou na gmail.com> wrote:
>
>> 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 na py.cz
>> http://www.py.cz/mailman/listinfo/python
>>
>> Visit: http://www.py.cz
>>
> _______________________________________________
> Python mailing list
> python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
> Visit: http://www.py.cz
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20180822/2221e554/attachment.html>


Další informace o konferenci Python