,
class StateMachine(object):
def __init__(self):
self.handlers = {}
self.start_state = None
self.end_states = []
def add_state(self, name, handler, end_state=0):
name = name.upper()
self.handlers[name] = handler
if end_state:
self.end_states.append(name)
def set_start(self, name):
self.start_state = name
def run(self, **kw):
"""
Run
:param kw:
:return:
"""
try:
handler = self.handlers[self.start_state]
except:
raise InitializationError("must call .set_start() before .run()")
while True:
(new_state, kw) = handler(**kw)
if isinstance(new_state, str):
if new_state in self.end_states:
print("reached ", new_state)
break
else:
handler = self.handlers[new_state]
elif hasattr(new_state, "__call__"):
handler = new_state
else:
return
class MyParser(StateMachine):
def __init__(self):
super().__init__()
self.handlers["begin_parse"] = self.begin_parse
self.set_start("begin_parse")
def end(self, **kw):
logging.info("End of parsing ")
return None, None
def second(self, **kw):
logging.info("second ")
if ...:
return self.end, {}
def begin_parse(self, **kw):
logging.info("start of parsing ")
while True:
kw = {}
if ...:
return self.second, kw
else:
return self.end, kw
MyParser().run()
INFO:root:start of parsing
INFO:root:second
INFO:root:End of parsing