2014-02-18 1 views
0

hybrid_property 데코레이터를 사용하여 getter/setter를 정의하려고합니다. 여기에 코드가 있습니다.설정시 SQLAlchemy hybrid_property 오류

class Users(object): 
def __init__(self, username, uid=None, password=None, group_uid=None): 
    self.uid = uid 
    self.username = username 
    self.password = password 
    self.group_uid = group_uid 

def __repr__(self): 

    return "User(%(username)s)" % self.__dict__ 

@hybrid_property 
def password(self): 

    return self._password 

@password.setter 
def set_password(self, password):  

    self._password = password 

사용자 개체에서 찾고 게터는, 제대로 즉, 문자열을 반환 user.password을 작동하지만 세터를 호출하면 저는 누락 된 것을 지적 다음

user.test('test') 
Traceback (most recent call last): 
    File "--removed--", line 35, in exec_expr 
    exec code in self.namespace, self.globs 
    File "<web>", line 1, in <module> 
TypeError: 'str' object is not callable 

어떤 도움을 얻을 수 대단히 감사하겠습니다.

추신. SQLAlchemy 버전 0.9.1 사용

+0

월 여부는 관련. 선언적 자료로 전환하는 것은 단지 우연의 일치 가능성이 높습니다 생각하지만, 2.7 0.9 파이썬 2.5 SQLAlchemy의 0.5에서 프로젝트를 리팩토링하는 동안이 문제가 다가오고 이전에는 동의어로 get/set이 설정되었지만 SQLAlchemy 0.7에서 동의어가 변경된 것으로 보입니다. – user3113357

+0

실제로이 오류가 보이는 곳은 어디입니까? 이것은'Pylons.weberror' 에러가'SQLAlchemy'에서 에러를 숨기는 것처럼 보입니다. –

+0

올바른, Pylons 디버거에서 오류가 발생합니다. 내가 말할 수있는 한 SQLAlchemy 오류가 발생하지 않습니다. – user3113357

답변

1

원래 모델은 클래식 매핑 스타일을 사용하고있었습니다. Declarative Mapping 스타일을 사용하도록 모델을 리팩터링하면 문제가 해결되었습니다. 하이브리드 속성은 클래스가 선언적 기반을 사용할 때만 작동합니다.

0

필자는 SQLAlchemy 코드를 충분히 검토하지 않았지만이 문제가 실제로 발생했는지는 확실하게 알 수는 없지만 속성을 잘못 사용하고 있다는 것이 확실합니다. set_passwordpassword으로 지정해야합니다. 나는 그것이 당신의 문제를 해결할 것이지만, 그렇지 않을지라도 당신은 여전히 ​​그것을 그렇게 할 필요가 있다고 생각합니다. See this example.

내장 된 @property 데코레이터를 사용하면 관련 오류가 표시됩니다. decorator는 로컬 네임 스페이스에있는 데코 레이팅 된 함수의 레이블에 호출 가능 함수를 가져오고 반환하는 함수의 결과를 할당하는 것의 축약 일뿐입니다. 여기에서 수행하는 작업은 호출 가능 객체 1 개를 생성하고 password에 할당 한 다음 password 호출 가능 객체를 래핑하고 set_password에 할당하는 새 호출 가능 객체를 만드는 것입니다. 이전 버전의 SQLAlchemy에서 작동한다는 의견을 언급합니다. 내 생각 엔 my_var.setter을 사용하여 새 인스턴스를 반환 할 때 래핑 된 호출 가능 객체를 수정하지 않아도됩니다. set_password을 사용한다면 password이 작동하는 것으로 예상 할 수 있습니다.

+0

조언을 주셔서 감사하지만 아무 것도 변경하지 않았습니다. – user3113357

1

속성이 메서드 인 것처럼 테스트했기 때문에 이것이 작동하지 않는 이유는 (필자는) 의심 스럽습니다. 테스트 코드에서 : user.test() (나는 당신의 코드 password의 일부 버전에서 test라는 것을 가정

당신이 user.password이 방법이 아니기 때문에 user.password('changeme') 다음은 작동하지 않습니다 않으면 대신이 있어야한다 :.. user.password = 'changeme'

나는