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

从PLY迁移到SLY后,遍历集合触发AttributeError问题咨询

解决SLY Lexer中遍历集合触发"Name transition redefined"错误的问题

问题根因

SLY的Lexer元类(LexerMeta)在创建类时会扫描所有类级别的属性,不允许重复定义同名属性。你在HeroLabLexer类定义内部写的for循环,每次迭代都会把循环变量transition当作类属性来处理——第一次迭代时元类记录了transition这个属性,第二次迭代时相当于要重新定义它,直接触发了重定义的错误,这和你在循环里执行tokens.add()还是print()无关,问题出在循环变量本身被重复注册为类属性。

解决方案

把tokens的初始化逻辑移到类定义外面,先处理好完整的tokens集合,再赋值给类的tokens属性:

from transitions import transition_set, reference_set
from sly import Lexer

# 预先在类外处理所有transition,生成完整的tokens集合
tokens = set()
for transition in transition_set:
    tokens.add(transition)

class HeroLabLexer(Lexer):
    # 直接使用预先生成好的tokens集合
    tokens = tokens

    # 后续添加你的词法规则...

补充说明

如果还有其他初始token需要添加,可以直接在类外的tokens集合里一并处理,比如:

tokens = {'OTHER_TOKEN1', 'OTHER_TOKEN2'}
for transition in transition_set:
    tokens.add(transition)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:40:54