我已经研究了很多关于这一点,但无法找到一个答案。我基本上有一个现有的函数func1,它由my_dec1修饰。my_dec1接受参数为
func1.py
@my_dec1(a, b)
def func1():
...
我有另一个装饰器my_dec2,并希望通过在my_dec1之前插入my_dec2来堆叠我的装饰器。因此,最终结果将实现如下相同的功能:
main.py
@my_dec1(a, b)
@my_dec2
def func1():
...
我的问题是,只有给定func1,我才能提取my_dec1并保存到某个变量中吗?如果没有,我可以提取传递给my_dec1的参数来重新创建装饰器吗?
然而,现在的挑战是,我想在不修改func1.py中任何原始源代码的情况下完成这项工作。
main.py
import func1
unwrapped_func = func1.__wrapped__ # returns undecorated func1
??? # do something here to extract my_dec1 functionality from func1
final = my_dec1(a, b)(my_dec2(unwrapped_func))
final()
1条答案
按热度按时间iqjalb3h1#
你不能这么做没有与函数关联的装饰器堆栈;回顾:
只是语法糖:
给定函数名
somefunc
,在这两种情况下都没有办法找出“原始函数”,以便在堆栈中“更早”注入装饰器。