如何定义一个变量来检查 python django 有限状态机中的先前转换
How to define a variable to check the previous transition in python django finite state machine
下面是我的代码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")
但我有条件,从慢速状态开始的人不能跳跃。
从FAST状态,他可以SLOW & JUMP,但不是直接从STARTED--> SLOW-->JUMP是可以的。
但是当我 运行 上面的代码时:
>>person = Order() #input
>>person.slow() # Input
>> person run slow # output
>>person.jump() # Input
>>person jumpped # output but expected transition error.
而且我发现这是因为,FSM 将单独保持最后的状态并根据 jump(),从 SLOW 到 JUMP 得到执行..
在@transition 函数之后为 FAST 状态定义变量的任何可能性(假设 'X')并设置为 X=Y,以指示人已达到此状态。这样当他进入JUMP状态时,可以验证变量是否为X==Y?如果有,如何定义。
有限状态机没有旧状态的记忆(下推自动机使用堆栈代替并且可以有那种内存)
您仍然可以使用 FSM 解决同样的问题,但状态要多一些:
你必须有一个状态:
- 对于一个开始快然后慢下来去 STARTED_FAST_SLOWED_DOWN
- 对面去STARTED_SLOW_FASTER_NOW
然后,如果可能,您可以执行从以下状态移动的操作
下面是我的代码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")
但我有条件,从慢速状态开始的人不能跳跃。
从FAST状态,他可以SLOW & JUMP,但不是直接从STARTED--> SLOW-->JUMP是可以的。
但是当我 运行 上面的代码时:
>>person = Order() #input
>>person.slow() # Input
>> person run slow # output
>>person.jump() # Input
>>person jumpped # output but expected transition error.
而且我发现这是因为,FSM 将单独保持最后的状态并根据 jump(),从 SLOW 到 JUMP 得到执行..
在@transition 函数之后为 FAST 状态定义变量的任何可能性(假设 'X')并设置为 X=Y,以指示人已达到此状态。这样当他进入JUMP状态时,可以验证变量是否为X==Y?如果有,如何定义。
有限状态机没有旧状态的记忆(下推自动机使用堆栈代替并且可以有那种内存)
您仍然可以使用 FSM 解决同样的问题,但状态要多一些:
你必须有一个状态:
- 对于一个开始快然后慢下来去 STARTED_FAST_SLOWED_DOWN
- 对面去STARTED_SLOW_FASTER_NOW
然后,如果可能,您可以执行从以下状态移动的操作