pytransitions 中的 get_triggers() 未返回预期输出
get_triggers() in pytransitions not returning expected output
我正在使用 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'。这就是我正在寻找的功能。
在此先感谢您的帮助!
Machine.get_triggers
returns 所有可能的转换。这还包括默认添加的自动转换。此外,构造函数关键字 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_user.git_commit()
.[=23 在模型上直接调用名为 'git_commit'
的触发器=]
我正在使用 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'。这就是我正在寻找的功能。
在此先感谢您的帮助!
Machine.get_triggers
returns 所有可能的转换。这还包括默认添加的自动转换。此外,构造函数关键字 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_user.git_commit()
.[=23 在模型上直接调用名为 'git_commit'
的触发器=]