pytransitions中的get_triggers()没有返回预期的输出

时间:2018-03-31 00:53:13

标签: python transitions

我正在使用pytransitions库(documented here)来实现有限状态机。概述的功能之一是能够获取特定状态的触发器列表。以下是文档中的示例:

transitions = [
{ 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid' },
{ 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas' },
{ 'trigger': 'sublimate', 'source': 'solid', 'dest': 'gas' },
{ 'trigger': 'ionize', 'source': 'gas', 'dest': 'plasma' }
]
machine = Machine(model=Matter(), states=states, tansitions=transitions)

m.get_triggers('solid')
>>> ['melt', 'sublimate']

以下是我尝试运行的代码示例:

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.get_triggers(states[0]))

预期产出:

['git commit']

获得输出:

['to_code reviewed', 'to_changes ongoing', 'git commit', 'to_changes pushed', 'to_merged', 'to_changes complete', 'next_state']

查看文档中的给定示例,我应该只返回' git commit'。这就是我正在寻找的功能。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

Machine.get_triggers返回所有可能的转换。这还包括默认添加的自动转换。此外,构造函数关键字ordered_transitions=True(相当于调用Machine.add_ordered_transitions())将添加从每个状态到您的states数组中传递的下一个状态的转换,其触发器名称为next_state 。 所以你最终得到a)所有自动转换加上b)一个next_state和c)你添加的一个转换。

要获得所需结果,您应该停用auto_transitions并省略ordered_transitions关键字:

from transitions import Machine

states = ['changes ongoing', 'changes complete', 'changes pushed', 
          'code reviewed', 'merged']
triggers = ['git commit', 'git push', 'got plus2', 'merged']

# Initialise the state machine
git_user = Machine(states=states, initial=states[0], 
                   ignore_invalid_triggers=True, auto_transitions=False)
# 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.get_triggers(states[0]))  # >>> ['git commit']

如果您想要使用转换功能,您可能还需要重新考虑触发器和状态名称。便利函数不适用于带空格的名称。 例如,'changes_ongoing'允许您使用git_user.is_changes_ongoing()来检查当前状态,其中也可以使用'git_commit'直接在模型上调用名为git_user.git_commit()的触发器。