将装饰器应用于函数似乎将其从模块 __dict__ 中删除

Applying decorator to function appears to remove it from module __dict__

我在一个 python 包中定义了几个函数,该包由多个模块组成,这些模块表示模拟模型的独立组件。

为了执行仿真模型,导入包并通过迭代模块的 __dict__ 提取函数及其 __name__,如下所示:

import model # The package containing python modules

import inspect
import types

# Get the modules defined in the package
modules = [v for v in vars(model).values() if isinstance(v, types.ModuleType)]

funcs = {}

# Iterate through modules in python package
for module in modules:
    # Go through objects in module `__dict__`
    for name, obj in vars(module).items():  # decorated functions no longer appear here
        # Check for functions
        if isinstance(obj, types.FunctionType):
            # Make sure that the function is defined within the model package
            mod, *sub_mod = inspect.getmodule(obj).__name__.split('.')
            if mod == model.__name__:
                # Store the function along with its name
                funcs[name] = obj

但是,当我调试这段代码时,我注意到一些应该在 vars(module).items() 中的函数却没有。这是在将 lru_cache 装饰器应用到某些函数之后发生的,这些函数正是那些没有出现的函数。

为什么在对 python 包中的某些函数应用装饰器后,它们没有出现在定义它们的模块的 __dict__ 中?

有没有办法仍然能够应用装饰器并让函数显示在 vars(module).items() 中?

问题是当你用lru_cache包装一个函数时,结果只是一个可调用对象,而不是一个函数。精确类型是functools._lru_cache_wrapper.

我最初是作为评论发布的。 pbreach 的解决方案是用 (types.FunctionType, functools._lru_cache_wrapper) 替换 types.FunctionType,因为 callable() 太宽了。