Python内省

Dmi*_*riy 5 python

是否可以将导入模块中的代码应用到导入模块的模块中?例如,我有模块Debug,其中定义了一些用于调试的装饰器,例如:

def debug_func(f):
    def wrapper(*func_args, **func_kwargs):
        print(f(*func_args, **func_kwargs))
    return wrapper
Run Code Online (Sandbox Code Playgroud)

这个想法是什么:如果我可以的话,这将是有用的

import Debug 
Run Code Online (Sandbox Code Playgroud)

并且当前模块的所有函数都将包含装饰器.可能吗?

Jim*_*son 3

在 Debug.py 中:

import functools
from types import FunctionType

def wrap_functions(module_dict):
    for k, f in module_dict.items():
        if not isinstance(f, FunctionType):
            continue
        def get_wrapper(f):
            def wrapper(*func_args, **func_kwargs):
                print(f(*func_args, **func_kwargs))
            return functools.wraps(f)(wrapper)
        module_dict[k] = get_wrapper(f)
Run Code Online (Sandbox Code Playgroud)

在您希望调试的模块底部:

import Debug
Debug.wrap_functions(globals())
Run Code Online (Sandbox Code Playgroud)

感谢 (+1) 所有提供建议的评论者。