如何实现每次调用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
相关产品推荐
相关产品推荐

