Python -在已经修饰过的函数中插入修饰符

dsf9zpds  于 2023-06-25  发布在  Python
关注(0)|答案(1)|浏览(124)

我已经研究了很多关于这一点,但无法找到一个答案。我基本上有一个现有的函数func1,它由my_dec1修饰。my_dec1接受参数为

  1. func1.py
  2. @my_dec1(a, b)
  3. def func1():
  4. ...

我有另一个装饰器my_dec2,并希望通过在my_dec1之前插入my_dec2来堆叠我的装饰器。因此,最终结果将实现如下相同的功能:

  1. main.py
  2. @my_dec1(a, b)
  3. @my_dec2
  4. def func1():
  5. ...

我的问题是,只有给定func1,我才能提取my_dec1并保存到某个变量中吗?如果没有,我可以提取传递给my_dec1的参数来重新创建装饰器吗?
然而,现在的挑战是,我想在不修改func1.py中任何原始源代码的情况下完成这项工作。

  1. main.py
  2. import func1
  3. unwrapped_func = func1.__wrapped__ # returns undecorated func1
  4. ??? # do something here to extract my_dec1 functionality from func1
  5. final = my_dec1(a, b)(my_dec2(unwrapped_func))
  6. final()
iqjalb3h

iqjalb3h1#

你不能这么做没有与函数关联的装饰器堆栈;回顾:

  1. @my_decorator
  2. def somefunc():
  3. ...

只是语法糖:

  1. def somefunc():
  2. ...
  3. somefunc = my_decorator(somefunc)

给定函数名somefunc,在这两种情况下都没有办法找出“原始函数”,以便在堆栈中“更早”注入装饰器。

相关问题