gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:26 25 4
gpt4 key购买 nike

有没有什么方法可以在运行时获取装饰函数的参数?我正在进行的项目很大,重写受影响的代码需要付出巨大的努力。我需要一个动态解决方案来列出分配给函数列表的所有“类别”。为此,我想避免 super hacky 解决方案,比如通过我所有的模块进行正则表达式。这可以通过检查调用堆栈中的帧来完成吗?

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

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

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()

最佳答案

修 retrofit 饰器以将类别存储在装饰函数的属性(例如 _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')

关于python - 在运行时获取 python 装饰器参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34908212/

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