【问题标题】:Get decorated function object by string name通过字符串名称获取修饰函数对象
【发布时间】:2011-01-25 16:14:50
【问题描述】:
def log(func):
    def wraper(*a, **kw):   
        return func(*a, **kw)
    return wraper

@log
def f():
    print 'f'


print locals()['f'] # - prints <function wraper at 0x00CBF3F0>.

你如何获得真正的 f 对象(不是装饰器包装)?

【问题讨论】:

    标签: python string function decorator


    【解决方案1】:

    如果您运行的是 python 3.2 或更高版本,并且您使用 functools.wraps,那么您将在 __wrapped__ 属性上找到包装函数:

    from functools import wraps
    
    def log(func):
        @wraps(func)
        def wrapper(*a, **kw):
            return func(*a, **kw)
        return wrapper
    
    @log
    def f():
        print 'f'
    
    print f.__wrapped__
    

    functools.wraps是一个方便的函数,用于用完成所有工作的函数来装饰一个装饰函数,包括添加这个属性functools.update_wrapper

    【讨论】:

      【解决方案2】:

      functools 模块还提供了一个 wraps 装饰器,它确保包装的函数看起来更像真正的函数:例如,正确的名称、模块和文档字符串。

      【讨论】:

      • +1 这应该是公认的答案,因为functools.wraps 不仅仅是设置wrapper.func = func
      • 实际上,wraps 似乎并没有完全按照 OP 的要求做:它没有在某处保留原始功能。但可能是 OP 不想要这个功能,只需要一个属性。
      【解决方案3】:

      您不需要。1如果您以后需要访问它,请存储它。

      def log(func):
        def wrapper(*a, **kw):
          return func(*a, **kw)
        wrapper.func = func
        return wrapper
      
      @log
      def f():
        print 'f'
      
      print f.func
      

      1你可能会弄乱关闭,但我不能推荐它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-21
        • 2021-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多