代码之家  ›  专栏  ›  技术社区  ›  chickeninabiscuit

在python 2.5中,是否可以使用反射来检查函数的修饰符?

  •  2
  • chickeninabiscuit  · 技术社区  · 15 年前

    这就是我想做的:

    @MyDecorator
    def f():
       pass
    
    for d in f.decorators:
       print d
    
    2 回复  |  直到 15 年前
        1
  •  3
  •   aaronasterling    15 年前

    没有装饰师的配合,这通常是不可能的。例如,

    def my_decorator(f):
         def wrapper(*args, **kwargs):
             return f(*args, **kwargs)
         wrapper.decorators = [wrapper]
         if hasattr(f, 'decorators'):
             wrapper.decorators.extend[f.decorators]
         return wrapper
    

    本质上,decorator所做的就是像往常一样包装函数,然后在包装函数上放置decorators属性。然后,它检查包装后的函数是否有类似的列表,并向上传播它。

    不过,这很没用

    我什么 认为 你想要的是

    def my_decorator(f):
           def wrapper(args):
               return f(args)
          wrapper.decorated = f
          return wrapper
    

    这样你就可以做

    @my_other_decorator # another decorator following the same pattern
    @my_decorator
    def foo(args):
        print args
    
    foo.decorated(args) # calls the function with the inner decorated function (my_decorator)
    foo.decorated.decorated(args) # original function
    

    实际上,您可以将此模式抽象为一个装饰器

    def reversable(decorator):
        def wrapper(func):
            ret = decorator(func) # manually apply the decorator
            ret.decorated = func # save the original function
            return ret
        return wrapper
    

    现在,当你写你的装饰:

    @reversable
    def my_decorator(f):
        def wrapper(x):
            return f(x + 1)
        return wrapper
    
        2
  •  1
  •   Community Mohan Dere    9 年前

    这个 @MyDecorator 语法只是编写以下python代码的简写:

    def f():
      pass
    f = MyDecorator(f)
    

    在这个表单中,您可以看到应用于函数的修饰符不会以任何方式被跟踪。你 能够 让你的装饰师记住什么时候用的 (Aaron's answer 在如何做这件事上有几个好主意),但是你必须用你自己的东西来包装所有的第三方装饰师。