-1

我正在尝试使用 pytransitions 0.6.4 版的内部转换功能,但它对我不起作用。我收到一个错误

  File "/python3.6/site-packages/transitions/core.py", line 720, in set_state
mod.state = state.name
AttributeError: 'NoneType' object has no attribute 'name'

我在这里调整了代码

mod.state = state.name if state else mod.state

但后来它在其他地方出错了,所以我不确定这个功能是否已知有问题。

我正在用一个dicts列表初始化机器作为它的transitions kwarg。一个 dict 的示例是,我相信这是正确的格式。

{'trigger': 'cartridge_present_switch', 'source': 'post', 'dest': None, 'before': 'on_cartridge_present_switch'}

虽然文档只显示了使用 add_transition 方法添加的转换,如下所示

machine.add_transition('internal', ['liquid', 'gas'], None, after='change_shape')

任何人都可以评论内部转换功能吗?

谢谢,约翰

4

1 回答 1

0

0.6.6Changelog所示,已引入内部转换。传递给构造函数的转换也将被处理add_transition(s)。更准确地说,分配给构造函数的关键字transitions的值只是“按原样”传递到add_transitions解包参数的位置,并add_transition为每个转换单独调用。当然,这个过程不是万无一失的。不过,如果您遇到问题,add_transition但通过构造函数传递不可行,我建议再次检查参数列表。

from transitions import Machine

class Model():

    def model_callback(self):
        print("callback called")
        pass


states = ['A', 'B']
transitions = [{'trigger': 'internal', 'source': 'A', 
                'dest': None, 'after': 'model_callback'}]

# variant 1, passing transitions via constructor
model = Model()
m = Machine(model, states=['A', 'B'], transitions=transitions, initial='A')
model.internal()  # >>> callback called

# variant 2, passing transitions to `add_transitions` for batch processing
model = Model()
m = Machine(model, states=['A', 'B'], initial='A')
m.add_transitions(transitions)
model.internal()  # >>> callback called

# variant 3, passing transitions individually to `add_transition`
model = Model()
m = Machine(model, states=['A', 'B'], initial='A')
# accessing an element of transition list and map the keywords
# to the method parameters; basically what `add_transitions` is doing
m.add_transition(**transitions[0])
model.internal()  # >>> callback called
于 2018-06-04T08:20:29.060 回答