มีรูปแบบที่ฉันเรียนรู้จากรหัส 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') นี้จะ tokenized เข้าเป็นparts ชื่อวิธีการค้นหาที่เกิดขึ้นจริงจะนำมาจาก['HELO', 'foo.bar.com']parts[0]
(วิธีการดั้งเดิมเรียกอีกอย่างว่าstate_COMMANDเพราะมันใช้รูปแบบเดียวกันในการใช้เครื่องสถานะเช่นgetattr(self, 'state_' + self.mode))