2012-04-01 3 views
0

나는 eval()을 이해하려고하지만 많은 행운이 없다.사용자 제공 통합 기능에 "eval"사용?

저는 자체 수학 라이브러리를 작성 중이며 통합을 라이브러리에 포함하려고합니다. 파이썬이 함수를 일련의 변수, 상수 및 연산자로 인식하도록 도움이 필요합니다. eval이 트릭을 수행 할 것이라고 들었지만 어떻게해야할까요?

fofx = input ("Write your function of x here >") 
def integrate (fofx): 
    #integration algorithm here 
    #input fofx and recognize it as f(x) to be integrated. 

나는 설명서를 시도했지만 제한적이며 평가할 제 기능에 적용 할 수있는 단서가 없습니다.

+3

'eval'은 여기서 도움이되지 않습니다. ['ast'] (http://docs.python.org/py3k/library/ast.html "추상 구문 트리") –

+2

그럼, 무엇이 당신의 질문입니까? – Marcin

+0

http://docs.python.org/library/functions.html#eval이 (가) 제한적입니까? 이 링크에 대해 명확하지 않은 점은 무엇입니까? – Simon

답변

4

eval()에 대한 설명서는 제 견해로는 분명하며 필요한 것이 무엇인지 합당한 예를 보여줍니다. 평가

>>> x = 3 

를 마지막으로 전화 :

>>> eval(f) 
15 

>>> f = 'x**2 + 2*x' 

는 그런 다음 x에 대한 값을 정의 할 수 있습니다 :

은 기본적으로 당신은 문자열로 평가되는 식을 개최 할

또는 eval에 대한 호출을 좀 더 제어하기를 원한다면 x라는 지역 변수를 생성, 당신은 eval()에 매개 변수의 평가 환경에 전달할 수 있습니다

>>> f = 'x**2 + 2*x' 
>>> eval(f, {}, {'x': 5}) 
35 

이유를 당신이 평가 환경을 제어하려는 것은 실수에서 사용중인 프로그램에 정의 된 모든 변수를 방지하는 것입니다 평가.

+1

또는 일부 조커가 "x의 기능"을 통합하려고 시도하는 것을 막기 위해 import sys; sys.exit()'. –

+2

@ Li-aungYip 입력을 eval에 제한하지 않아도 이와 같은 악용을 중지 할 것입니다. 나는 이것이 개인 프로젝트이며 악의적 인 입력에 대한 걱정이 단순히 무시 될 수 있다고 가정합니다. –

+0

이른 나이에 방어 프로그래밍을 가르치는 것이 가장 좋습니다. 오늘 eval() 사용자는 내일의 SELECT * FROM table WHERE column = % s "% user_input' 사용자입니다. –

1

아마 당신은 하나의 표현식에 대한 구문 트리를 구성 할 수있게 해주는 추상 구문 트리 모듈의 '평가'모드를 생각할 수도 있습니다.

예를 들어 아래 코드는 문자열에서 표현식을 취해 'x ** 2 + 3 * x ** 4 + 2'가 'x ** 3 + 3 * x ** 5' +2 '. (그 코드는 더 이상 것, 이것은 표현의 필수가 아닙니다!)

import ast 

class IncreasePower(ast.NodeTransformer): 
    def visit_BinOp(self,node): 
     node=self.generic_visit(node) 
     if isinstance(node.op , ast.Pow) and isinstance(node.right, ast.Num): 
      node.right.n+=1 
     return node 

x=4 
s='x**2+3*x**4+2' 
print eval(s) 

A = ast.parse(s,'source','eval') 
B = IncreasePower().visit(A) 
E = compile(A,'increased','eval') 

print eval(E) 

당신은 또한 도움이 상징적 인 수학 표현을 구축하기 위해 다른 접근 방법을 사용하여 라이브러리 sympy보고 찾을 수 있습니다 . sympy에서는 표현식을 구성하기 전에 x = sympy.Symbol ("x")로 시작합니다.

"sympy.integrate"함수는 기호 적 통합을 수행합니다.

+0

아주 좋은 답변입니다! 나를 'ast'를 자세히 배우고 싶다. –

관련 문제