将装饰器应用于函数似乎将其从模块 __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()
太宽了。
我在一个 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()
太宽了。