问题标签 [pytransitions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 在状态机初始化期间使用 PyTransitions 状态机强制回调
我已经为池控制器编写了一个状态机,但是我正在努力解决文档中关于在我初始化模型时强制 on_enter 方法触发的内容。文档说:
“请注意,
on_enter_«state name»第一次初始化机器时不会触发回调。例如,如果您on_enter_A()定义了回调,并使用 初始化机器initial='A',on_enter_A()则在下次进入状态 A 之前不会触发。(如果您需要确保on_enter_A()触发在初始化时,您可以简单地创建一个虚拟初始状态,然后to_A()在方法内部显式调用__init__。)"
但我不确定我需要在哪里调用它......我创建了一个名为 的类Pool_Controller,然后创建一个Pool_Controller像这样的实例
然后我像这样创建状态机
我需要将to_initial_state()dummy_state 放在哪里才能立即跳转到我的 initial_state 以便on_enter_initial_state在模型初始化时执行?
python - 如何在pytransition的条件函数中传递事件参数
我正在尝试将参数传递给条件。但它给出了以下错误
代码:
错误:
如何与每个回调共享变量 no 和 mod。我尝试使用该事件。在这个简单的示例中,我尝试创建一个状态机,以根据给定输入是偶数还是奇数来达到状态。
python - 在转换中使用 AsyncMachine 和多个对象的正确方法
我正在尝试通过 websockets 实现客户端-服务器应用程序,并且我有几个疑问如何正确地做到这一点以维护每个连接的客户端的状态。
全局机器+每个连接的许多对象?
机器 + 对象 - 每个连接?
所以,我从几个测试开始,检查它是如何同时工作的
基础机
和几种跑步类型
我想让所有模型同时改变它们的状态
但输出是:
如果我创建机器+模型:
输出是:
什么是正确的方法?
更新
我希望每个正在运行的模型都有可用的上下文变量,以便能够正确记录模型调用的其他模块的所有活动,而不是将某些标识符显式传递给每个外部函数调用(outisde 模型类)
参见某种示例https:// pastebin.com/qMfh0kNb,它没有按预期工作,断言触发
python - 嵌套子 FSM 在某些状态下阻止父转换
我正在使用 pytransitions 创建具有许多嵌套子 FSM 的分层状态机。当子 FSM 进入临界状态时,我想抑制父级的转换,直到子级完成它的活动为止。我找不到这种行为的任何参考示例,并希望有人可以就实现这一目标的最佳方法提供建议。
图像嵌套 FSM 示例提供了一个简单的场景。这里父 FSM 处于运行状态,这有一个子 FSM 处于顶部状态。该状态本身有一个子 FSM,它具有关闭或开启状态。我想抑制或忽略第一个孩子和父母 FSM 上的所有转换,在这种情况下,当孩子两个处于“开启”状态时,第一个孩子的“向下”转换和父母的“停止”。您可以想象在更复杂的场景中,父状态或子状态可能会有大量的转换。
关于实现这一目标的好方法的任何想法?
提前致谢,
python - pytransitions/transitions:有没有更好的方法来存储访问状态的历史?
我最近在 Python 中发现了一个轻量级、面向对象的状态机实现,称为转换 ( https://github.com/pytransitions/transitions )。所以我尝试使用这些状态机,尤其是 HierarchicalGraphMachine。我想要的一个很好的功能是即使机器没有移动(保持相同的状态)也可以存储访问状态的历史记录。
而且从我从示例中看到的情况来看,我们实际上无法以简单的方式做到这一点,因为当机器状态未更改时before_state_change,并after_state_change没有调用 and。所以我们不能在这种情况下扩展我们的历史。为了解决这个问题,我最终创建了一个 trigger_wrapper 函数:
然后,我们调用 trigger_wrapper 而不是 trigger:
除此之外,通过设置ignore_invalid_triggers = False何时初始化Machine和使用该trigger_wrapper函数,我们现在可以通过缓存异常来知道机器无法移动的原因。
有没有更好的解决方案来保持跟踪访问状态?我认为另一种方法是覆盖触发功能,但由于NestedState.
编辑1(遵循@aleneum 的建议)
感谢您的回复以及一个有趣的例子!
按照使用finalize_event. 一切顺利,但这个回调函数似乎不足以捕捉以下情况(我在代码中添加了 2 行额外的行):
换句话说,是否有另一个回调可以捕获由调用invalid trigger(goo in the example) 或valid trigger but not reachable from the current state(call go() from state B) 引起的异常?
再次感谢你的帮助。
python - pyTransitions trigger() 方法块
我有一个相当复杂的应用程序,涉及一个 GUI 前端和几个其他类,其中几个是基于优秀pytransitions库的状态机。应用程序在不同的时间挂起,并且是多线程的,很难调试,但我在这里复制了一个最小的例子:
即当machine1“打开”时,它向machine2发送一个信号。machine2 必须等待此信号,然后才能执行其“开启”状态的逻辑。
使用 Python REPL 作为主循环:
machine2 卡在其 while 循环中,等待来自 machine1 的信号,该信号永远不会到达,因为 machine1 从未被触发。
如果我重新排序触发器序列gui.on_button_pressed():
...一切正常:
这里发生了什么?该trigger()方法应该阻止吗?它是否记录在某处,何时返回?还是我on_enter_state以不受支持的方式使用回调?我应该使用推荐的模式吗?
pytransitions - pytransitions,超时,内存,持久化到数据库
关于我目前在我的一个项目中使用的 pyTransitions 包的问题。
在评估不同的软件包时,我在一开始就进行了测试,其中还有我知道我在未来某个地方需要的超时功能。
然后我一点一点地选择使用 sqlalchemy 将我所有的有限状态机(实际上只是一个 id 和状态)持久化到磁盘上,并且只在需要触发转换时才重新加载它们——效果很好。
不幸的是,现在又需要超时处理,甚至在尝试将其集成到我的代码中之前,我很确定这对我不起作用。我想我说的是显而易见的:为了在一组(可能更大的)fsms 上正确处理超时,它们必须作为活对象存在于内存中,而不仅仅是从数据库中加载?
这是您已经作为用例遇到过的东西吗?是否有某种方法也可以访问此超时计数器,以便在任何时候通过适当的修复来持久化和重新加载它,以允许超时机制恢复正常,即使对象在 RAM 中没有存在时也是如此实际超时?
如果没有简单的内置替代方案,我想我会在 RAM 中创建一个常驻对象池,定期保存它们并在我的应用程序出现故障时重新加载它们?(我的具体场景使用 sqlalchemy,但我想这同样适用于泡菜)
提前为任何想法或建议欢呼和感谢乔尔
pytransitions - HierarchicalGraphMachine hiding nested states
I've been experimenting with the HierarchicalGraphMachine class to help visualise the machine structures as I edit them.
This generates the expected graphic showing both the parent and nested states in full (I'm not yet authorised to upload the graphics). Is there a way to generate a the full parent state machine graphic without expanding the nested states? For example reducing the nested states to an empty box.
I've tried "show_roi=True", but this only shows the current transition event, and removes all other states.
python - 如何将参数传递给`transitions`库中的on_enter回调?
我想使用transitions,并且需要一个我在文档中找不到的相当微不足道的功能,并且想知道它是否已实现:
我想on_enter在某个状态上定义一个回调,但将一个参数传递给该回调。至少要知道我是从哪个州进入的。
从文档:
我缺乏的是
这可以以某种方式很好地完成吗?
一个明显不好的解决方案是保留一个self._last_state论点并自己坚持下去。
我正在寻找内置的东西。
python - 如何委托监听“转换”状态机的进入状态?
我想将监听on_enter事件委托给所有状态,并创建几个这样的监听器,它们可以订阅并在进入状态时收到通知。
就我而言,我想通知外部事件系统根据状态订阅不同的事件配置。
对于这个例子,我将使用一个状态机(比如固体<->流体<->气体事件[热,冷])。
这可以很容易地使用这样的库来完成
伟大的!现在,我想通过订阅事件向外部通知。
我想以一种至少将外部世界与机器内部耦合的方式来做到这一点,这样如果我要更改状态名称,或者添加或删除状态,我就不用担心破坏任何用户机器。on_enter
我可以做到这一点的一种方法如下,它的缺点是与机器内部耦合,并迫使我自己实现库的许多功能。
这允许为任何状态添加外部回调。
根据这里的评论,上面应该有一些更好的 API 来动态添加每个状态的订阅,但我无法在文档中找到它。
即使图书馆确实可以做到这一点,我认为这还不够。
任何订阅者都必须知道机器的状态才能订阅 <on_enter> 它们,而不是简单地成为机器上的侦听器,并实现任何要通知它发生的事件,就像一个人可以轻松地添加一个on_enter_solidjust通过“固体”状态的存在。
我最理想的做法是拥有一些我可以继承(或以其他方式)的监听器类,并且只在外部实现我需要监听的方法。
使用该库完成此操作或类似操作的最佳方法是什么?