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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top