2009-02-27 2 views

답변

46

파이썬의 표기법을 사용하면 파이썬 자체의 내부 컴파일러가이를 구문 분석 할 수 있습니다.

표기법을 약간 변경하면 더 행복해집니다.

import compiler 
eq= "sin(x)*x**2" 
ast= compiler.parse(eq) 

작업 할 수있는 추상 구문 트리가 있습니다.

+1

파생 된 함수를 사용하는 방법에 대한 샘플 코드를 추가 할 수 있습니까? – Don

+2

@Don : 구문 트리를 사용할 필요가 없습니다. 원래 기능을 사용하십시오. 'x'를 설정하고'from math import * '를 사용하여'eval ("sin (x) * x ** 2")'를 호출한다. –

+1

eval() 작동하지만 그 대답은 실제로 문제를 해결하지 못합니다. ( –

0

Sage은 matlab 대체품이며, intro videos은 귀하의 케이스와 얼마나 유사한지를 보여줍니다. 그들은 다양한 접근법을지지하는 것 같습니다. 코드가 오픈 소스이기 때문에 저자가 어떻게 그런 상황을 다루는 지 직접 살펴보고 볼 수 있습니다.

parser가 PLY, 대한 파싱, 내장 토크 나이, 파서, 대서양 표준시를 사용하여 정의 할 수
13
f = parser.parse('sin(x)*x^2').to_pyfunc() 

.

사용자 입력에 eval을 사용하지 마십시오.

+4

사용자 입력에 '평가'가 실제로 잘못되었습니다. – igaurav

2

J.F. Sebastian의 충고를 강조하기 위해 'eval'및 '컴파일러'솔루션조차도 미묘한 보안 허점에 노출 될 수 있습니다. 입력이 얼마나 신뢰할 수 있습니까? '컴파일러'를 사용하면 적어도 AST의 getattr 조회와 같은 것들을 걸러 낼 수 있지만, 파이썬 도움을 얻는 결과를 얻는 것보다 PLY 나 pyparsing을 사용하는 것이 더 쉽다는 것을 알았습니다.

또한 'compiler'는 어색하고 사용하기가 어렵습니다. 3.0에서는 더 이상 사용되지 않으며 제거되었습니다. 'ast'모듈 (2.6에 추가됨, 2.5에서는 '_ast'로 사용 가능)을 사용해야합니다.

1

vartec과 일치합니다. 나는 SymPy를 사용할 것입니다 - 특히 lambdify 함수는 여러분이 원하는 것을 정확히 수행해야합니다.

은 참조 : http://showmedo.com/videotutorials/video?name=7200080&fromSeriesID=720

이의 아주 좋은 설명.

행복을 빌며,

+1

게시물 자체에 관련 정보를 모두 포함하십시오. * "질문에 답변하는 동영상 링크입니다."*는 좋은 답변이 아닙니다. –

22

당신은 파이썬 parser를 사용할 수 있습니다

import parser 
formula = "sin(x)*x**2" 
code = parser.expr(formula).compile() 

from math import sin 
x = 10 
print eval(code) 

그것은 물론, 코드 주입을 방지, eval 순수한보다 더 나은 수행하고!

+5

주목할 점 중 하나는 사용자 입력에 순수한'eval()'을 사용하면 [** 매우 위험합니다 **] 일 수 있다는 것입니다 (https://stackoverflow.com/questions/1832940/is-using-eval-in-python -a-bad-practice/1832957 # 1832957). –

+0

코드 삽입을 피하는 방법은 무엇입니까? – devxeq

+0

@devxeq'formula = "os.system ('format C :')"': – Don