问题标签 [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.

0 投票
1 回答
503 浏览

python - 在 transitions.Machine 模型的“之前”回调中引发异常是否安全?

我正在使用转换FSM 库。想象一下使用以下代码有一个应用程序 FSM:

它可以IOError在 load_data 内抛出一个。before我的问题是从回调中引发异常(在本例中隐式或显式)是否安全?如果IOError没有发生转换,则此示例的状态保持不变,并且不会调用idle任何回调。after但是,我想知道机器实例的内部状态是否会损坏。

附加问题:有没有更好的方法向应用程序发出带有具体信息的错误信号?在这个例子中,我可以使用条件来加载文件,但这看起来很难看,我需要一些额外的属性来跟踪错误等。

感谢您的任何帮助或建议。

0 投票
1 回答
557 浏览

python - pytransitions 中的 get_triggers() 未返回预期输出

我正在使用 pytransitions 库(在此处记录)来实现有限状态机。概述的功能之一是能够获取特定状态的触发器列表。这是根据文档的示例:

这是我尝试运行的代码示例:

预期输出:

获得的输出:

查看文档中给定的示例,我应该只返回“git commit”。这就是我正在寻找的功能。

在此先感谢您的帮助!

0 投票
1 回答
512 浏览

python - pytransitions 的内部转换是否有效

我正在尝试使用 pytransitions 0.6.4 版的内部转换功能,但它对我不起作用。我收到一个错误

我在这里调整了代码

但后来它在其他地方出错了,所以我不确定这个功能是否已知有问题。

我正在用一个dicts列表初始化机器作为它的transitions kwarg。一个 dict 的示例是,我相信这是正确的格式。

虽然文档只显示了使用 add_transition 方法添加的转换,如下所示

任何人都可以评论内部转换功能吗?

谢谢,约翰

0 投票
1 回答
709 浏览

python - Pytransitions 中的嵌套

我一直在 github、SO 和谷歌搜索上查看已解决的问题以解决此问题。但我无法解决我的问题,这似乎是正确的地方。我已经在 github 上打开了一个问题,但我不确定这是否是正确的做法。我正在制作一个可以包含多个子状态的状态机,这些子状态也是所有状态机。因此,这基本上归结为根据自述文件重用 HSM 。

我最高级别的 SM 是这样的:

如您所见,状态机具有三个状态initrunningstop。一旦e_run()通过类似的方式发送事件

机器转换到running状态。

我以间接的方式这样做,因为我希望事情自动发生。e_run()导致转换running并随后run_machine调用initialize运行类的方法,该方法触发一个事件以启动事件链。下面我展示running了这一切。

所以运行状态定义为

它类似于它的父状态,由几个状态和几个子状态组成。我还启用了日志记录以查看我进入和退出的状态。根据我的经验,嵌套状态机非常有用,因为您可以重用之前编写的状态。此外,随着您的状态机的增长,它有助于使事情更加模块化。因此,任何状态都不会变得庞大且难以阅读/理解。

所以不寻常的行为是,当e_run()被调用时,我得到了

如你所见

尽管

我当然可以将转换定义移动到父状态,但这并不方便。我不能对所有子州都这样做。显然,我希望每个子状态对自己的行为负责。这里的常见做法是什么?这是错误还是预期行为?

如何将状态机整齐地嵌套在彼此之下?

0 投票
2 回答
351 浏览

python - Pytransitions:是否可以更改机器在模型中注入的模型属性?

我正在将pytransitions状态机改装到现有模型中,该模型恰好已经有一个名为status.

我注意到转换库注入了一个state字段,但我不确定是否有办法将该字段更改为我的模型status列并让转换反映在该特定字段上。如果目前没有办法,我正在考虑使用machine.after_state_change回调并从那里开始工作。

除了(ab)使用该特定回调之外,什么是体面的解决方法?

0 投票
1 回答
663 浏览

python - 如何正确组合 PySide2 和 pytransitions 以实现 GUI 应用程序的状态机

背景:我想使用 PySide2 实现一个 GUI 来控制一堆客户端(通过 RPC 调用与“服务器”控制硬件,如电机、相机等)。

以前的方法:通常,我要做的是创建我的 GUI 并将 UI 信号连接到客户端插槽,反之亦然。这对于更简单的应用程序非常有效。

问题:我希望我的 GUI 能够正确地表示允许的对客户端的调用。最简单的例子:执行后client1.doXY()我想禁用执行该命令的按钮并仅在doZY()完成后重新激活它。虽然使用上述方法完全可以做到这一点,但当事情变得更复杂时会感觉不对:例如,当 GUI 元素依赖于多个客户端的状态时。

方法:因此,我认为使用有限状态机作为客户端和 GUI 之间的中间层是一个好主意,并且遇到了pytransitions,这看起来很有希望。但是,我正在努力寻找结合这两个世界的正确方法。

问题:

  • 一般来说,这是拥有这样一个层的有效设计方法吗?

  • 特别是如工作代码示例中所示,我必须将客户端移动到单独的线程以避免在客户端执行阻塞调用时 GUI 冻结。虽然我的代码工作正常,但它需要一些开销来创建额外的 qt 信号来连接ClientStateClient对象。这可以更优雅地完成(即没有额外的 xy_requested 信号,但以某种方式直接调用仍然调用线程中的ClientState函数而不是主线程的函数?ClientClientClient

工作示例:

运行状态机

代码:

0 投票
1 回答
332 浏览

python - Telebot + Celery + pytransitions:对任务的响应

我想在延时后使用 Celery 发送一些消息。用户收到消息后,触发新的状态。为此,我需要将 telebot.types.Message 对象作为 Celery 任务中的参数发送。我怎样才能正确地做到这一点?

我启动 Celery 任务的转换功能:

芹菜任务:

send_random_motivation_message()我需要 telebot.types.Message 作为 self.response,但不能将此类型发送到 Celery 任务。

0 投票
1 回答
590 浏览

python - 使用 Pytransitions 时没有关于触发器的建议

尝试transitions按照此处提供的示例使用包https://github.com/pytransitions/transitions

出于某种原因,下面显示的两种方法都没有提供注册evaporate()触发器的输入建议(至少在 PyCharm 2019.1.2 for Windows x64 中)

同时,这些触发器仍然可以使用。

可以做些什么来在我键入时建议这些触发器?

0 投票
1 回答
175 浏览

python - 模型已经包含一个属性“触发器”。跳过绑定

我想为我的Order模型实现状态机,我正在使用这个漂亮的 pytransitions库。但我正面临这个奇怪的问题。

这是我order.py的模型:

这是我的order_state_machine.py

当我这样做时:

它,new_order.pay()线,给了我TypeError: 'NoneType' object is not callable错误。还有一个Model already contains an attribute 'trigger'. Skip binding.警告,还有很多这样的警告。

有人可以帮我解决这个问题,可能是图书馆的维护者。谢谢。

0 投票
1 回答
48 浏览

python-3.x - 将 DMXPY 与转换状态机一起使用

我正在尝试将DmxPy与用Transitions编写的状态机一起使用,但尝试将 DmxPy 传递给有限状态机会引发元类错误。似乎 DmxPy 的输出是一个 Nonetype ,它不在转换状态机中运行。

有谁知道如何使以下简单的、不起作用的脚本工作或根据我们所处的状态使灯亮起的变体?

以上是简单的,但运行它会

或者

Transitions 状态机代码示例,非功能代码是

从上面的代码中,我收到一个TypeError: metaclass conflict,当我检查 DmxPy 运行代码的类型时,它告诉我它是一个<class 'NoneType'>.

那么,如何使用 FSM 中的 DmxPy 代码根据 FSM 的状态更改灯光?或者,有人有更好的主意吗?