Equazione parsing in Python
Domanda
Come posso (facilmente) prendere una stringa come "sin(x)*x^2"
che potrebbe essere inserito da un utente in fase di esecuzione e produrre una funzione Python che potrebbe essere valutata per ogni valore di x
?
Soluzione
proprio interno del compilatore Python può analizzare questo, se si utilizza la notazione Python.
Se la modifica la notazione un po ', sarai più felice.
import compiler
eq= "sin(x)*x**2"
ast= compiler.parse( eq )
Si ottiene un albero di sintassi astratta che si può lavorare.
Altri suggerimenti
È possibile utilizzare Python parser
:
import parser
formula = "sin(x)*x**2"
code = parser.expr(formula).compile()
from math import sin
x = 10
print eval(code)
Si comporta meglio di pura eval
e, naturalmente, evita l'inserimento di codice!
f = parser.parse('sin(x)*x^2').to_pyfunc()
Dove parser
potrebbe essere definita utilizzando strati, pyparsing, tokenizzatore incorporato, parser, ast.
Non utilizzare eval
all'input dell'utente.
pyparsing potrebbe fare ciò che si vuole ( http://pyparsing.wikispaces.com/ ) soprattutto se il corde sono da una fonte non attendibile.
Si veda anche http://pyparsing.wikispaces.com/file/view/fourFn. py per un calcolatore piuttosto ricco di funzionalità costruito con esso.
Per sottolineare il consiglio di J.F. Sebastian, 'eval' e anche la 'compilatore' soluzioni possono essere aperti a buchi di sicurezza sottili. Come affidabile è l'ingresso? Con 'compilatore' puoi almeno filtrare le cose come GetAttr le ricerche dalla AST, ma ho scoperto che è più facile da usare PLY o pyparsing per questo genere di cose che è di garantire il risultato di lasciare Python dare una mano.
Inoltre, 'compilatore' è goffo e difficile da usare. E 'deprecato e rimosso in 3.0. Si consiglia di utilizzare il modulo 'ast' (aggiunto in 2.6, disponibile in 2.5 come '_ast').
In accordo con Vartec. Vorrei usare SymPy -. In particolare la funzione lambdify dovrebbe fare esattamente quello che vuoi
See: http://showmedo.com/videotutorials/video?name=7200080&fromSeriesID = 720
per fare una bella spiegazione di questo.
Un caro saluto,
Sage è inteso come sostituto MATLAB e in noreferrer video introduttivi è dimostrato come simili ai tuoi casi vengono gestiti. Sembrano essere che supporta un'ampia gamma di approcci. Dal momento che il codice è open-source è possibile sfogliare e vedere di persona come gli autori di gestire questi casi.