#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
и затем вы могли бы выполнять действия, которые переходят из следующих состояний, если это возможно