State python что это

StateMachine¶

While State has a way to allow the client programmer to change the implementation, StateMachine imposes a structure to automatically change the implementation from one object to the next. The current implementation represents the state that a system is in, and the system behaves differently from one state to the next (because it uses State). Basically, this is a “state machine” using objects.

The code that moves the system from one state to the next is often a Template Method, as seen in the following framework for a basic state machine.

Each state can be run( ) to perform its behavior, and (in this design) you can also pass it an “input” object so it can tell you what new state to move to based on that “input”. The key distinction between this design and the next is that here, each State object decides what other states it can move to, based on the “input”, whereas in the subsequent design all of the state transitions are held in a single table. Another way to put it is that here, each State object has its own little State table, and in the subsequent design there is a single master state transition table for the whole system:

This class is clearly unnecessary, but it allows us to say that something is a State object in code, and provide a slightly different error message when all the methods are not implemented. We could have gotten basically the same effect by saying:

because we would still get exceptions if run( ) or next( ) were called for a derived type, and they hadn’t been implemented.

At this point the basic framework for this style of StateMachine (where each state decides the next states) is complete. As an example, I’ll use a fancy mousetrap that can move through several states in the process of trapping a mouse [1]. The mouse classes and information are stored in the mouse package, including a class representing all the possible moves that a mouse can make, which will be the inputs to the state machine:

You’ll note that __cmp__( ) has been overidden to implement a comparison between action values. Also, each possible move by a mouse is enumerated as a MouseAction object, all of which are static fields in MouseAction.

For creating test code, a sequence of mouse inputs is provided from a text file:

With these tools in place, it’s now possible to create the first version of the mousetrap program. Each State subclass defines its run( ) behavior, and also establishes its next state with an if-else clause:

The StateMachine class simply defines all the possible states as static objects, and also sets up the initial state. The UnitTest creates a MouseTrap and then tests it with all the inputs from a MouseMoveList.

While the use of if statements inside the next( ) methods is perfectly reasonable, managing a large number of these could become difficult. Another approach is to create tables inside each State object defining the various next states based on the input.

Initially, this seems like it ought to be quite simple. You should be able to define a static table in each State subclass that defines the transitions in terms of the other State objects. However, it turns out that this approach generates cyclic initialization dependencies. To solve the problem, I’ve had to delay the initialization of the tables until the first time that the next( ) method is called for a particular State object. Initially, the next( ) methods can appear a little strange because of this.

The StateT class is an implementation of State (so that the same StateMachine class can be used from the previous example) that adds a Map and a method to initialize the map from a two-dimensional array. The next( ) method has a base-class implementation which must be called from the overridden derived class next( ) methods after they test for a null Map (and initialize it if it’s null):

If you have to create and maintain a lot of State classes, this approach is an improvement, since it’s easier to quickly read and understand the state transitions from looking at the table.

Table-Driven State Machine¶

The advantage of the previous design is that all the information about a state, including the state transition information, is located within the state class itself. This is generally a good design principle.

However, in a pure state machine, the machine can be completely represented by a single state-transition table. This has the advantage of locating all the information about the state machine in a single place, which means that you can more easily create and maintain the table based on a classic state-transition diagram.

The classic state-transition diagram uses a circle to represent each state, and lines from the state pointing to all states that state can transition into. Each transition line is annotated with conditions for transition and an action during transition. Here’s what it looks like:

(Simple State Machine Diagram)

The State Class¶

The State class is distinctly different from before, since it is really just a placeholder with a name. Thus it is not inherited from previous State classes:

Conditions for Transition¶

In the state transition diagram, an input is tested to see if it meets the condition necessary to transfer to the state under question. As before, the Input is just a tagging interface:

The Condition evaluates the Input to decide whether this row in the table is the correct transition:

Transition Actions¶

If the Condition returns true, then the transition to a new state is made, and as that transition is made some kind of action occurs (in the previous state machine design, this was the run( ) method):

The Table¶

With these classes in place, we can set up a 3-dimensional table where each row completely describes a state. The first element in the row is the current state, and the rest of the elements are each a row indicating what the type of the input can be, the condition that must be satisfied in order for this state change to be the correct one, the action that happens during transition, and the new state to move into. Note that the Input object is not just used for its type, it is also a Messenger object that carries information to the Condition and Transition objects:

The Basic Machine¶

Here’s the basic machine, (code only roughly converted):

Источник

Конечные автоматы (FSM)¶

Теория¶

В этой главе мы поговорим о, пожалуй, самой важной возможности ботов: о системе диалогов. К сожалению, далеко не все действия в боте можно выполнить за одно сообщение или команду. Предположим, есть бот для знакомств, где при регистрации нужно указать имя, возраст и отправить фотографию с лицом. Можно, конечно, попросить пользователя отправить фотографию, а в подписи к ней указать все данные, но это неудобно для обработки и запроса повторного ввода.
Теперь представим пошаговый ввод данных, где в начале бот «включает» режим ожидания определённой информации от конкретного юзера, далее на каждом этапе проверяет вводимые данные, а по команде /cancel прекращает ожидать очередной шаг и возвращается в основной режим. Взгляните на схему ниже:

State python что это. l04 1. State python что это фото. State python что это-l04 1. картинка State python что это. картинка l04 1

Зелёной стрелкой обозначен процесс перехода по шагам без ошибок, синие стрелки означают сохранение текущего состояния и ожидание повторного ввода (например, если юзер указал, что ему 250 лет, следует запросить возраст заново), а красные показывают выход из всего процесса из-за команды /cancel или любой другой, означающей отмену.

Процесс со схемы выше в теории алгоритмов называется конечным автоматом (или FSM — Finite State Machine). Подробнее об этом можно прочесть здесь.

Практика¶

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

Примечание об исходных текстах к главе

В тексте будет рассмотрен не весь код бота, некоторые импорты и обработчики специально пропущены для улучшения читабельности. Полный набор исходников можно найти на GitLab или в зеркале на GitHub.

За основу структуры файлов и каталогов взят репозиторий tgbot_template от пользователя Tishka17. В этой главе будет рассмотрен сильно упрощённый вариант его примера, а далее по мере усложнения бота структура файлов будет расширяться.
Спасибо!

Структура файлов и каталогов¶

О модулях, пакетах и каталогах

Создание шагов¶

Рассмотрим описание шагов для «заказа» еды. Для начала в файле app/handlers/food.py импортируем необходимые объекты и приведём списки блюд и их размеров (в реальной жизни эта информация может динамически подгружаться из какой-либо БД):

Напишем обработчик первого шага, реагирующий на команду /food (регистрировать его будем позднее):

Осталось реализовать последнюю функцию, которая отвечает за получение размера порции (с аналогичной проверкой ввода) и вывод результатов пользователю:

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

Общие команды¶

Раз уж заговорили о сбросе состояний, давайте в файле app/handlers/common.py реализуем обработчики команды /start и действия «отмены». Первая должна показывать некий приветственный/справочный текст, а вторая просто пишет «действие отменено». Обе функции сбрасывают состояние и данные и убирают обычную клавиатуру, если вдруг она есть:

Зарегистрируем эти два обработчика:

Точка входа¶

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

Источник

Основы языка программирования Python за 10 минут

State python что это. image loader. State python что это фото. State python что это-image loader. картинка State python что это. картинка image loader

На сайте Poromenos’ Stuff была
опубликована статья, в которой, в сжатой форме,
рассказывают об основах языка Python. Я предлагаю вам перевод этой статьи. Перевод не дословный. Я постарался подробнее объяснить некоторые моменты, которые могут быть непонятны.

Если вы собрались изучать язык Python, но не можете найти подходящего руководства, то эта
статья вам очень пригодится! За короткое время, вы сможете познакомиться с
основами языка Python. Хотя эта статья часто опирается
на то, что вы уже имеете опыт программирования, но, я надеюсь, даже новичкам
этот материал будет полезен. Внимательно прочитайте каждый параграф. В связи с
сжатостью материала, некоторые темы рассмотрены поверхностно, но содержат весь
необходимый метриал.

Основные свойства

Python не требует явного объявления переменных, является регистро-зависим (переменная var не эквивалентна переменной Var или VAR — это три разные переменные) объектно-ориентированным языком.

Синтаксис

Во первых стоит отметить интересную особенность Python. Он не содержит операторных скобок (begin..end в pascal или <..>в Си), вместо этого блоки выделяются отступами: пробелами или табуляцией, а вход в блок из операторов осуществляется двоеточием. Однострочные комментарии начинаются со знака фунта «#», многострочные — начинаются и заканчиваются тремя двойными кавычками «»»»».
Чтобы присвоить значение пременной используется знак «=», а для сравнения —
«==». Для увеличения значения переменной, или добавления к строке используется оператор «+=», а для уменьшения — «-=». Все эти операции могут взаимодействовать с большинством типов, в том числе со строками. Например

Структуры данных

Вы можете использовать часть массива, задавая первый и последний индекс через двоеточие «:». В таком случае вы получите часть массива, от первого индекса до второго не включительно. Если не указан первый элемент, то отсчет начинается с начала массива, а если не указан последний — то масив считывается до последнего элемента. Отрицательные значения определяют положение элемента с конца. Например:

Строки

Строки в Python обособляются кавычками двойными «»» или одинарными «’». Внутри двойных ковычек могут присутствовать одинарные или наоборот. К примеру строка «Он сказал ‘привет’!» будет выведена на экран как «Он сказал ‘привет’!». Если нужно использовать строку из несколько строчек, то эту строку надо начинать и заканчивать тремя двойными кавычками «»»»». Вы можете подставить в шаблон строки элементы из кортежа или словаря. Знак процента «%» между строкой и кортежем, заменяет в строке символы «%s» на элемент кортежа. Словари позволяют вставлять в строку элемент под заданным индексом. Для этого надо использовать в строке конструкцию «%(индекс)s». В этом случае вместо «%(индекс)s» будет подставлено значение словаря под заданным индексом.

Операторы

Операторы while, if, for составляют операторы перемещения. Здесь нет аналога оператора select, так что придется обходиться if. В операторе for происходит сравнение переменной и списка. Чтобы получить список цифр до числа — используйте функцию range( ). Вот пример использования операторов

if rangelist[ 1 ] == 2 :
print «The second item (lists are 0-based) is 2»
elif rangelist[ 1 ] == 3 :
print «The second item (lists are 0-based) is 3»
else :
print «Dunno»

while rangelist[ 1 ] == 1 :
pass

Функции

# Следующая запись эквивалентна def f(x): return x + 1
functionvar = lambda x: x + 1
>>> print functionvar( 1 )
2

Классы

Язык Python ограничен в множественном наследовании в классах. Внутренние переменные и внутренние методы классов начинаются с двух знаков нижнего подчеркивания «__» (например «__myprivatevar»). Мы можем также присвоить значение переменной класса извне. Пример:

Исключения

Исключения в Python имеют структуру tryexcept [exceptionname]:

def somefunction():
try :
# Деление на ноль вызывает ошибку
10 / 0
except ZeroDivisionError :
# Но программа не «Выполняет недопустимую операцию»
# А обрабатывает блок исключения соответствующий ошибке «ZeroDivisionError»
print «Oops, invalid.»

Импорт

Внешние библиотеки можно подключить процедурой «import [libname]», где [libname] — название подключаемой библиотеки. Вы так же можете использовать команду «from [libname] import [funcname]», чтобы вы могли использовать функцию [funcname] из библиотеки [libname]

import random #Импортируем библиотеку «random»
from time import clock #И заодно функцию «clock» из библиотеки «time»

Работа с файловой системой

Python имеет много встроенных библиотек. В этом примере мы попробуем сохранить в бинарном файле структуру списка, прочитать ее и сохраним строку в текстовом файле. Для преобразования структуры данных мы будем использовать стандартную библиотеку «pickle»

myfile = file (r «C:\text.txt» )
>>> print myfile.read()
‘This is a sample string’
myfile.close()

Особенности

def myfunc():
# Выводит 5
print number

def anotherfunc():
# Это вызывает исключение, поскольку глобальная апеременная
# не была вызванна из функции. Python в этом случае создает
# одноименную переменную внутри этой функции и доступную
# только для операторов этой функции.
print number
number = 3

def yetanotherfunc():
global number
# И только из этой функции значение переменной изменяется.
number = 3

Эпилог

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

Преимущества Python

Источник

State Pattern in Python

Learn to implement state pattern and finite state machines using Python.

State python что это. giridhar. State python что это фото. State python что это-giridhar. картинка State python что это. картинка giridhar

Giridhar Talla

Creative Web Developer

State Pattern in Python

Learn to implement state pattern and finite state machines using Python.

State python что это. giridhar. State python что это фото. State python что это-giridhar. картинка State python что это. картинка giridhar

Giridhar Talla

Creative Web Developer

Design patterns are conventional solutions to common challenges in software development using Object-oriented programming. One of the famous design patterns for developing scalable and flexible software is the state pattern. You’ll learn about the state pattern and how to apply it to improve your software project in this article.

Finite State Machine

Let’s define a finite state machine (FSM) before moving on to the state design pattern. It is well known that the concepts of state patterns and finite-state machines have a close relationship. An FSM is something that behaves differently depending on its internal state. In computer programming, the behavior of an object in an application varies depending on its state. A switch and a lightbulb are simple examples of FSM. «ON» and «OFF» are the two possible states of the light bulb. To change the state of the bulb ‘ON’ or ‘OFF’, simply flip the switch. Transition is the process of moving from one state to another. Transition is affected by several factors. In the case of the light bulb, it is dependent on the input from the switch. The state diagram, which is shown below, graphically depicts the states and transitions.

State python что это. 01 bulb state diagram. State python что это фото. State python что это-01 bulb state diagram. картинка State python что это. картинка 01 bulb state diagram

We can implement the state machine using any programming language. Depending on a few factors, our code behaves differently. You can implement the preceding light bulb example as follows:

For small systems, such as the one described above, the code appears to be straightforward and simple. However, if there are many states and transitions, our code will get flabby with conditional statements. The code becomes more extensive, and it won’t be easy to maintain the application. If you want to add additional states or transitions to the program, you’ll have to change the entire code base. You can use the State Design Pattern in these cases.

State Pattern

It is a behavioral design pattern. You can use the state pattern to implement state-specific behavior in which objects can change their functionality at runtime. You can use it to avoid using conditional statements when changing an object’s behavior based on its state. In the state pattern, you should encapsulate) different states in separate State classes. The original class keeps a reference to a state object based on its current state rather than using conditional statements to implement state-dependent functionality.

UML Diagram

State python что это. 02 UML state class. State python что это фото. State python что это-02 UML state class. картинка State python что это. картинка 02 UML state class

How does it work?

State python что это. 03 UML state sequence. State python что это фото. State python что это-03 UML state sequence. картинка State python что это. картинка 03 UML state sequence

If you want to add another state, simply create a new concrete state object without changing the Context of the application.

Implementation

Let’s take a step-by-step look at implementing the state pattern.

1) Find an existing class that contains state-dependent code, or create a suitable context class. It should include a reference to a specific state as well as a method for switching between states.

2) Create a common State interface for all concrete states. The State interface specifies all of the methods that all Concrete States must implement and a backreference to the Context object. States can change the Context to another state by using this backreference.

3) You can define the concrete states in the classes that implement the state interface. After the doSomething method is called, the state of the Context changes. You can also change the state by defining a specific method. The state transitions use the setState method of the Context.

4) You can now initiate your application with an initial state and execute the methods.

The output of the above code looks something like this:

Example

The following code is the implementation of the elevator example. Follow along with the comments for more descriptions about each method.

The output of the above code looks like this:

You can implement many buttons and states elevator like in real-life one for the floor. Try using the state pattern to implement the light bulb example from the Finite state machine.

Advantages and Disadvantages

The state pattern, like any other programming concept, has a number of benefits as well as some drawbacks. You can avoid writing massive conditional blocks for switching between states by using the state pattern instead of hard-coding state-specific behavior. It allows you to develop a flexible and maintainable application. You can add new states and transitions to the Context without changing it.

It’s a good idea to use the state pattern if the logic of each state is complex and the states change frequently. Otherwise, it complicates simple things by bringing a plethora of classes and objects. The state pattern adds another level of indirection by imposing clients to rely on a State object, and it extends the context class to allow State objects to change the state of the Context.

Conclusion

In this article, you learned how to use the state pattern in Python programming to design state machines. Without using larger conditional blocks to implement state-specific behavior, the state pattern makes the development process a lot easier. You can also add new states that are not dependent on other states, giving your application more flexibility. The state pattern is very similar to the strategy pattern, which alters strategies based on user choices. The main distinction is that concrete states are aware of other states, whereas the strategies do not. Why do we say that states are aware of other states? because each state has to know to which state they should move. For example, the first-floor state knows that they should change to the second-floor state. Another important difference with strategy pattern is that in the case of Strategy pattern, it’s the client, which provides a different strategy to Context, on State pattern, the state transition is managed by Context or State itself. Try to make use of the state pattern in your software to make the development process go more smoothly.

Источник

Создание конечных автоматов с помощью корутин в Python

Конечный автомат (Finite State Machine) — это математическая модель вычислений, которая моделирует последовательную логику. FSM состоит из конечного числа состояний, функций перехода, входных алфавитов, начального и конечного состояний. В области компьютерных наук автоматы используются при проектировании компиляторов, лингвистической обработки, пошаговых рабочих процессов, игрового дизайна, процедур протоколов (например, TCP / IP), программирования на основе событий, разговорного искусственного интеллекта и многих других.

Чтобы понять, что такое конечный автомат, мы можем взглянуть на дорожный светофор. Конечный автомат для него представлен ниже. Зеленый (Green) — это начальное состояние, который при получении сигнала переходит в желтый (Yellow), который, в свою очередь, при получении сигнала переходит в красный (Red). Красный затем возвращается к зеленому, и цикл продолжается.

State python что это. 79678813 d572ff00 821c 11ea 8437 b4a3b7fd1a60. State python что это фото. State python что это-79678813 d572ff00 821c 11ea 8437 b4a3b7fd1a60. картинка State python что это. картинка 79678813 d572ff00 821c 11ea 8437 b4a3b7fd1a60

FSM должен находиться точно в одном из конечных состояний в любой данный момент времени, а затем, в ответ на вход, который он получает, машина переходит в другое состояние. В приведенном выше примере сигнал светофора находится точно в одном из трех состояний — зеленом, желтом или красном. Правила перехода определены для каждого состояния, которые определяют, какая последовательная логика будет воспроизводиться при получение сигнала.

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

Корутины в Python

Прежде чем углубиться в реализацию, сделаем начальный обзор и посмотрим, что такое генераторы и корутины, как они помогут сделать реализацию FSM интуитивно понятной.

Генераторы

Генераторы — это возобновляемые функции, которые выдают значения до тех пор, пока кто-то, вызывая функцию next, продолжает спрашивать об этом. Если больше нет значений для выдачи, генератор вызывает исключение StopIteration.

Оператор yield — это то, где происходит вся магия. По достижении оператора yield выполнение функции генератора приостанавливается, и полученное значение возвращается вызывающей стороне, и вызывающая сторона продолжает свое выполнение. Поток возвращается к генератору, когда вызывающая функция запрашивает следующее значение. Как только следующее значение запрашивается путем вызова next (явным или неявным образом), функция генератор возобновляет работу с того места, на котором она остановилась, т.е. с оператора yield.

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

Корутины

Корутины, как и генераторы, являются возобновляемыми функциями, но вместо генерации значений они принимают значения на лету. Работа с ним очень похожа на генератор, и опять-таки, в операторе yield происходит все волшебство. Когда корутина приостанавливается в операторе yield, мы можем отправить ее значение с помощью функции send, а значение можно использовать с помощью оператора присваивания = yield, как показано ниже.

В приведенном выше примере мы написали простую утилиту grep, которая проверяет подстроку в заданном потоке текста. Когда grep ставится на паузу в операторе yield, используя функцию send, мы отправляем ей текст, и после этого на него будет ссылаться переменная line. Затем корутина продолжает выполнение, чтобы проверить, находится ли substr в line или нет. Как только поток снова достигает оператора yield, корутина останавливается и ждет, пока вызывающая сторона отправит ей новое значение.

Обратите внимание, что это не поток, который продолжает работать и постоянно загружает процессор. Это просто функция, выполнение которой приостановлено в операторе yield, ее состояние сохраняется, а управление передается вызывающей стороне. После возобновления корутина начинается с того же состояния, в котором она остановилась.

Перед отправкой значения в корутину нам нужно «заправить» ее так, чтобы поток достиг оператора yield и выполнение было приостановлено в ожидании нового значения.

В приведенных выше вызовах функций мы видим, как мы можем продолжать посылать текст в корутину, и она продолжает возвращать, если обнаружить заданную подстроку users/created в тексте. Эта способность корутин приостанавливать выполнение и принимать ввод на лету поможет нам смоделировать FSM очень интуитивно понятным способом.

Построение конечного автомата

При создании FSM самое важное — как мы решаем моделировать и реализовывать состояния и функции перехода. Состояния могут быть смоделированы как корутины Python, которые выполняют бесконечный цикл, в рамках которого они принимают ввод, решают переход и обновляют текущее состояние FSM. Функция перехода может быть такой же простой, как набор операторов if и elif, а в более сложной системе это может быть функция принятия решения.

Чтобы погрузиться в детали низкого уровня, мы строим FSM для регулярного выражения ab*c, что означает, что если данная строка соответствует регулярному выражению, то машина должна завершиться в конечном состоянии, только тогда мы говорим, что строка соответствует регулярному выражению.

State python что это. 79634655 84fe9180 8189 11ea 9b94 f9ee563394bf. State python что это фото. State python что это-79634655 84fe9180 8189 11ea 9b94 f9ee563394bf. картинка State python что это. картинка 79634655 84fe9180 8189 11ea 9b94 f9ee563394bf

Состояние

Исходя из вышесказанного, смоделируем состояние q2 как

корутина работает как бесконечный цикл, в котором она ожидает входной токен в операторе yield. Получив вход, скажем, b, она меняет текущее состояние FSM на q2, а при получении c меняет состояние на q3, и это именно то, что мы видим на диаграмме FSM.

Класс FSM

Для сохранения инкапсуляции мы определим класс для FSM, который содержит все состояния и поддерживает текущее состояние машины. Он также будет иметь метод send, который перенаправляет полученный ввод в current_state. При получении ввода с помощью current_state мы сможем принять решение о следующем состояние и обновить current_state FSM, как показано выше.

В зависимости от варианта использования у FSM также может быть функция, которая отвечает на основные проблемы, например, соответствует ли данная строка регулярному выражению? или делится число на 3?

Класс FSM для регулярного выражения ab*c может быть смоделирован следующим образом:

Подобно тому, как мы определили функцию _create_q2, мы определяем функции для других трех состояний start, q1 и q3. Вы можете найти полный смоделированный FSM, в arpitbbhayani/fsm/regex-1

Функция Driver

Мотивом этой постановки задачи является определение функции с именем grep_regex, которая проверяет данный текст на соответствие регулярному выражению ab*c. Функция создаст экземпляр FSM и передаст ему поток символов. После того, как все символы будут получены, вызывается функция does_match, которая определить, соответствует ли данный text регулярному выражению ab*c или нет.

Все выполняется чисто последовательное — и это из-за корутины. Кажется, что все состояния работают параллельно, но все они выполняются в одном потоке одновременно. Корутина current state выполняется, в то время как все остальные будут приостановлены в своих соответствующих операторах yield. Когда новый входной сигнал отправиться в коррутину, она разблокируется, завершит свое выполнение, изменит current_state FSM и снова приостанавит свое выполнение в операторе yield.

Больше FSMs

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

Делимость на 3

Здесь мы строим FSM, который сообщает, делится ли данный поток цифр чисел на 3 или нет. Конечный автомат, показано ниже.

State python что это. 79641628 564ae000 81b6 11ea 9c84 147cae3a30a6. State python что это фото. State python что это-79641628 564ae000 81b6 11ea 9c84 147cae3a30a6. картинка State python что это. картинка 79641628 564ae000 81b6 11ea 9c84 147cae3a30a6

Мы можем реализовать состояние q1 через корутину

Мы можем увидеть сходство между реализацией корутин и функцией перехода состояний. Полная реализация этого FSM находится в arpitbbhayani/fsm/divisibility-by-3.

SQL Query Валидатор

Здесь мы создаем FSM для SQL Query Validator, который для полученного SQL-запроса сообщает, является ли он допустимым SQL-запросом или нет. FSM для валидатора, который охватывает все запросы SQL, будет массивным, поэтому мы просто взяли его подмножество, где мы поддерживаем следующие запросы SQL

State python что это. 79635523 1c1a1800 818f 11ea 8afe fe8065b55791. State python что это фото. State python что это-79635523 1c1a1800 818f 11ea 8afe fe8065b55791. картинка State python что это. картинка 79635523 1c1a1800 818f 11ea 8afe fe8065b55791

Мы можем реализовать состояние explicit_cols как корутину,

Опять же, корутина, посредством которой реализуется состояние, очень похожа на функцию перехода состояния, сохраняющую свою простоту. Всю реализацию этого FSM можно найти в arpitbbhayani/fsm/sql-query-validator.

Заключение

Хотя это может быть не самый эффективный способ реализации и построения FSM, но на самом деле это самый интуитивный способ. Ребра и переходы состояний хорошо транслируются в операторы if и elif или функции принятия решений, в то время как каждое состояние моделируется как независимая корутина, и мы все еще делаем вещи последовательным образом. Все исполнение похоже на эстафету, где эстафету исполнения передают от одной корутины к другой.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *