Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > cz.comp.lang.python > #3329
| Path | csiph.com!news.redatomik.org!newsfeed.xs4all.nl!newsfeed8.news.xs4all.nl!85.12.16.70.MISMATCH!peer03.ams1!peer.ams1.xlned.com!news.xlned.com!peer02.am4!peer.am4.highwinds-media.com!news.highwinds-media.com!fx26.am4.POSTED!not-for-mail |
|---|---|
| Received-SPF | pass (Address passes the Sender Policy Framework) SPF=MAILFROM; sender=encukou@gmail.com; remoteip=::ffff:74.125.82.41; remotehost=; helo=mail-wm0-f41.google.com; receiver=hugo.zagamma.cz; |
| DKIM-Signature | v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-language:content-transfer-encoding; bh=sZSYmHlgXSUxSDjST8FXSRZiUMNykVuqA80WlZ1GkuM=; b=DWYXTbcckJK0mEUROKa+qijS+9Vm4RcJFPuEj/u+0IfafKOBG/VD6dnV0IUOlwWRvl scW/rfKEjWJsLxBUjr6wfxFs0MHHlX8U4l2/oiaqctORrzys/rVT7cPmrCTv76jvU9Bb JBk60gVTGnR89y83in+sziQHZZXv3NSOiVcZjaADnXBGb4LtTMSNbvlc/z7WD+J1rMHd 50Ujrwhg79j73mNSMnlG9Tg+uEvUg0ecRS0CLexukeY27YX5ZZ4YWfCHTU27GGRCxkBz NYwFVx6XTvbHmV50f3DT0gxzO8m473Zt+FpPKA7hXIuOjahjkWJgpNGvg1TPNYW0yndV r9zw== |
| X-Google-DKIM-Signature | v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=sZSYmHlgXSUxSDjST8FXSRZiUMNykVuqA80WlZ1GkuM=; b=sZLO3pfJ0LoSLlk+HefWkLe7rnmrVuLiDADyAsvNmRbvaqmNU/NbB8a4xx+VQ09a/A +MjoNOhj2gBKcNHFbBKyOiqtY+RySgBbctDw7yJDVQTvMqPhXThNNM+ZUNiNujM0ktpg XpOEM01v0j7HH9MB1jw7OI2YQUJjOYYHtV2oX4QtlFLMJY7TF4bH8D+5I75e9CvmvjRF lZ1Zpg5L2sQpscNsRQ4/1MSs3kVq7cxEGFRAuy/Iw6FvO6QYenAuFIy6I6XtipfU/JH/ 8U533637Tz4qmT2GXHYiT5DkIhKPGY+Zww8+4D9M6WHHf5b8ZZFj56R3GUD5XpJwjp9o 3/7g== |
| X-Gm-Message-State | APzg51BVg9y1ISD7GBZAuHVrNHriUwXjq1uTCuRa0g+Taimrk1bgDqFm 7vJ+K8/CX9m8hDcex3RU3vE= |
| X-Google-Smtp-Source | ANB0VdZPN8gIvuuhoecYiO8Or6WU4u73ZUVy5b29z+zlMRC9KoRVAAmbd+rSI+B7IUHdGjwCBK1sXg== |
| X-Received | by 2002:a1c:357:: with SMTP id 84-v6mr1743324wmd.8.1534929140605; Wed, 22 Aug 2018 02:12:20 -0700 (PDT) |
| Old-Return-Path | <encukou@gmail.com> |
| From | Petr Viktorin <encukou@gmail.com> |
| User-Agent | Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 |
| MIME-Version | 1.0 |
| In-Reply-To | <CAE1QKmT-arcdeJ=5TANfWEZoodrLH96hi8vZ4eJ-mp5HLhx7Hw@mail.gmail.com> |
| Content-Type | text/plain; charset=utf-8; format=flowed |
| Content-Language | en-US |
| Content-Transfer-Encoding | 8bit |
| Subject | Re: [python] Vyhodnocení jednoduchých výrazů |
| X-BeenThere | python@py.cz |
| X-Mailman-Version | 2.1.26 |
| Precedence | list |
| List-Id | Konference PyCZ <python.py.cz> |
| List-Unsubscribe | <http://www.py.cz/mailman/options/python>, <mailto:python-request@py.cz?subject=unsubscribe> |
| List-Archive | <http://www.py.cz/pipermail/python/> |
| List-Post | <mailto:python@py.cz> |
| List-Help | <mailto:python-request@py.cz?subject=help> |
| List-Subscribe | <http://www.py.cz/mailman/listinfo/python>, <mailto:python-request@py.cz?subject=subscribe> |
| Newsgroups | cz.comp.lang.python |
| Message-ID | <mailman.10.1534929141.32743.python@py.cz> (permalink) |
| X-Mailman-Original-Message-ID | <75468b66-0c76-2140-16df-c349243e3b56@gmail.com> |
| X-Mailman-Original-References | <CAE1QKmT-arcdeJ=5TANfWEZoodrLH96hi8vZ4eJ-mp5HLhx7Hw@mail.gmail.com> |
| References | <CAE1QKmT-arcdeJ=5TANfWEZoodrLH96hi8vZ4eJ-mp5HLhx7Hw@mail.gmail.com> <75468b66-0c76-2140-16df-c349243e3b56@gmail.com> |
| Lines | 48 |
| X-Complaints-To | abuse@usenet-news.net |
| NNTP-Posting-Date | Wed, 22 Aug 2018 09:12:22 UTC |
| Organization | usenet-news.net |
| Date | Wed, 22 Aug 2018 11:12:19 +0200 |
| X-Received-Bytes | 5248 |
| X-Received-Body-CRC | 2733552028 |
| Xref | csiph.com cz.comp.lang.python:3329 |
Show key headers only | 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
Re: [python] Vyhodnocení jednoduchých výrazů Petr Viktorin <encukou@gmail.com> - 2018-08-22 11:12 +0200
csiph-web