5

我有三个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?

4

2 回答 2

6

您可以通过以下方式访问预先装饰的功能:

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,装饰版本也是如此。

于 2012-02-10T03:12:34.860 回答
5

如果您只想保持原始函数名称从“外部”可见,我认为您可以使用

@functools.wraps

作为装饰者的装饰者

这是标准文档中的示例

>>> from functools import wraps
>>> def my_decorator(f):
...     @wraps(f)
...     def wrapper(*args, **kwds):
...         print('Calling decorated function')
...         return f(*args, **kwds)
...     return wrapper
...
>>> @my_decorator
... def example():
...     """Docstring"""
...     print('Called example function')
...
>>> example()
Calling decorated function
Called example function
>>> example.__name__
'example'
>>> example.__doc__
'Docstring'
于 2012-02-10T05:32:46.570 回答