2012-11-20 2 views
1

이것은 내 코드입니다. 규칙 상태를 얻으려면 eval()을 사용하고 싶지만 eval()에는 로컬 변수가 필요합니다. 기본 클래스를 상속하는 많은 클래스가 있으므로 모든 클래스에서 get_stat()을 다시 작성해야합니다.로컬 동적 변수를 만드는 방법

저는 이것을 피하기 위해 동적 변수를 만드는 것이 좋습니다. 예 : get_stat(). 클래스 b는 func에서 변수 a와 b를 동적으로 생성합니다. get_stat()

함수에서 동적 varables를 어떻게 작성해야합니까? 또는이 어리석은 생각을 피하는 다른 방법. 에 대한 액세스 권한을 부여

>>> eval("a + b", {"a": 2, "b": 3}) 
5 

패스 self.__dict__ : 나는 당신에 대한 표현을 평가하기 위해 변수를 포함하는 eval() 함수에 사전을 전달할 수 있습니다

class base(object): 
    def check(self): 
     stat = get_stat() 
    def get_stat(self): 
     pass 

class b(base): 
    rule = 'a > 5 and b < 3' 
    a = 0 
    b = 0 

    def update_data(self, a, b): 
     self.a = a 
     self.b = b 

    def get_stat(self): 
     a = self.a 
     b = self.b 
     return eval(rule) 

class b(base): 
    rule = 'd > 5 and e < 3' 
    d = 0 
    e = 0 

    def update_data(self, d, e): 
     self.d = d 
     self.e = e 

    def get_stat(self): 
     d = self.d 
     e = self.e 
     return eval(rule) 
+0

내가 여기에 동적 무엇을 볼 수 없습니다! 모든 클래스에 대해'rule'을 쓰는 중이라면, 함수를 다시 쓸 수도 있습니다. – vikki

+0

@vikki : 각 서브 클래스의'rule' 속성이 on-the -fly와'get_stat()'는 현재 값을 기반으로 결과를 반환합니다. 규칙을 변경하는 데 필요한 구문이 이렇게 편리하지 않거나 깨끗하지 않을 수도 있지만 '규칙'도 방법으로 만 만들 수 있다는 사실에 맞습니다. – martineau

답변

2

작동하지 않습니다 파이썬 3.2.3, locals() 사용 객체의 속성 :

>>> class MyClass(object): 
...  def __init__(self): 
...    self.a = 2 
...    self.b = 3 
... 
>>> obj = MyClass() 
>>> obj.__dict__ 
{'a': 2, 'b': 3} 
>>> eval("a + b", obj.__dict__) 
5 

링크 :

+0

나는'vars (obj)'를 더 좋아한다. –

+0

나는'return eval (rule, self .__ dict __)'또는'return eval (rule, vars (self)) '를 사용할 수 있다고 명시해야한다고 생각한다. – martineau

+0

고마워, 내가 원하는거야. – xielingyun

관련 문제