2012-05-09 2 views
3

저는 Twisted로 물건을 만드는 법을 배우려고합니다. 하나의 개념에 조금 갇혀 있습니다. 프로토콜을 기본적으로 두 단계로 나누어서 작성합니다. 먼저 짧은 핸드 셰이크와 인증, 실제 작업.Twisted에서 프로토콜의 두 단계를 분리하는 방법은 무엇입니까?

def stringReceived(self, data): 
    if self.state == "authenticate": 
     handle_auth(data) 
    else: 
     handle_actual_work(data) 

내가이 일의 트위스트 방식으로을 알아내는 힘든 시간을 보내고 있습니다 :

내 본래의 접근법은이 같은 프로토콜을 작성하는 것입니다. 이상은 정상입니까? 인증을 수행하는 프로토콜 하나와 인증 된 클라이언트만을 다루는 프로토콜을 작성하는 것이 훨씬 더 합리적 일 것이라고 생각되지만, 정확히 어떻게 그렇게 할 것입니까?

비슷한 질문을 Twisted: How can I identify protocol on initial connection, then delegate to appropriate Protocol implementation?에서 보았습니다. 거기에 주어진 해결책은 현재의 접근 방식과 기본적으로 동일합니다. 이것은 정말로 적절한 접근입니까?

답변

3

예, 버전이 매우 정상입니다. Arguably Twisted는 상태 머신에 대한 지원을 더 많이 가져야합니다. 다른 프로토콜, 이벤트 별자리 등에 대해 내부적으로이 일반적인 패턴을 약 100 가지로 구현했기 때문입니다.하지만이 부분은 실제로 Twisted의 작업이 아닙니다. Twisted는 객체를 네트워크에 추가하고 메서드를 호출합니다 (이 경우 stringReceived). 그 메시지로하는 일은 전적으로 당신의 사물에 달려 있습니다. 그리고 if 성명서는 그걸로하는 것이 합리적입니다. :).

이 수준에서 질문은 실제로 "비틀린 방식"에 관한 것이 아니라 오히려 문맥에 따라 달라지는 상태 기계 및 방법에 대한 더 나은 파이썬 관용구에 관한 것입니다. 당신의 프로토콜의 정확한 필요에 따라, 현재의 접근 방식은 잘 될 수도 있고,이 같은 특정 이름을 가진 방법에 파견 할 수 있습니다 :

def stringReceived(self, data): 
    getattr(self, "stringReceived_{}".format(self.state))(data) 

def stringReceived_authenticate(self, data): 
    if self.auth_ok(data): 
     self.state = 'normal' 
    else: 
     self.transport.loseConnection() 

def stringReceived_normal(self, data): 
    self.do_stuff(data) 

을 ... 심지어 애호가지고, 당신은 수도 데코레이터 또는 메타 클래스 또는 다른 것을 사용하고 싶습니다. 이러한 접근 방법 중 어떤 것도 잘못이 아닙니다.

+1

비틀림에 익숙하지 않은 이유는 단순히 비단뱀을 쓰는 것과는 달리 필수적인 꼬인 이디엄을 놓치고있는 것을 알기가 어려울 수 있기 때문입니다. 그런 이유로 누군가는 차임을 경험하는 것이 그러한 대접이 될 수 있습니다. 감사! – porgarmingduod

+0

함수 이름을 문자열로 저장하고 모든 추가 작업을 수행해야하는 이유는 무엇입니까? 'self.state'에 데이터를 처리하는 함수를 저장하고'self.state (data)'를할까요? – detly

관련 문제