在运行时获取python装饰器参数

在运行时获取python装饰器参数,python,python-2.7,introspection,python-decorators,Python,Python 2.7,Introspection,Python Decorators,有没有什么方法可以在运行时获取装饰函数的参数?我正在从事的项目是巨大的,重写受影响的代码将是巨大的努力。我需要一个动态解决方案来列出分配给函数列表的所有“类别”。为此,我希望避免使用超级黑客解决方案,比如在我的所有模块中重新登录。这可以通过检查调用堆栈中的帧来完成吗 在我们的环境中,函数是对象方法,我们也使用链式装饰器。为了便于理解,我编写了这段代码 如果这是不可能的,我可以为项目的部分组成另一个装饰者,尽管这会增加更多的复杂性。但任何解决我的问题的建议都是受欢迎的 def check(*arg

有没有什么方法可以在运行时获取装饰函数的参数?我正在从事的项目是巨大的,重写受影响的代码将是巨大的努力。我需要一个动态解决方案来列出分配给函数列表的所有“类别”。为此,我希望避免使用超级黑客解决方案,比如在我的所有模块中重新登录。这可以通过检查调用堆栈中的帧来完成吗

在我们的环境中,函数是对象方法,我们也使用链式装饰器。为了便于理解,我编写了这段代码

如果这是不可能的,我可以为项目的部分组成另一个装饰者,尽管这会增加更多的复杂性。但任何解决我的问题的建议都是受欢迎的

def check(*args):
    # do something project relevant, so just return True
    return True

def decorate(*categories):
    def wrap(f):
        def wrap_check_categories(*args, **kwargs):
            if check(*categories):
                return f(*args, **kwargs)
            else:
                raise Exception
        return wrap_check_categories
    return wrap

def get_categories(f):
    '''Returns decorator parameters'''
    # ... do some magic here
    raise NotImplementedError

@decorate('foo', 'bar')
def fancy_func(*args, **kwargs):
    return args, kwargs

def main():
    ## should output ['foo', 'bar']
    print get_categories(fancy_func)

if __name__ == '__main__':
    main()

修改装饰器以将类别存储在装饰函数的属性(例如,
\u args
)中:

def check(*args):
    # do something project relevant, so just return True
    return True

def decorate(*categories):
    def wrap(f):
        def wrap_check_categories(*args, **kwargs):
            if check(*categories):
                return f(*args, **kwargs)
            else:
                raise Exception
        wrap_check_categories._args = categories    # <-- store the categories
        return wrap_check_categories
    return wrap

def get_categories(f):
    '''Returns decorator parameters'''
    # ... do some magic here
    return f._args

@decorate('foo', 'bar')
def fancy_func(*args, **kwargs):
    return args, kwargs

def main():
    ## should output ['foo', 'bar']
    print get_categories(fancy_func)

if __name__ == '__main__':
    main()
('foo', 'bar')