ignore_invalid_triggers不起作用

时间:2018-03-27 22:53:55

标签: python transitions

我正在使用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页面上的文档之外,该库的信息有限。如果有人对此有任何见解,我将不胜感激。

提前致谢。

1 个答案:

答案 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])

现在您的代码应按预期运行,忽略无效转换。