异步行为树

async-btree的Python项目详细描述


概述

python的异步行为树

Unix Build StatusCoverage StatusCodacy BadgeScrutinizer Code QualityPyPI VersionPyPI License

以下版本Semantic Versioning

什么是行为树?

Unlike a Finite State Machine, a Behaviour Tree is a tree of hierarchical nodes that controls the flow of decision and the execution of "tasks" or, as we will call them further, "Actions". -- behaviortree

如果您的新的(或不是)关于行为树,您可以花一些时间在这几个链接上:

少数实现库:

为什么另一个图书馆如此?

当你学习行为树实现,反应节点,动态变化,运行时执行等等的时候… 现在,您或多或少地构建了一个类似于求值器“eval/apply”或编译器的东西,它有一个复杂的类层次集。 所有的复杂性都来自于内部状态管理,使用黑板树来避免全局变量、多线程问题、可能很少的回调等等。 这打破了你最初设计的简单和美丽。

我发现什么对行为树有用:

  • 表达清晰
  • 节点树表示法
  • 重复使用行为的可能性
  • 添加外部度量以动态改变行为,这是可观察模式的第一步…

由于我已经使用oop多年(很长一段时间了),我会尽量避免使用类树,更喜欢使用函数编程的能力来获得我想要的东西:在语义结构上添加元数据,处理闭包,在参数或返回值中使用函数……

最后一个更个人化的原因是,我将探讨python的表现力。

因此,在本模块中,我将使用协程的概念及其机制来管理执行流。 这样:

  • 我们重用简单的语言习惯用法来管理状态、参数等
  • 对动作执行没有设计限制
  • 大多数语言构建块都可以重用

您可以构建这样的表达式:

asyncdefa_func():"""A great function"""return"a"asyncdefb_decorator(child_value,other=""):"""A great decorator..."""returnf"b{child_value}{other}"assertrun(decorate(a_func,b_decorator))=="ba"

此表达式对函数a_func应用b_decorator。 注意decorate(a_func, b_decorator)不是异步函数,只有操作或条件是异步函数。

这一实施的几条准则:

  • 为了模拟所有的nodestatus(成功、失败、运行),我将其替换为评估值的真实/错误含义。 一个特殊的专用异常修饰标准异常,以便给它们一个错误的含义。
  • 黑板模式,作为行为树上下文变量的管理器。 请用Python3…只需使用contextvars
  • 为了能够构建语义树,我在函数实现中引入了一个元数据元组。

剩下的只是实现细节。

一个小提示:

You should not use this until you're ready to think about what you're doing :)

关于“异步”框架的说明

当我们使用异步函数作为底层机制来管理执行流时,标准库asyncio非常好。 但是,你应该读一下Nathaniel J.Smith写的[Amazing Blog Post}(https://vorpus.org/blog/some-thinks-on-asynchronous-api-design-in-a-post-asyncAwait-world/)。 下一步深入研究curio框架。

正如古董所说:

Don't Use Curio if You're Allergic to Curio

就个人而言,经过几次测试和阅读古玩代码,我相当上瘾。

设置

要求

  • Python3.7+

安装

将此库直接安装到激活的虚拟环境中:

$ pip install async-btree

或者将其添加到您的Poetry项目:

$ poetry add async-btree

用法

安装后,可以导入包:

$ python
>>> import async_btree
>>> async_btree.__version__

贡献

你可以在投稿页找到所有信息。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何从同步请求中获取响应代码   具有深度复制的类中的Java oop getter/setter   java LDAP“简单”用户身份验证(JNDI Tomcat)不稳定?   java将Jenkins jnlp代理设置为通过API以编程方式使用WebSocket   java如何获取在servlet筛选器的静态块中启动的静态类的实例?   前两个数字的java charAt循环不能循环它   java在Spring引导执行器中是否有检查子服务运行状况的标准方法?   java我可以将jacksonmapped@JsonProperties推到“顶层”吗?   json JAVA:opencsv随机读取CSV单元格   无第三方应用程序的java捆绑包JRE   使用openidConnectClient功能的WAS Liberty中出现java无效cookie标头错误   java如何在Restful Web服务中从Http Post获取数组?   java如何读取安卓开发的JSON url?   如何在java IO中打开包含汉字的文件?