我有一个带有很多函数的 python 模块,我想为所有函数应用一个装饰器。有没有一种方法可以通过猴子修补来修补所有这些,以便为每个函数应用这个装饰器,而无需在应用装饰器的行上复制粘贴?
换句话说,我想替换这个:
@logging_decorator(args)
func_1():
pass
@logging_decorator(args)
func_2():
pass
@logging_decorator(args)
func_3():
pass
@logging_decorator(args)
func_n():
pass
Run Code Online (Sandbox Code Playgroud)
有了这个:
patch_func():
# get all functions of this module
# apply @logging_decorator to all (or not all) of them
func_1():
pass
func_2():
pass
func_3():
pass
func_n():
pass
Run Code Online (Sandbox Code Playgroud)
我真的不确定这是一个好主意。毕竟,显式优于隐式。
话虽如此,类似这样的事情应该可以工作,使用检查来查找模块的哪些成员可以被装饰并使用__dict__来操作模块的内容。
import inspect
def decorate_module(module, decorator):
for name, member in inspect.getmembers(module):
if inspect.getmodule(member) == module and callable(member):
if member == decorate_module or member == decorator:
continue
module.__dict__[name] = decorator(member)
Run Code Online (Sandbox Code Playgroud)
使用示例:
def simple_logger(f):
def wrapper(*args, **kwargs):
print("calling " + f.__name__)
f(*args, **kwargs)
return wrapper
def do_something():
pass
decorate_module(sys.modules[__name__], simple_logger)
do_something()
Run Code Online (Sandbox Code Playgroud)