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

如何实现每次调用commands变量时执行symbols_list函数?

问题描述

当前代码中,symbols_list1与symbols_list2仅在初始化Bot1Console.commands时被执行一次,无法在每次访问commands时更新返回值。需要实现每次调用commands变量时,都重新执行这两个函数。

原代码:

Bot1Console = ConsoleDialog()

sl1 = ["arg61a", "arg61b", "arg61c"]
def symbols_list1():
    l = [str(symbol).lower() for symbol in sl1]
    return l

sl2 = ["arg70a", "arg70b", "arg70c"]
def symbols_list2():
    l = [str(symbol).lower() for symbol in sl2]
    return l

Bot1Console.commands = [
    # 所有字符串必须为小写
    ["help"],                           # 00 帮助:列表中的第一个元素
    ["arg10", "arg11"],                 # 01 两个参数
    ["arg20", ["arg21a", "arg21b"]],    # 02 包含两个选项的参数
    ["arg30", [float, "arg31b"]],       # 03 包含两个选项的参数
    ["arg40", str, float],              # 04 类型为str、float
    ["arg50", float, str],              # 05 类型为float、str
    ["arg60", symbols_list1],           # 06 使用函数返回值的参数
    [symbols_list2, "arg71"],           # 07 使用函数返回值的参数
    ["arg80", "arg81"],                 # 08 参数
    ["append", str],                    # 09 追加至arg60
    ["exit"]                            # 10 退出:列表中的最后一个元素
]

解决方案

方法1:将commands改为动态属性(推荐)

通过给Bot1Console对象绑定动态属性,让每次访问commands时都重新生成命令列表,确保两个函数被实时执行。

修改后代码:

Bot1Console = ConsoleDialog()

sl1 = ["arg61a", "arg61b", "arg61c"]
def symbols_list1():
    l = [str(symbol).lower() for symbol in sl1]
    return l

sl2 = ["arg70a", "arg70b", "arg70c"]
def symbols_list2():
    l = [str(symbol).lower() for symbol in sl2]
    return l

# 定义动态属性逻辑,每次访问都会重新生成命令列表
@property
def dynamic_commands(self):
    return [
        ["help"],
        ["arg10", "arg11"],
        ["arg20", ["arg21a", "arg21b"]],
        ["arg30", [float, "arg31b"]],
        ["arg40", str, float],
        ["arg50", float, str],
        ["arg60", symbols_list1()],  # 实时调用函数获取最新值
        [symbols_list2(), "arg71"],  # 实时调用函数获取最新值
        ["arg80", "arg81"],
        ["append", str],
        ["exit"]
    ]

# 将动态属性绑定到Bot1Console对象
import types
Bot1Console.commands = types.MethodType(dynamic_commands, Bot1Console)
  • 核心修改:把原代码中传入函数对象的写法symbols_list1改为直接调用函数symbols_list1(),确保每次生成列表时都执行函数;通过@property和动态绑定实现commands的实时生成。
  • 外部调用方式不变,依然可以用Bot1Console.commands获取最新命令列表。

方法2:用函数封装命令列表生成逻辑

如果无法修改Bot1Console的属性结构,可将命令列表的生成逻辑封装到函数中,每次需要使用时调用函数获取最新结果。

修改后代码:

Bot1Console = ConsoleDialog()

sl1 = ["arg61a", "arg61b", "arg61c"]
def symbols_list1():
    l = [str(symbol).lower() for symbol in sl1]
    return l

sl2 = ["arg70a", "arg70b", "arg70c"]
def symbols_list2():
    l = [str(symbol).lower() for symbol in sl2]
    return l

def get_latest_commands():
    # 每次调用都重新生成命令列表,执行两个函数
    return [
        ["help"],
        ["arg10", "arg11"],
        ["arg20", ["arg21a", "arg21b"]],
        ["arg30", [float, "arg31b"]],
        ["arg40", str, float],
        ["arg50", float, str],
        ["arg60", symbols_list1()],
        [symbols_list2(), "arg71"],
        ["arg80", "arg81"],
        ["append", str],
        ["exit"]
    ]

# 后续使用命令列表时,调用函数获取最新版本
# 示例:Bot1Console.process_commands(get_latest_commands())
  • 核心修改:将原有的命令列表赋值逻辑移到函数内部,每次调用函数都会重新执行symbols_list1和symbols_list2。
  • 需要修改原有调用commands的代码,改用get_latest_commands()获取最新列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:50:24