2016-06-23 5 views
1

시나리오는 내 사용자가 평가를 위해 표현식 문자열을 제공 할 수 있다는 것입니다. 다음과 같을 수 있습니다 :python eval expression에서 변수를 게으르게 평가하는 방법

"power=(x**2+y**2)**0.5" 

그런 다음 레이블이있는 입력 스트림이 있습니다. 예컨대 :

x ; y ; z 
1 ; 2 ; 3 
1 ; 3 ; 4 

그리고 출력합니다 같은 데이터 스트림 :

x ; y ; z ; power 
3 ; 4 ; 3 ; 5.0 
6 ; 8 ; 4 ; 10.0 

그러나 나는 또한 사용자에게 예를 들어, 같은 사용보다 "비싼"변수를 사용할 수있는 가능성을 줄 것이다 '합'

"mysum = sum + 5" 

하지만

그래서 어떻게 가장 게으른 식의 변수를 평가 할 필요하지 않는 한 '합'을 계산하고 싶지 않아? 성능은 중요하지만 지나치게 중요하지는 않습니다. How do I detect variables in a python eval expression -

명확하고 이해할 수있는 코드는 내가 전에 질문을 시도

가장 중요하다. 하지만 분명히 매우 간결하지 않다.

현재 eval과 namespace를 사용 중이다. 다른 방법도 환영합니다.

더 나은 성능을 제공 할 수있는 또 다른 방법은 사전 계산 된 변수가 필요한지 미리 알기 위해 사용자 식의 모든 포함 된 변수를 검색하는 것입니다. 이 그것은 수

앙드레 라즐로에 의해 게시

import ast 
def varsInExpression(expr): 
    st = ast.parse(expr) 
    return set(node.id for node in ast.walk(st) if type(node) is ast.Name) 

:

이에 대한 좋은 답변은 또한 링크 된 질문을 게시

+1

이것은 [XY 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)입니다. 마지막 질문을했을 때 XY 문제였습니다. Y에 대해 말하기를 멈추고 X에 대해 이야기하기 전까지는 좋은 대답을 얻지 못할 것이므로 가까운 투표를 계속하게 될 것입니다. –

+0

인터프리터 작성. 여기에는 입력 문자열을 표현식을 나타내는 추상 구문 트리로 구문 분석 한 다음 해당 값에 바인딩되는 변수의 컨텍스트에서 AST를 평가하는 함수를 작성합니다. –

답변

0

질문에 대한 최적의 솔루션을 주시면 감사하겠습니다 내가 데이터를 받기 전에 필요한 변수와 함수를 초기화하고 사용되는 "똑똑한"변수 만 미리 계산하십시오

게으른 평가 부분은 아직 좋은 답변을받지 못했습니다.

관련 문제