Twisted Python 코드에서 배운 패턴이 있습니다.
class SMTP:
def lookupMethod(self, command):
return getattr(self, 'do_' + command.upper(), None)
def do_HELO(self, rest):
return 'Howdy ' + rest
def do_QUIT(self, rest):
return 'Bye'
SMTP().lookupMethod('HELO')('foo.bar.com') # => 'Howdy foo.bar.com'
SMTP().lookupMethod('QUIT')('') # => 'Bye'
토큰을 디스패치하고 확장 된 코드를 실행해야 할 때마다 사용할 수 있습니다. 상태 머신에는 state_
메소드가 있고에 전달합니다 self.state
. 이 스위치는 기본 클래스에서 상속하고 고유 한 do_
메소드를 정의하여 깔끔하게 확장 할 수 있습니다 . 종종 do_
기본 클래스 에는 메소드 가 없습니다 .
편집 : 정확히 어떻게 사용됩니까?
SMTP의 경우 HELO
유선으로 받게 됩니다. 관련 코드 ( twisted/mail/smtp.py
의 경우에 맞게 수정 됨)는 다음과 같습니다.
class SMTP:
# ...
def do_UNKNOWN(self, rest):
raise NotImplementedError, 'received unknown command'
def state_COMMAND(self, line):
line = line.strip()
parts = line.split(None, 1)
if parts:
method = self.lookupMethod(parts[0]) or self.do_UNKNOWN
if len(parts) == 2:
return method(parts[1])
else:
return method('')
else:
raise SyntaxError, 'bad syntax'
SMTP().state_COMMAND(' HELO foo.bar.com ') # => Howdy foo.bar.com
당신은받을 수 있습니다 ' HELO foo.bar.com '
(또는 당신이 얻을 수 있습니다 'QUIT'
또는 'RCPT TO: foo'
). 이것은로 토큰 화 parts
됩니다 ['HELO', 'foo.bar.com']
. 실제 메소드 조회 이름은에서 가져옵니다 parts[0]
.
(원본 방법이라고도 state_COMMAND
은 상태 머신을 구현하기 위해 동일한 패턴을 사용하기 때문에, 즉 getattr(self, 'state_' + self.mode)
)