gpt4 book ai didi

Python inspect.getmembers 在与装饰器一起使用时不返回实际函数

转载 作者:太空狗 更新时间:2023-10-30 00:37:05 32 4
gpt4 key购买 nike

我有三个 python 函数:

def decorator_function(func)
def wrapper(..)
return func(*args, **kwargs)
return wrapper

def plain_func(...)

@decorator_func
def wrapped_func(....)

在模块 A 中。

现在我想获取模块 A 中的所有函数,为此我这样做:

for fname, func in inspect.getmembers(A, inspect.isfunction):
# My code

这里的问题是 func 的值不是我想要的。

它将是 decorator_function、plain_func 和 wrapper(而不是 wrapped_func)。

如何确保返回 wrapped_func 而不是 wrapper?

最佳答案

您可以通过以下方式访问预装饰函数:

wrapped_func.func_closure[0].cell_contents()

例如,

def decorator_function(func):
def wrapper(*args, **kwargs):
print('Bar')
return func(*args, **kwargs)
return wrapper

@decorator_function
def wrapped_func():
print('Foo')

wrapped_func.func_closure[0].cell_contents()

打印

Foo    # Note, `Bar` was not also printed

但实际上,如果您知道要访问预先修饰的函数,那么定义起来会更清晰

def wrapped_func():
print('Foo')

deco_wrapped_func = decorator_function(wrapped_func)

所以 wrapped_func 将是预先装饰的功能,并且deco_wrapped_func 将是装饰版本。

关于Python inspect.getmembers 在与装饰器一起使用时不返回实际函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9222129/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com