0

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

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

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()

4

1 回答 1

1

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

我最初将此作为评论发布。pbreach 的解决方案是替换types.FunctionType(types.FunctionType, functools._lru_cache_wrapper),因为callable()网络太广泛了。

于 2017-01-04T21:41:13.983 回答