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

Python SLY开发自定义语言如何实现仅调用say函数才打印变量

问题原因

现在自动打印的逻辑来自两个设计的叠加:

  1. Parser中定义了expr可以直接作为statement,单独一行的变量x会被解析为合法的表达式语句返回
  2. Execute类的初始化逻辑中,无论执行的是什么类型的语句,只要walkTree返回非空的数字、字符串、布尔值,就会自动打印结果

解决方案

方案1:仅修改执行逻辑(保留表达式语句语法,不自动打印)

修改NoobpyExecute类的__init__方法,仅当根语句是say类型时才执行打印,其他语句仅执行逻辑不打印返回值:

class NoobpyExecute:
    def __init__(self, tree, variables):
        self.variables = variables
        # 仅say语句需要打印结果
        if tree and isinstance(tree, tuple) and tree[0] == 'say':
            result = self.walkTree(tree)
            if result is None:
                pass
            elif type(result) in [int, float]:
                print(result)
            elif isinstance(result, str):
                print(result)
            elif isinstance(result, bool):
                print("true" if result else "false")
        else:
            # 其他语句仅执行逻辑,忽略返回值不打印
            self.walkTree(tree)

修改后单独写x不会触发打印,只有调用say x时才会打印变量值,同时保留了表达式作为其他语句组成部分的正常逻辑。

方案2:语法层面禁用单独表达式语句(更严格的语法规则)

如果不希望用户可以写单独的表达式作为一行语句,可以直接删除NoobpyParser类中如下的规则定义:

@_('expr')
def statement(self, p):
    return p.expr

删除后用户写单独的x会直接触发语法错误,从根源上避免自动打印的问题,适合想要强语法校验的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:45:03