Как определить переменную для проверки предыдущего перехода в python django finite state machine

#python #django-fsm

#питон #django-fsm #python

Вопрос:

Ниже приведен мой код a.py:

 from django.db import models
from django_fsm import transition, FSMIntegerField
from django_fsm import FSMField, transition
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
import django
django.setup()

from django.core.management import call_command
class Order(models.Model):
     STATUS_STARTED = 0
     STATUS_SLOW =1
     STATUS_FAST=2
     STATUS_JUMP=3
     STATUS_CHOICES = (
      (STATUS_STARTED, 'STARTED'),
      (STATUS_SLOW,'SLOW')
      (STATUS_FAST,'FAST')
      (STATUS_JUMP,'JUMP')
       )
product = models.CharField(max_length=200)
status = FSMIntegerField(choices=STATUS_CHOICES, default=STATUS_STARTED, protected=True)
  

Человек НАЧАЛ с точки, и он либо БЫСТРЫЙ, либо МЕДЛЕННЫЙ.

 @transition(field=status, source=[STATUS_STARTED],  target=STATUS_FAST)
def fast(self):
    print("person run fast")

@transition(field=status, source=[STATUS_STARTED],  target=STATUS_SLOW)
def slow(self):
    print("person run slow ")
  

Человек в БЫСТРОМ состоянии может переключиться в МЕДЛЕННОЕ состояние и может ПРЫГАТЬ:

 @transition(field=status, source=[STATUS_FAST],  target=STATUS_SLOW)
def switch(self)
    print("state switched")

@transition(field=status, source=[STATUS_FAST, STATUS_SLOW],  target=STATUS_JUMP)
def jump(self)
    print("person jumpped")
  

но у меня есть условие, что человек, который НАЧАЛ с точки с МЕДЛЕННЫМ состоянием, не может прыгать.

из быстрого состояния он может ЗАМЕДЛЯТЬСЯ и ПРЫГАТЬ, но не напрямую из STARTED-> SLOW-> возможен ПЕРЕХОД.

Но когда я запускаю приведенный выше код:

      >>person = Order() #input
     >>person.slow() # Input
     >> person run slow # output
     >>person.jump() # Input
     >>person jumpped # output but expected transition error. 
  

И я обнаружил, что это потому, что FSM будет поддерживать последнее состояние в одиночку и в соответствии с jump(), от SLOW до JUMP выполняется..

Любая возможность определить переменную (скажем, ‘X’) после функции @transition для БЫСТРОГО состояния и установить как X = Y, чтобы указать, что человек достиг этого состояния. чтобы, когда он переходит в состояние ПЕРЕХОДА, переменная могла быть проверена, является ли X ==Y или нет? если да, то как это определить.

Ответ №1:

конечный автомат не имеет повторной выборки старых состояний (вместо этого автомат pushdown использует стек и может иметь такой объем памяти)

Вы все еще можете решить ту же проблему с помощью FSM, но с немного большим количеством состояний:

Вам нужно будет иметь, например, состояния:

  • для того, который начался быстро и замедлился, чтобы перейти к STARTED_FAST_SLOWED_DOWN
  • выберите вариант, чтобы перейти к STARTED_SLOW_FASTER_NOW

и затем вы могли бы выполнять действия, которые переходят из следующих состояний, если это возможно