2024-10-01 09:31:35 发布
网友
我已经创建了许多被分成不同文件的函数,现在我想对所有这些函数应用同一个装饰器,而不需要修改文件,也不需要逐个应用装饰器。在
我尝试过使用由delnan编写的this explanation,但是对于导入的函数我没有成功。在
关于decorator,它必须在每次用函数参数和值执行类中的函数时更新一个列表,就像我要求的this other question。在
有什么建议可以帮我解决这个问题吗? 谢谢
稍微反省一下(^{})和使用^{}和^{}进行动态查找。在
首先,我们迭代在module和check for objects that look like functions中找到的所有名称。之后,我们简单地用装饰过的函数重新分配旧函数。在
主.py:
import types import functools def decorate_all_in_module(module, decorator): for name in dir(module): obj = getattr(module, name) if isinstance(obj, types.FunctionType): setattr(module, name, decorator(obj)) def my_decorator(f): @functools.wraps(f) def wrapper(*args, **kwargs): print(f) return f(*args, **kwargs) return wrapper import mymod1 decorate_all_in_module(mymod1, decorator)
mymod1.py:
输出:
<function f at 0x101e309d8> 2 <function g at 0x101e30a60> 7
如果使用星型导入(from mymod import *),过程就不会那么顺利。原因很简单-因为所有的名字都放在一个大袋子里,它们来自哪里没有区别,你需要很多额外的技巧来找到你想要修补的东西。但是,这就是为什么我们使用名称空间-because they are one honking great idea。在
from mymod import *
稍微反省一下(^{} )和使用^{} 和^{} 进行动态查找。在
首先,我们迭代在module和check for objects that look like functions中找到的所有名称。之后,我们简单地用装饰过的函数重新分配旧函数。在
主.py:
mymod1.py:
^{pr2}$输出:
如果使用星型导入(
from mymod import *
),过程就不会那么顺利。原因很简单-因为所有的名字都放在一个大袋子里,它们来自哪里没有区别,你需要很多额外的技巧来找到你想要修补的东西。但是,这就是为什么我们使用名称空间-because they are one honking great idea。在相关问题 更多 >
编程相关推荐