Работают ли внутренние переходы питтранзая - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь использовать функцию внутренних переходов в версии 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

, но затем он ошибся в другом месте, поэтому я не уверен, что эта функция, как известно, имеет проблемы.

Я инициализирую машину списком диктов в качестве переходов kwarg.Примером такого указания является, и я считаю, что это правильный формат.

{'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')

Может кто-нибудь прокомментироватьна функцию внутренних переходов?

Спасибо, Джон

1 Ответ

0 голосов
/ 04 июня 2018

Внутренние переходы были введены в 0.6.6, как видно из Changelog .Переходы, переданные в конструктор, также будут обрабатываться с 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
...