2011-02-25 3 views
2

문자열을 파이썬으로 연산자로 변환 할 수 있습니까? 제가파이썬 문자열을 연산자로 변환

이상적으로는 다음과 같을 것이다 함수에 대한 조건을 전달하고자 :

def foo(self, attribute, operator_string, right_value): 
    left_value = getattr(self, attribute) 
    if left_value get_operator(operator_string) right_value: 
     return True 
    else: 
     return False 

bar.x = 10 
bar.foo('x', '>', 10) 
[out] False 
bar.foo('x', '>=', 10) 
[out] True 

I는 사전을 만들 수있는 키가 문자열 및 값 조작 모듈의 기능을 어디에. 나는 약간 foo는 정의를 변경해야 할 것입니다 : 이것은이 사전을해야 의미하지만, 정말 필요

operator_dict = {'>', operator.lt, 
       '>=', operator.le} 
def foo(self, attribute, operator_string, right_value): 
    left_value = getattr(self, attribute) 
    operator_func = operator_dict[operator_string] 
    if operator_func(left_value, right_value): 
     return True 
    else: 
     return False 

?

+0

다루기 쉬운 연산자 집합이있는 한 사전만으로 충분합니다. –

답변

4

eval을 사용하면 동적으로 Python 코드를 빌드하고 실행할 수 있지만 그 외에는 실제 대안이 없습니다. 그러나 사전 기반 솔루션은 훨씬 더 우아하고 안전합니다.

그 외에도 실제로는 입니다.은 좋지 않습니까? 대신 "> ="의 기능에 operator.le 전달할 수없는 이유 왜

return operator_dict[operator_string](left_value, right_value) 
+0

eval을 알려 주셔서 감사합니다. 하지만 네, 맞습니다.이 사전을 만드는 것은 그렇게 나쁘지 않습니다. – Ben2209

2

... 그것을 문제가 내가 볼 수없는 지정하는 방법을 조금 단축 없습니다.

이 operator_string이 데이터베이스 또는 파일 등에서 생성되었거나 코드에서 전달하는 경우?

bar.foo('x', operator.le , 10) 

편리한 속기를 찾고 계십니까? 그럼 당신은 같은 것을 할 수 있습니다 여기에 진짜 문제가 있다면 당신은 아마 당신이 실제로지도하는 약간 파서를 작성 볼 필요가 다음 데이터베이스 또는 데이터 파일에서 들어오는 코드 또는 비즈니스 규칙을 가지고

from operator import le 
bar.foo('x', le, 10) 

당신의 이러한 객체에 입력하면 pyparsing, ply, codetalker 등과 같은 라이브러리를 사용할 수 있습니다.

+0

나는 편리한 지름길 바로 뒤에 있었다. 따라서 솔루션도 좋게 들립니다. 덕분입니다. – Ben2209

+0

아니면 모든 연산자에 대해 과제를 쓰지 않고'from operator import eq, ne, gt, lt, le, ge'을 할 수 있습니다. – kindall

+0

@kindall : 아주 좋은 지적입니다. – stderr