用装饰器修补模块中的所有函数

Pau*_*aul 4 python

我有一个带有很多函数的 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)

Jos*_*ley 5

我真的不确定这是一个好主意。毕竟,显式优于隐式。

话虽如此,类似这样的事情应该可以工作,使用检查来查找模块的哪些成员可以被装饰并使用__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)