Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > cz.comp.lang.python > #3329

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

From Petr Viktorin <encukou@gmail.com>
Subject Re: [python] Vyhodnocení jednoduchých výrazů
Newsgroups cz.comp.lang.python
Message-ID <mailman.10.1534929141.32743.python@py.cz> (permalink)
References <CAE1QKmT-arcdeJ=5TANfWEZoodrLH96hi8vZ4eJ-mp5HLhx7Hw@mail.gmail.com> <75468b66-0c76-2140-16df-c349243e3b56@gmail.com>
Organization usenet-news.net
Date 2018-08-22 11:12 +0200

Show all headers | View raw


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í.

Back to cz.comp.lang.python | Previous | Next | Find similar


Thread

Re: [python]  Vyhodnocení jednoduchých výrazů Petr Viktorin <encukou@gmail.com> - 2018-08-22 11:12 +0200

csiph-web