"sin(x)*x^2"
과 같은 문자열을 런타임에 사용자가 입력하고 x
값으로 평가할 수있는 파이썬 함수를 생성하려면 어떻게해야합니까?파이썬에서 수식 파싱
답변
파이썬의 표기법을 사용하면 파이썬 자체의 내부 컴파일러가이를 구문 분석 할 수 있습니다.
표기법을 약간 변경하면 더 행복해집니다.
import compiler
eq= "sin(x)*x**2"
ast= compiler.parse(eq)
작업 할 수있는 추상 구문 트리가 있습니다.
Sage은 matlab 대체품이며, intro videos은 귀하의 케이스와 얼마나 유사한지를 보여줍니다. 그들은 다양한 접근법을지지하는 것 같습니다. 코드가 오픈 소스이기 때문에 저자가 어떻게 그런 상황을 다루는 지 직접 살펴보고 볼 수 있습니다.
parser
가 PLY, 대한 파싱, 내장 토크 나이, 파서, 대서양 표준시를 사용하여 정의 할 수
f = parser.parse('sin(x)*x^2').to_pyfunc()
.
사용자 입력에 eval
을 사용하지 마십시오.
사용자 입력에 '평가'가 실제로 잘못되었습니다. – igaurav
J.F. Sebastian의 충고를 강조하기 위해 'eval'및 '컴파일러'솔루션조차도 미묘한 보안 허점에 노출 될 수 있습니다. 입력이 얼마나 신뢰할 수 있습니까? '컴파일러'를 사용하면 적어도 AST의 getattr 조회와 같은 것들을 걸러 낼 수 있지만, 파이썬 도움을 얻는 결과를 얻는 것보다 PLY 나 pyparsing을 사용하는 것이 더 쉽다는 것을 알았습니다.
또한 'compiler'는 어색하고 사용하기가 어렵습니다. 3.0에서는 더 이상 사용되지 않으며 제거되었습니다. 'ast'모듈 (2.6에 추가됨, 2.5에서는 '_ast'로 사용 가능)을 사용해야합니다.
vartec과 일치합니다. 나는 SymPy를 사용할 것입니다 - 특히 lambdify 함수는 여러분이 원하는 것을 정확히 수행해야합니다.
은 참조 : http://showmedo.com/videotutorials/video?name=7200080&fromSeriesID=720
이의 아주 좋은 설명.
행복을 빌며,
게시물 자체에 관련 정보를 모두 포함하십시오. * "질문에 답변하는 동영상 링크입니다."*는 좋은 답변이 아닙니다. –
대한 파싱이 문자열이 신뢰할 수없는 소스에서 특히 경우 (http://pyparsing.wikispaces.com/를) 원하는 것을 할 수 있습니다.
http://pyparsing.wikispaces.com/file/view/fourFn.py도 참조하십시오.
당신은 파이썬 parser
를 사용할 수 있습니다
import parser
formula = "sin(x)*x**2"
code = parser.expr(formula).compile()
from math import sin
x = 10
print eval(code)
그것은 물론, 코드 주입을 방지, eval
순수한보다 더 나은 수행하고!
파생 된 함수를 사용하는 방법에 대한 샘플 코드를 추가 할 수 있습니까? – Don
@Don : 구문 트리를 사용할 필요가 없습니다. 원래 기능을 사용하십시오. 'x'를 설정하고'from math import * '를 사용하여'eval ("sin (x) * x ** 2")'를 호출한다. –
eval() 작동하지만 그 대답은 실제로 문제를 해결하지 못합니다. ( –