Si consideri che abbiamo la seguente ingressoConvert formula personalizzata alla funzione python
formula = "(([foo] + [bar]) - ([baz]/2))"
function_mapping = {
"foo" : FooFunction,
"bar" : BarFunction,
"baz" : BazFunction,
}
C'è qualche libreria Python che mi permette di analizzare la formula e convertirlo in una funzione di rappresentanza pitone.
es.
converted_formula = ((FooFunction() + BarFunction() - (BazFunction()/2))
Attualmente sto cercando in qualcosa di simile
In [11]: ast = compiler.parse(formula)
In [12]: ast
Out[12]: Module(None, Stmt([Discard(Sub((Add((List([Name('foo')]), List([Name('bar')]))), Div((List([Name('baz')]), Const(2))))))]))
e poi elaborare ulteriormente questo albero ast.
Sei a conoscenza di una soluzione alternativa più pulita? Qualsiasi aiuto o intuizione è molto apprezzata!
Un problema potenziale con l'utilizzo di 'compiler.parse()' è che analizza in base alla sintassi di Python, che è il motivo per cui si è scoperto il '[ foo] 'nella formula in' Elenco ([Nome ('foo')]) '. Qual è la sintassi utilizzata nelle formule? – martineau
@martineau Vero, c'è un problema con la struttura delle formule sicne che si scontra con il tipo Elenco python. Definisco la sintassi delle formule, quindi posso dare qualcosa come 'In [18]: formula =" ((foo + bar) - (baz/2)) " In [19]: ast = compiler.parse (formula) In [20]: ast Out [20]: Modulo (Nessuno, Stmt ([Discard (Sub ((Aggiungi ((Nome ('foo'), Nome ('bar'))), Div ((Nome ('baz'), Const (2))))))])) ' – alchemist111
Potresti essere in grado di eludere il problema della sintassi con' compiler.parse() 'con" semplicemente "facendo la sostituzione del testo come ho mostrato nella mia [risposta] (http://stackoverflow.com/a/36354572/355230) di seguito. Detto questo, potrebbe essere meglio definire la sintassi delle espressioni della formula in modo che non sia in conflitto con la sintassi Python esistente. Ad esempio, invece del modulo 're', potrebbe essere possibile fare ciò che vuoi usando [' string.Template'] (https://docs.python.org/2/library/string.html#string.Template .template) sostituzione '$' sintassi che potrebbe essere più facile da capire e implementare. – martineau