Python使用函数装饰器跨文件向列表追加函数失效如何解决?
问题原因
- 未导入
module1.py模块:Python装饰器仅在被装饰函数的定义阶段执行,run.py当前只导入了add.py,没有导入module1.py,因此module1.py中hello函数的装饰逻辑完全没有触发,不会向add.functions列表写入内容。 - 装饰器逻辑错误:你当前将
functions.append(f)写在了wrapper内部,这行代码只会在调用被装饰后的函数时才会执行,不符合你「装饰阶段就将函数加入列表」的预期。
修复方案
- 调整
add.py的装饰器逻辑,将函数追加操作移到wrapper外层,确保装饰执行时就把目标函数加入列表:
functions = [] # 将函数"f"追加到"functions"列表中,在run.py中导入该文件即可任意访问此列表 def foo(f): functions.append(f) def wrapper(): value = f() return value return wrapper
- 修改
run.py,新增module1的导入语句,触发装饰器执行:
import add import module1 print(add.functions) # 执行下标为0的函数,预期控制台输出"hello" add.functions[0]()
运行验证
修改后执行run.py,输出如下,符合预期效果:
[<function hello at 0x某内存地址>] hello
内容的提问来源于stack exchange,提问作者user16073849
相关产品推荐
相关产品推荐

