You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pytransitions报错ValueError: state is not a registered state如何解决

问题原因

错误是列表元素遗漏逗号导致的语法问题:你定义states列表时,size_selected末尾没有加逗号,Python会自动将相邻的两个无分隔符的字符串拼接,实际注册的状态里没有单独的size_selected,而是生成了不存在的拼接字符串size_selectedwait_for_payment,所以触发状态未注册的报错。

修复方案
  • 第一步:补全states列表的逗号,修正后的状态定义如下:
states = ['asleep',
          'wait_for_size',
          'size_selected', # 此处补全遗漏的逗号
          'wait_for_payment',
          'payment_selected',
          'wait_for_confirmation',
          'confirmed']
  • 第二步:移除重复的过渡规则,你已经在类属性中定义了transitions规则,初始化Machine时可以直接传入参数,不需要重复调用add_transition添加,避免规则冲突,简化后的初始化代码如下:
def __init__(self, name):
    self.name = name
    self.pizza_orders = 0
    self.machine = Machine(model=self,
                           states=TelegramBot.states,
                           transitions=TelegramBot.transitions, # 直接传入预定义的过渡规则
                           initial='asleep')
  • 第三步:建议调整命名规则,避免触发动作名和状态名重名,比如将触发动作统一改为trigger_xxx类的命名,降低逻辑混淆的概率。
修复验证

调整后运行代码输出正常:

asleep
size_selected

内容的提问来源于stack exchange,提问作者boldRichard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:54:04