使用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
相关产品推荐
相关产品推荐

