Python 如何使用decorator将函数的结果封装在多个外部库函数中

Python 如何使用decorator将函数的结果封装在多个外部库函数中,python,decorator,Python,Decorator,我最近才了解了装饰师,尽管我几乎阅读了所有关于这个问题的搜索结果,但我还是搞不懂。我只想定义一些函数calcx,y,并用一系列外部函数包装其结果,而不更改函数内部的任何内容,也不更改其在脚本中的调用,例如: @tan @sqrt def calc(x,y): return (x+y) ### calc(x,y) = tan(sqrt(calc(x,y)) ### Goal is to have every call of calc in the script automatically

我最近才了解了装饰师,尽管我几乎阅读了所有关于这个问题的搜索结果,但我还是搞不懂。我只想定义一些函数calcx,y,并用一系列外部函数包装其结果,而不更改函数内部的任何内容,也不更改其在脚本中的调用,例如:

@tan
@sqrt
def calc(x,y):
    return (x+y)

### calc(x,y) = tan(sqrt(calc(x,y))
### Goal is to have every call of calc in the script automatically nest like that. 
昨天我读了将近10个小时关于装饰师的书,我得到了一个强烈的印象,这就是他们的用武之地。我知道有多种方法可以修改函数之间的传递方式,但我找不到任何明显的指南来指导如何实现这一点。我读到也许functools包装可以用于此目的,但我也不明白这一点


这里的大部分愿望是能够快速、轻松地测试不同的函数如何修改其他函数的结果,而不必在括号之间冗长地包装函数。。。也就是说,为了避免完全弄乱括号,在自己的行中定义我的修饰符测试函数。

装饰器只是一个接受一个函数并返回另一个函数的函数

def tan(f):
    import math
    def g(x,y):
        return math.tan(f(x,y))
    return g

装饰器只是一个函数,它接受一个函数并返回另一个函数

def tan(f):
    import math
    def g(x,y):
        return math.tan(f(x,y))
    return g