使用transitions库构建状态图遇TypeError错误的解决请求
问题:使用transitions库构建状态图时抛出TypeError错误
尝试使用transitions库构建简单状态图,代码如下:
from transitions.extensions.diagrams import HierarchicalGraphMachine from IPython.display import display, Markdown states = ['engoff' , 'poweron' , 'engon' , 'FCCActions' #'emgstatus' , "whevent" , 'new data receive' ,{'name' : 'cores', 'final': True, 'parallel' : [{ 'name' : 'mapeng', 'children': ['maploaded', {"name": "update", "final": True}], 'initial' : 'maploaded', 'transitions': [['delay', 'maploaded', "update"]]}, { 'name' : 'EAA' , 'children': ['newdata', {"name": "done!", "final": True}], #environment analayser 'initial' : 'newdata', 'transitions': [['Analaysing', 'newdata', 'done!']] },{ 'name' : 'FAI' , 'children': ['newdata', {"name": "done!", "final": True}], 'initial' : 'newdata', 'transitions': ['CalculateandLearning', 'newdata', 'done!'] }] } ] transitions = [['flightcommand', 'engon', 'FCCActions'], ['poweroff-command', 'engon', 'engoff'], ['init', 'engoff', 'poweron'], ['engstart-command', 'poweron', 'engon'], ['startservice', 'poweron', 'cores']] m = HierarchicalGraphMachine(states=states, transitions=transitions, initial="engoff", show_conditions=True, title="Mermaid", auto_transitions=False) m.init()
运行后抛出错误:
Traceback (most recent call last): File ".../3.transitions/test.py", line 29, in <module> m = HierarchicalGraphMachine(states=states, transitions=transitions, initial="engoff", show_conditions=True, File "...\Python\Python38\lib\site-packages\transitions\extensions\diagrams.py", line 137, in __init__ super(GraphMachine, self).__init__( File "...\Python\Python38\lib\site-packages\transitions\extensions\markup.py", line 61, in __init__ super(MarkupMachine, self).__init__( File "...\Python\Python38\lib\site-packages\transitions\extensions\nesting.py", line 407, in __init__ super(HierarchicalMachine, self).__init__( File "...\Python\Python38\lib\site-packages\transitions\core.py", line 601, in __init__ self.add_states(states) File "...\Python\Python38\lib\site-packages\transitions\extensions\diagrams.py", line 230, in add_states super(GraphMachine, self).add_states( File "...\Python\Python38\lib\site-packages\transitions\extensions\markup.py", line 126, in add_states super(MarkupMachine, self).add_states(states, on_enter=on_enter, on_exit=on_exit, File "...\Python\Python38\lib\site-packages\transitions\extensions\nesting.py", line 521, in add_states self._add_dict_state(state, ignore, remap, **kwargs) File "...\Python\Python38\lib\site-packages\transitions\extensions\nesting.py", line 978, in _add_dict_state self.add_states(state_children, remap=remap, **kwargs) File "...\Python\Python38\lib\site-packages\transitions\extensions\diagrams.py", line 230, in add_states super(GraphMachine, self).add_states( File "...\Python\Python38\lib\site-packages\transitions\extensions\markup.py", line 126, in add_states super(MarkupMachine, self).add_states(states, on_enter=on_enter, on_exit=on_exit, File "...\Python\Python38\lib\site-packages\transitions\extensions\nesting.py", line 521, in add_states self._add_dict_state(state, ignore, remap, **kwargs) File "...\Python\Python38\lib\site-packages\transitions\extensions\nesting.py", line 980, in _add_dict_state self.add_transitions(transitions) File "...\Python\Python38\lib\site-packages\transitions\core.py", line 1032, in add_transitions self.add_transition(**trans) TypeError: add_transition() argument after ** must be a mapping, not str
解决方案
错误根源是FAI子状态的transitions格式错误:当前写法是['CalculateandLearning', 'newdata', 'done!'],这是一个包含三个字符串的列表,但transitions库要求每个转换规则必须是嵌套列表(外层列表包含每个转换的子列表),和mapeng、EAA的写法保持一致。
修正后的states部分代码:
states = ['engoff' , 'poweron' , 'engon' , 'FCCActions' #'emgstatus' , "whevent" , 'new data receive' ,{'name' : 'cores', 'final': True, 'parallel' : [{ 'name' : 'mapeng', 'children': ['maploaded', {"name": "update", "final": True}], 'initial' : 'maploaded', 'transitions': [['delay', 'maploaded', "update"]]}, { 'name' : 'EAA' , 'children': ['newdata', {"name": "done!", "final": True}], #environment analayser 'initial' : 'newdata', 'transitions': [['Analaysing', 'newdata', 'done!']] },{ 'name' : 'FAI' , 'children': ['newdata', {"name": "done!", "final": True}], 'initial' : 'newdata', # 这里修正为嵌套列表,和其他子状态的transitions格式统一 'transitions': [['CalculateandLearning', 'newdata', 'done!']] }] } ]
修改后,FAI的转换规则被正确包裹在子列表中,库可以正确解析每个转换的触发事件、源状态和目标状态,不会再抛出类型错误。
内容的提问来源于stack exchange,提问作者irmoah80
相关产品推荐
相关产品推荐

