Есть ли в Python красивая платформа State Machine? - PullRequest
6 голосов
/ 04 ноября 2010

Исходя из мира Ruby, где у нас есть прекрасные фреймворки конечных автоматов , подобные недавно запеченным в Rails , я был шокирован, обнаружив в Python ни одного очевидного кандидата с подобной красотой. Я хотел бы избежать скатывания своего; Объектно-ориентированные конструкции конечных автоматов обычно требуют, чтобы вы каждый раз добавляли состояние из группы питонов (что я буду делать часто в этом случае).

Какую структуру для конечных автоматов я должен использовать в своем коде Python? Я хотел бы получить самый элегантный код, без какой-либо производительности или других соображений.

Ответы [ 8 ]

2 голосов
/ 10 мая 2014

Я ищу то же самое, пока что xworkflow кажется лучшим кандидатом, который я могу найти.

Даже если я очень плохо знаком с Python, мне кажется, что нетСтандартные библиотеки для всего, но есть целый ряд независимых реализаций, доступных сообществом, некоторые из них более питонны, чем другие, но в итоге большинство из них великолепны.Другие реализации, которые я обнаружил, перечислены ниже.

2 голосов
/ 21 октября 2011

Я думаю, что инструмент PySCXML тоже нуждается в более внимательном рассмотрении.В этом проекте используется определение W3C: XML-диаграмма состояний ( SCXML ): нотация конечного автомата для абстракции управления

SCXML предоставляет общую среду выполнения на основе конечного автомата на основе CCXML и таблиц состояний Harel

В настоящее время SCXML является рабочим проектом;но шансы довольно высоки, что он скоро получит рекомендацию W3C (это 9-й проект).

Еще один интересный момент, на который стоит обратить внимание, - это проект Apache Commons, направленный на создание и поддержку движка Java SCXML, способноговыполнения конечного автомата, определенного с использованием документа SCXML, при абстрагировании интерфейсов среды ... А некоторые другие инструменты, поддерживающие эту технологию, появятся в будущем, когда SCXML выйдет из своего чернового состояния ...

2 голосов
/ 04 ноября 2010

Вы можете попробовать этот фрагмент

django acts_as_statemachine

1 голос
/ 19 декабря 2016

Некоторые новые претенденты (с 2014 и 2016 соответственно):

1 голос
/ 09 сентября 2013

Я знаю, что уже немного поздно, но я просто провел какое-то исследование и обнаружил этот пост.Я написал свой собственный Statemachine, связанный с моим проектом django-ozinato.

https://github.com/andrewebdev/django-ostinato/blob/master/ostinato/statemachine/core.py

Документация здесь: https://django -ostinato.readthedocs.org / en / latest /ostinato.statemachine.html

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

Кроме того, машина состояний не зависит от фреймворка, потому что вы просто передаете экземпляр объекта.Вам просто нужно убедиться, что у экземпляра есть свойство, которое содержит фактическое состояние.

Вероятно, есть гораздо лучшие подходы, но до сих пор это хорошо мне помогло.

1 голос
/ 30 марта 2012

Я часто просто использую dict для описания конечного автомата. В зависимости от приложения, ключи могут быть (состояние, событие), значения могут быть (new_state, args). Например:

machine = {
        ('state_a', 'x'): ('state_b', 'arg1'),
        ('state_b', 'y'): ('state_c', 'arg2'),
        ...
}

Класс, функция или генератор для чтения и выполнения этого dict могут быть довольно простыми, в зависимости от того, как вы хотите, чтобы ваши переходы работали. Например, генератор, использующий более поздний метод .send () python, может быть одним из способов написания простого компонента Model-View-Controller, управляемого событиями. Использование обратных вызовов вместо строк для состояний и / или событий устранит необходимость в большом количестве кода if / then.

Я знаю, что это «катит сам по себе», но на практике я обнаружил, что все это вписывается в пару десятков строк кода, в зависимости от размера конечного автомата, и может быть адаптировано для приложения лучше чем типичные общие рамки. Часто для этого требуется меньше установочного кода, чем для этих фреймворков.

Вот немного более полный пример, использующий обратные вызовы для состояния - это то, что вы должны делать, если вы всегда хотите выполнять один и тот же код при входе в состояние. (Использование обратных вызовов для событий даст вам код, специфичный для перехода.):

def foo(x):
    print 'foo got', x
    return 'x'

def bar(x):
    print 'bar got', x
    return 'y'

def baz(x):
    print 'baz got', x
    return 'z'

machine = {
    (foo, 'x'): (bar, 'arg1'),
    (bar, 'y'): (baz, 'arg2'),
    (baz, 'z'): (foo, 'arg3'),
    }

state,arg = foo,'arg0'
while True:
    event = state(arg)
    res = machine.get((state, event))
    if not res:
        print "halting on", state, event
        break
    state,arg = res

Вот вывод:

foo got arg0
bar got arg1
baz got arg2
foo got arg3
bar got arg1
baz got arg2
foo got arg3
bar got arg1
baz got arg2
foo got arg3
...
0 голосов
/ 26 июня 2019

Добавление некоторых ссылок, поскольку этот вопрос древний и требует новых ответов.

Чистый конечный автомат Python:
https://github.com/pytransitions/transitions

Джанго поддерживает конечный автомат: https://github.com/viewflow/django-fsm

0 голосов
/ 16 апреля 2019

В примеры pyparsing включено расширение языка Python конечного автомата, которое позволяет импортировать файл .pystate, содержащий спецификации конечного автомата, в виде:

#
# librarybookstate.pystate
#
# This state machine models the state of books in a library.
#

statemachine BookState:
    New -(shelve)-> Available
    Available -(reserve)-> OnHold
    OnHold -(release)-> Available
    Available -(checkout)-> CheckedOut
    CheckedOut -(checkin)-> Available

Затем код Python импортирует его как обычный модуль:

import statemachine
import librarybookstate


class Book(librarybookstate.BookStateMixin):
    def __init__(self):
        self.initialize_state(librarybookstate.New())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...