我正在使用pytransitions库(documented here)来实现有限状态机。概述的功能之一是忽略无效触发器的能力。以下是文档中的示例:
# Globally suppress invalid trigger exceptions
m = Machine(lump, states, initial='solid', ignore_invalid_triggers=True)
如果触发器设置为true,则对于无效的触发器不应抛出任何错误。
以下是我要构建的代码示例:
from transitions import Machine
states = ['changes ongoing', 'changes complete', 'changes pushed', 'code reviewed', 'merged']
triggers = ['git commit', 'git push', 'got plus2', 'merged']
# Initialize the state machine
git_user = Machine(states=states, initial=states[0], ignore_invalid_triggers=True, ordered_transitions=True)
# Create the FSM using the data provided
for i in range(len(triggers)):
git_user.add_transition(trigger=triggers[i], source=states[i], dest=states[i+1])
print(git_user.state)
git_user.trigger('git commit')
print(git_user.state)
git_user.trigger('invalid') # This line will throw an AttributeError
产生的错误:
changes ongoing
changes complete
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/transitions/core.py", line 58, in _get_trigger
raise AttributeError("Model has no trigger named '%s'" % trigger_name)
AttributeError: Model has no trigger named 'invalid'
Process finished with exit code 1
我不确定在ignore_invalid_triggers = True时抛出错误的原因。 除了官方github页面上的文档之外,该库的信息有限。如果有人对此有任何见解,我将不胜感激。
提前致谢。
答案 0 :(得分:0)
根据文档中规定的规则,要成为无效触发器,触发器名称必须在模型中的 somewhere 中有效。例如,尝试触发"合并"来自州"正在进行的变革"。您收到属性错误,因为"无效"是不一个触发器:你有一个四个列表,而且不是其中之一。
要看到建立"无效"作为一个触发器,在你的线性循环之后添加一个end-to-start转换(下面的最后一行):
# Create the FSM using the data provided
for i in range(len(triggers)):
git_user.add_transition(trigger=triggers[i], source=states[i], dest=states[i+1])
git_user.add_transition(trigger="invalid", source=states[-1], dest=states[0])
现在您的代码应按预期运行,忽略无效转换。