搜索
首页后端开发Python教程在人工智能工具的帮助下构建状态机库

出于无聊,在等待后续面试时,我构建了一个由 genruler 提供支持的状态机库。准确地说,是我毕业后第一份工作期间建造的。这个实现大致是基于我的主管当时起草的设计。该项目还旨在展示如何利用规则 DSL。

根据谷歌搜索有限状态机返回的有用摘要(强调我的)

“有限状态机”是指一种计算模型,其中系统在任何给定时间只能处于有限数量的不同状态,并且这些状态之间的转换由特定输入触发,本质上允许它根据一组定义的条件处理信息,不可能有无限数量的状态; “有限”这里指的是系统可以存在的有限的一组可能状态

该库接收一个表示有限状态机模式的字典。比如我们要建立一个订单追踪系统

Building state machine library with help from AI tools
Graphviz 生成的有限状态机图

架构看起来像这样(为了清晰起见,采用截断的 YAML 形式)

machine:
  initial_state: pending_payment

states:
  pending_payment:
    name: pending payment
    transitions:
      order_authorization:
        name: order is authorized
        destination: authorized
        rule: (condition.equal (basic.field "is_authorized") (boolean.tautology))

  authorized:
    name: authorized
    action: authorize_order
    transitions:
      order_partially_paid:
        name: order is partially paid
        destination: partially_paid
        rule: (boolean.tautology)
      order_fully_paid:
        name: order is fully paid
        destination: paid
        rule: (boolean.tautology)

    ...

因此,为了设置一切,我们调用

import genstates
import yaml
import order_processor

with open("states.yaml") as schema:
  machine = genstates.Machine(yaml.safe_load(schema), order_processor)

因此,在这个虚构的示例中,每当订单发生变化时,我们都会收到一些有效负载。例如,当卖家确认订单时,我们得到

{
  "is_authorized": true,
  ...
}

我们可以通过图书馆查一下

state = machine.initial # assume the order is created

transition = machine.get_transition(state, "order_authorization")

assert transition.check_condition(payload)

如果在架构中定义,该检查还会运行额外的验证检查。如果您打算向调用者返回错误消息,这会很有帮助。

try:
  assert transition.check_condition(payload)
except ValidationFailedError as e:
  logger.exception(e)

有时,我们知道每次有效负载到达时,它都应该触发一次转换,但我们并不总是知道是哪一个。因此,我们只需将其传递给 Machine.progress

try:
  state = machine.progress(state, payload)
except ValidationFailedError as e:
  logger.exception(e)

一旦知道订单应该进展到什么状态,我们就可以开始编写代码来处理逻辑

# fetch the order from database
order = Order.get(id=payload["order_id"])
current_state = machine.states[order.state]

# fetch next state
try:
    new_state = machine.progress(current_state, payload)
except ValidationFailedError as e:
    # validation failed, do something
    logger.exception(e)
    return
except MissingTransitionError as e:
    # can't find a valid transition from given payload
    logger.exception(e)
    return
except DuplicateTransitionError as e:
    # found more than one transition from given payload
    logger.exception(e)
    return

# do processing (example)
log = Log.create(order=order, **payload)
log.save()

order.state = new_state.key
order.save()

理想情况下,我还可以提取处理逻辑,这就是我一开始导入 order_processor 的原因。在授权状态定义中,我们还定义了一个action

authorized:
    name: authorized
    action: authorize_order
    ...

因此在 order_processor 模块中,我们定义了一个新函数,名为authorized_order

def authorize_order(payload):
    # do the processing here instead
    pass

这样,以下情况是可能的,其中状态管理代码与其余处理逻辑分离

machine:
  initial_state: pending_payment

states:
  pending_payment:
    name: pending payment
    transitions:
      order_authorization:
        name: order is authorized
        destination: authorized
        rule: (condition.equal (basic.field "is_authorized") (boolean.tautology))

  authorized:
    name: authorized
    action: authorize_order
    transitions:
      order_partially_paid:
        name: order is partially paid
        destination: partially_paid
        rule: (boolean.tautology)
      order_fully_paid:
        name: order is fully paid
        destination: paid
        rule: (boolean.tautology)

    ...

不过,我现在仍在努力,应该会在下一个版本中实现。同时,如果每个状态都定义了操作,它还能够执行类似于map和reduce的操作。请随时检查项目的开发进度。 genruler 和 genstates 现在都在 PyPI 上,耶!

现在,人工智能怎么样?

在库有点用后我下载了 Codeium Windsurf。我最终使用它从 genruler 中去除了 hy 依赖,并向项目添加了文档和自述文件。对于发电机状态,我使用级联来生成文档、自述文件以及测试。总的来说,感觉我身边有一个中高级程序员来帮助我完成分配给实习生甚至初级员工的任务。

大部分核心逻辑仍然来自我这边,尽管目前的语言模型已经很智能了,但他们仍然会犯一些错误,因此需要监督。我还尝试了 qwen2.5-coder:7b 模型,它运行得相当好,尽管由于我的工作站蹩脚,速度相当慢。我发现如果我要构建自己的产品并设法从中赚钱,Codeium 要求的价格是公平的。

虽然生成部分工作正常,但编写实际代码并不那么好。我不确定 Pylance 是否在那里正常工作,认为它是专有的,或者是否是由于完成魔法 Windsurf 所做的,我的编辑器在我编写代码时不再能够自动导入库。例如,当我在代码中自动完成 reduce() 函数时,在 vscode 中它会自动将 from functools import reduce 插入到我的代码中。然而,风帆冲浪却并非如此,这使得它有点令人恼火。然而,考虑到这是新的,编码体验应该随着时间的推移而修复。

另一方面,我仍在寻找一个更轻的编辑器,zed 确实引起了我的注意。然而,由于我的 Surface Book 2 最近坏了,当我离开家庭办公室时,我只剩下三星 Galaxy Tab S7FE。因此,连接到我的工作站的具有 Web 前端(而且非常有用)的 vscode 仍然是我的主要编辑器(它甚至可以与 neovim 扩展一起使用)。

由 LLM 提供支持的生成式人工智能正在迅速改变我们的生活,没有理由抗拒它。然而,恕我直言,我们也应该有一些自我克制,不要把它用于所有事情。它确实应该用作创新或创造性工作的补充,而不是创新和创造力的替代品。

我们也应该知道它在输出什么,而不是盲目接受它做了什么。例如,在 genruler 中,我用更广泛的示例改进了我原来的自述文件。我没有按原样接受它,而是让它为自述文件中生成的所有示例生成测试,因此示例代码通过并按我的预期工作。

总的来说,是的,我确实认为这些生成式人工智能增强编辑器确实物有所值。归根结底,这些都是工具,它们的目的是为工作提供帮助,而不是取代敲键盘的人。

以上是在人工智能工具的帮助下构建状态机库的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Python:编译器还是解释器?Python:编译器还是解释器?May 13, 2025 am 12:10 AM

Python是解释型语言,但也包含编译过程。1)Python代码先编译成字节码。2)字节码由Python虚拟机解释执行。3)这种混合机制使Python既灵活又高效,但执行速度不如完全编译型语言。

python用于循环与循环时:何时使用哪个?python用于循环与循环时:何时使用哪个?May 13, 2025 am 12:07 AM

useeAforloopWheniteratingOveraseQuenceOrforAspecificnumberoftimes; useAwhiLeLoopWhenconTinuingUntilAcIntiment.ForloopSareIdeAlforkNownsences,而WhileLeleLeleLeleLoopSituationSituationSituationsItuationSuationSituationswithUndEtermentersitations。

Python循环:最常见的错误Python循环:最常见的错误May 13, 2025 am 12:07 AM

pythonloopscanleadtoerrorslikeinfiniteloops,modifyingListsDuringteritation,逐个偏置,零indexingissues,andnestedloopineflinefficiencies

对于循环和python中的循环时:每个循环的优点是什么?对于循环和python中的循环时:每个循环的优点是什么?May 13, 2025 am 12:01 AM

forloopsareadvantageousforknowniterations and sequests,供应模拟性和可读性;而LileLoopSareIdealFordyNamicConcitionSandunknowniterations,提供ControloperRoverTermination.1)forloopsareperfectForeTectForeTerToratingOrtratingRiteratingOrtratingRitterlistlistslists,callings conspass,calplace,cal,ofstrings ofstrings,orstrings,orstrings,orstrings ofcces

Python:深入研究汇编和解释Python:深入研究汇编和解释May 12, 2025 am 12:14 AM

pythonisehybridmodelofcompilationand interpretation:1)thepythoninterspretercompilesourcececodeintoplatform- interpententbybytecode.2)thepytythonvirtualmachine(pvm)thenexecuteCutestestestesteSteSteSteSteSteSthisByTecode,BelancingEaseofuseWithPerformance。

Python是一种解释或编译语言,为什么重要?Python是一种解释或编译语言,为什么重要?May 12, 2025 am 12:09 AM

pythonisbothinterpretedAndCompiled.1)它的compiledTobyTecodeForportabilityAcrosplatforms.2)bytecodeisthenInterpreted,允许fordingfordforderynamictynamictymictymictymictyandrapiddefupment,尽管Ititmaybeslowerthananeflowerthanancompiledcompiledlanguages。

对于python中的循环时循环与循环:解释了关键差异对于python中的循环时循环与循环:解释了关键差异May 12, 2025 am 12:08 AM

在您的知识之际,而foroopsareideal insinAdvance中,而WhileLoopSareBetterForsituations则youneedtoloopuntilaconditionismet

循环时:实用指南循环时:实用指南May 12, 2025 am 12:07 AM

ForboopSareSusedwhenthentheneMberofiterationsiskNownInAdvance,而WhileLoopSareSareDestrationsDepportonAcondition.1)ForloopSareIdealForiteratingOverSequencesLikelistSorarrays.2)whileLeleLooleSuitableApeableableableableableableforscenarioscenarioswhereTheLeTheLeTheLeTeLoopContinusunuesuntilaspecificiccificcificCondond

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用